diff --git a/app.vue b/app.vue index 16c72fe1a9e..35c54d62e5c 100644 --- a/app.vue +++ b/app.vue @@ -24,11 +24,8 @@ href: "/favicon-192x192.png", }, ], - titleTemplate: (titleChunk) => { - return titleChunk && - titleChunk != "Kestra, Open Source Declarative Data Orchestration" - ? `${titleChunk}` - : "Kestra, Open Source Declarative Data Orchestration"; + titleTemplate: (titleChunk: string | undefined) => { + return titleChunk ?? "Kestra, Open Source Declarative Data Orchestration"; }, }); diff --git a/assets/styles/app.scss b/assets/styles/app.scss index 69890fe2d05..550bb3c4110 100644 --- a/assets/styles/app.scss +++ b/assets/styles/app.scss @@ -5,6 +5,10 @@ html { scroll-padding-top: var(--top-bar-height); } +pre { + color: white; +} + body { min-width: 320px; min-height: 100%; diff --git a/assets/styles/components/header.scss b/assets/styles/components/header.scss index 237f705c9df..fb7384472c7 100644 --- a/assets/styles/components/header.scss +++ b/assets/styles/components/header.scss @@ -335,6 +335,8 @@ nav { transform: translateY(0); max-height: 100%; width: 100vw; + background-color: $menu-bg; + transition: background-color 250ms ease-in-out; @keyframes chevron-in { 0% { @@ -363,16 +365,7 @@ nav { &.open { @supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { & { - background-color: $menu-bg; - transition: background-color 250ms ease-in-out; - } - } - - &.open { - @supports (-webkit-backdrop-filter: none) or (backdrop-filter: none) { - & { - background-color: $white; - } + background-color: $white; } } } diff --git a/assets/styles/docs.scss b/assets/styles/docs.scss index a7ded27e05e..f989cf741d7 100644 --- a/assets/styles/docs.scss +++ b/assets/styles/docs.scss @@ -196,6 +196,7 @@ $bd-gutter-x: 3rem; } .bd-content { + #{--bs-heading-color}: white; grid-area: content; min-width: 1px; // Fix width when bd-content contains a `
` https://github.com/twbs/bootstrap/issues/25410 @@ -235,7 +236,7 @@ $bd-gutter-x: 3rem; @media only screen and (max-width: 768px) { padding-bottom: 56.25%; - + iframe { width: 100%; height: 100%; @@ -292,14 +293,13 @@ $bd-gutter-x: 3rem; } code { - background: #161617; border: 1px solid #252526; border-radius: var(--bs-border-radius); color: #b9b9ba; padding: 0 .25rem; } - .code-block, .doc-alert { + .code-block, .doc-alert, .astro-code { background-color: $black-2; code { border: 0; @@ -307,13 +307,123 @@ $bd-gutter-x: 3rem; } } - .code-block { + .code-block, .astro-code { code { padding: 0; } } - .doc-alert { + @import "../../assets/styles/_variable.scss"; + + .astro-code { + background-color: $black-2; border: $block-border; + padding: 1.25rem 1.5rem; + border-radius: var(--bs-border-radius-lg); + color: var(--bs-white); + position: relative; + margin-bottom: 1em; + overflow: hidden; + code .line { + white-space: pre-wrap; + } + + .language { + font-size: 0.75rem; + } + + .language, .copy { + color: var(--kestra-io-neutral-gray700) !important; + position: absolute; + top: 1.25rem; + right: 1.25rem; + } + + .copy { + border: none; + background: none; + + & .material-design-icon { + &, & * { + height: 1.125rem !important; + width: 1.125rem !important; + } + } + } + + #copied-tooltip { + border-radius: $border-radius; + background: $gray-500; + padding: 4px 8px; + font-size: $font-size-xs; + margin-right: $popper-margin !important; + + #arrow, + #arrow::before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; + } + + #arrow { + visibility: hidden; + right: -4px; + } + + #arrow::before { + visibility: visible; + content: ''; + transform: rotate(45deg); + } + } + } + + .doc-alert { + border: 1px solid; + border-left-width: 5px !important; + padding: 1rem; + margin-bottom: 1rem; + border-radius: 0.25rem; + + > * { + margin: 0; + } + &.alert-danger { + border-color: var(--ks-border-error); + color: var(--ks-content-error); + background-color: var(--ks-background-error); + } + + &.alert-warning { + border-color: var(--ks-border-warning); + color: var(--ks-content-warning); + background-color: var(--ks-background-warning); + } + + &.alert-info { + border-color: var(--ks-border-info); + color: var(--ks-content-info); + background-color: var(--ks-background-info); + } + + &.alert-success { + border-color: var(--ks-border-success); + color: var(--ks-content-success); + background-color: var(--ks-background-success); + } + } + + .ks-doc-next-link{ + &:hover { + a, a:hover { + color: var(--bs-white) !important; + } + } + + p { + display: inline; + margin-bottom: 0 !important; + } } } \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 00000000000..367ef4b682c --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,73 @@ +// @ts-check +import { defineConfig } from 'astro/config'; + +import * as path from 'path'; +import cloudflare from '@astrojs/cloudflare'; +import vue from '@astrojs/vue'; +import mdx from '@astrojs/mdx'; +import expressiveCode from 'astro-expressive-code'; + +import remarkDirective from 'remark-directive'; +// @ts-expect-error no types provided by package +import remarkLinkRewrite from 'remark-link-rewrite'; +import remarkCustomElements from './utils/remark-custom-elements/index.mjs'; +import generateId from './utils/generateId'; + +const __dirname = path.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1')); + +// https://astro.build/config +export default defineConfig({ + adapter: cloudflare({ + imageService: 'cloudflare' + }), + + integrations: [ + vue({ + appEntrypoint: './src/_main.ts' + }), + expressiveCode({ + defaultProps: { + wrap: true, + overridesByLang: { + 'bash,sh,zsh,shell': { + frame: 'none', + } + } + } + }), + mdx() + ], + markdown: { + remarkPlugins: [ + remarkDirective, + remarkCustomElements, + // when internal docs links we point to real files + // while in the docs generated we want to point to urls with generated ids + [remarkLinkRewrite, { + /** @param {string} url */ + replacer(url) { + if (url.startsWith('.')) { + return generateId({entry: url}) + } + return url; + } + }] + ] + }, + vite: { + resolve:{ + alias: { + "#mdc-imports": path.resolve(__dirname, "node_modules/@kestra-io/ui-libs/stub-mdc-imports.js"), + "#mdc-configs": path.resolve(__dirname, "node_modules/@kestra-io/ui-libs/stub-mdc-imports.js"), + }, + }, + css: { + preprocessorOptions: { + scss: { + // silence invasive bootstrap warnings + silenceDeprecations: ["color-functions", "global-builtin", "import"], + }, + }, + }, + }, +}); \ No newline at end of file diff --git a/components/ai/AiChatHeader.vue b/components/ai/AiChatHeader.vue index e26a58007a2..6d131c15ffd 100644 --- a/components/ai/AiChatHeader.vue +++ b/components/ai/AiChatHeader.vue @@ -1,7 +1,7 @@@@ -61,6 +61,7 @@ import Keyboard from "vue-material-design-icons/Keyboard.vue" import Menu from "vue-material-design-icons/Menu.vue" import RecursiveNavSidebar, { activeSlugInjectionKey, type NavigationItem } from "./RecursiveNavSidebar.vue"; + import KSAIImg from "@assets/docs/icons/ks-ai.svg" const props = defineProps({ type: { @@ -235,8 +236,6 @@ font-size: calc($font-size-base * 0.62); } } - - } } diff --git a/components/docs/NavToc.vue b/components/docs/NavToc.vue index a090c378be4..3c73afd1259 100644 --- a/components/docs/NavToc.vue +++ b/components/docs/NavToc.vue @@ -42,7 +42,7 @@ @@ -51,6 +51,7 @@ + + \ No newline at end of file diff --git a/components/home/CTA.vue b/components/home/CTA.vue index 097b02a71dc..77dfb16783d 100644 --- a/components/home/CTA.vue +++ b/components/home/CTA.vue @@ -19,6 +19,9 @@ + \ No newline at end of file diff --git a/components/home/EnterpriseStories.vue b/components/home/EnterpriseStories.vue index 5f69af19557..13592acf144 100644 --- a/components/home/EnterpriseStories.vue +++ b/components/home/EnterpriseStories.vue @@ -18,9 +18,9 @@-@@ -21,6 +21,7 @@ - - + \ No newline at end of file diff --git a/components/content/BigChildCardsRender.vue b/components/content/BigChildCardsRender.vue new file mode 100644 index 00000000000..9d5e75d0929 --- /dev/null +++ b/components/content/BigChildCardsRender.vue @@ -0,0 +1,67 @@ + + ++ Ask Kestra AI
{{title}}
+++ + + + + diff --git a/components/content/ChildCard.vue b/components/content/ChildCard.vue index 66905abf246..7658daa86bd 100644 --- a/components/content/ChildCard.vue +++ b/components/content/ChildCard.vue @@ -57,12 +57,6 @@ `ChildCardCurrentPage-${hash(currentPageSlug)}`, () => queryCollection(CollectionNames.docs).path(currentPageSlug).first() ); - - // if (currentPage == "/docs/faq") { - // navigation.value = navigation.value.map(item => { - // return { ...item, icon: item.icon ? item.icon : '/docs/icons/faq.svg'} - // }) - // } \ No newline at end of file + \ No newline at end of file diff --git a/components/content/WhatsNewRender.vue b/components/content/WhatsNewRender.vue new file mode 100644 index 00000000000..7e43070e59f --- /dev/null +++ b/components/content/WhatsNewRender.vue @@ -0,0 +1,102 @@ + ++ +{{ item.title }}
+{{ item.description }}
+++ + + + + \ No newline at end of file diff --git a/components/docs/NavSideBar.vue b/components/docs/NavSideBar.vue index 0c071d35592..7d516d14410 100644 --- a/components/docs/NavSideBar.vue +++ b/components/docs/NavSideBar.vue @@ -18,7 +18,7 @@ data-bs-toggle="modal" data-bs-target="#search-ai-modal" > -{{title}}
++ ++
++ + ++
+++ {{ post.category }} + {{ dateTimeFormat.format(new Date(post.date)) }} ++{{ post.title }}
++
Ask Kestra AI
- @@ -31,12 +31,17 @@ diff --git a/components/home/Experience.vue b/components/home/Experience.vue index 69a5123d874..49e39a53f6f 100644 --- a/components/home/Experience.vue +++ b/components/home/Experience.vue @@ -21,6 +21,8 @@ diff --git a/components/home/FeaturesBlock.vue b/components/home/FeaturesBlock.vue index 7119a0e38b2..878cd3719bc 100644 --- a/components/home/FeaturesBlock.vue +++ b/components/home/FeaturesBlock.vue @@ -38,6 +38,7 @@ \ No newline at end of file diff --git a/components/home/Quotes.vue b/components/home/Quotes.vue index f27508ba4f8..fe47e36774e 100644 --- a/components/home/Quotes.vue +++ b/components/home/Quotes.vue @@ -12,12 +12,20 @@ \ No newline at end of file diff --git a/components/price/Slider.vue b/components/price/Slider.vue index 233e5ca1d46..a368a996427 100644 --- a/components/price/Slider.vue +++ b/components/price/Slider.vue @@ -115,7 +115,7 @@ message: "Kestra enables the entire team, even non-technical members, to understand the benefits and contribute. I’ve onboarded people, created blueprints, and set them up to build their own workflows.", name: "John Kim", designation: "Manager Corporate Strategy", - alt: " Manager Corporate Strategy", + alt: "Manager Corporate Strategy", }, ], }; diff --git a/components/stories/StoriesList.vue b/components/stories/StoriesList.vue index 5f36c9a9333..40b2d8c5e2f 100644 --- a/components/stories/StoriesList.vue +++ b/components/stories/StoriesList.vue @@ -53,6 +53,7 @@ const changePage = () => { window.scrollTo(0, 0) fetchPageData() } + const fetchPageData = () => { emits('fetchPageData', { currentPage: currentPage.value, itemsPerPage: itemsPerPage.value }) } diff --git a/components/terraform/Header.vue b/components/terraform/Header.vue index 3de6f83217e..3000f43e498 100644 --- a/components/terraform/Header.vue +++ b/components/terraform/Header.vue @@ -3,7 +3,7 @@ -Kestra Terraform Provider:
+Kestra Terraform Provider:
Deploy All Your Workflows With our Terraform Provider
Manage and deploy Kestra workflows directly within your existing Terraform environment, eliminating the need for separate configurations.
diff --git a/composables/useApi.js b/composables/useApi.ts similarity index 50% rename from composables/useApi.js rename to composables/useApi.ts index 791b194a270..950033e154d 100644 --- a/composables/useApi.js +++ b/composables/useApi.ts @@ -1,6 +1,13 @@ import axios from 'axios' export const useApi = () => { + // @ts-ignore + if (typeof useRuntimeConfig === 'undefined') { + return axios.create({ + baseURL: "https://api.kestra.io/v1" + }) + } + // @ts-ignore const runtimeConfig = useRuntimeConfig() return axios.create({ diff --git a/composables/useBlueprintsList.js b/composables/useBlueprintsList.js index ad5c55d0fc7..df6f975dd58 100644 --- a/composables/useBlueprintsList.js +++ b/composables/useBlueprintsList.js @@ -1,6 +1,5 @@ export async function useBlueprintsList({ page = 1, size = 24, tags = '', q = '' } = {}) { - const config = useRuntimeConfig(); - let apiUrl = `${config.public.apiUrl}/blueprints/versions/latest?page=${page}&size=${size}`; + let apiUrl = `https://api.kestra.io/v1/blueprints/versions/latest?page=${page}&size=${size}`; if (tags) { apiUrl += `&tags=${tags}`; } diff --git a/composables/usePluginsCount.ts b/composables/usePluginsCount.ts index 0ffbaeaedc4..e4406fff2eb 100644 --- a/composables/usePluginsCount.ts +++ b/composables/usePluginsCount.ts @@ -1,7 +1,8 @@ import type { Plugin, PluginElement } from "@kestra-io/ui-libs"; import { isEntryAPluginElementPredicate } from "@kestra-io/ui-libs"; +import { computed, ref, type Ref } from "vue"; -function calculateTotalPlugins(plugins: Plugin[]): number { +export function calculateTotalPlugins(plugins: Plugin[]): number { const classes = new Set(); plugins.forEach(plugin => { @@ -15,10 +16,23 @@ function calculateTotalPlugins(plugins: Plugin[]): number { return classes.size; } -export const usePluginsCount = () => { - const { data: plugins, error, status } = useFetch ( - `${useRuntimeConfig().public.apiUrl}/plugins/subgroups` - ); +export const usePluginsCount = (pluginsRef?: Ref ) => { + let plugins = pluginsRef + const status = ref ("") + if( !plugins ) { + plugins = ref ([]) + // Fetch plugins data if not available + fetch("https://api.kestra.io/v1/plugins/subgroups") + .then(r => { + status.value = r.status === 200 ? "success" : "error" + return r.json() + }) + .then(data => { + if (plugins) { + plugins.value = data as unknown as Plugin[]; + } + }); + } const totalPlugins = computed(() => { if (!plugins.value) return "0+"; @@ -27,5 +41,5 @@ export const usePluginsCount = () => { return `${rounded}+`; }); - return { totalPlugins, plugins, error, status }; + return { totalPlugins, plugins }; }; \ No newline at end of file diff --git a/content.config.names.ts b/content.config.names.ts deleted file mode 100644 index 1c9958d2e8f..00000000000 --- a/content.config.names.ts +++ /dev/null @@ -1,17 +0,0 @@ -import slugifyLib from "slugify"; - -export function slugify(text:string) { - return slugifyLib(text, { - lower: true, - locale: 'en', - remove: /[^0-9a-zA-Z_]/g - }); -} - -export const contentPrefix = process.env.CF_PAGES_BRANCH && process.env.CF_PAGES_BRANCH !== 'main' ? `c${slugify(process.env.CF_PAGES_BRANCH)}_` : '' - -export const CollectionNames = { - docs: `${contentPrefix}docs`, - blogs: `${contentPrefix}blogs`, - misc: `${contentPrefix}misc` -} as const \ No newline at end of file diff --git a/content.config.ts b/content.config.ts deleted file mode 100644 index 52c119750d2..00000000000 --- a/content.config.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { defineContentConfig, defineCollection, z } from '@nuxt/content' -import { CollectionNames } from './content.config.names' - -export default defineContentConfig({ - collections: { - [CollectionNames.docs]: defineCollection({ - type: 'page', - source: 'docs/**/*.md', - schema: z.object({ - title: z.string(), - icon: z.string(), - release: z.string().optional(), - version: z.string().optional(), - editions: z.array(z.enum(["OSS", "EE"])).optional(), - topics: z.array(z.string()).optional(), - stage: z.string().optional(), - hideSubMenus: z.boolean().optional(), - deprecated: z.object({ - since: z.string(), - migrationGuide: z.string(), - }).optional(), - }) - }), - [CollectionNames.blogs]: defineCollection({ - type: 'page', - source: 'blogs/**/*.md', - schema: z.object({ - date: z.date(), - category: z.string(), - author: z.object({ - name: z.string(), - image: z.string(), - twitter: z.string().optional(), - role: z.string().optional(), - }).optional(), - authors: z.array(z.object({ - name: z.string(), - image: z.string(), - twitter: z.string().optional(), - role: z.string(), - })).optional(), - image: z.string(), - }) - }), - [CollectionNames.misc]: defineCollection({ - type: 'page', - source: '*.md', - }), - } -}) \ No newline at end of file diff --git a/content/docs/index.md b/content/docs/index.md deleted file mode 100644 index c21c199cd7d..00000000000 --- a/content/docs/index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Welcome to Kestra -isHomepage: true ---- - -:::HomePageHeader{title="What is Kestra?"} -::: -Kestra is an open-source, infinitely-scalable **orchestration platform** that enables all engineers to manage **business-critical workflows** declaratively in code. - -Thanks to :PluginCount plugins and embedded Code editor with Git and Terraform integrations, Kestra makes scheduled and event-driven workflows easy. - -:::HomePageButtons{ :buttons='[{"label": "Quickstart →", "href": "/docs/getting-started/quickstart#start-kestra"},{"label": "Why Kestra?","href": "/docs/why-kestra"},{"label": "Why Enterprise Edition?","href": "/docs/oss-vs-paid"}]'} -::: - - -:::BigChildCards{directory="/docs/use-cases" title="What’s possible with Kestra"} -::: - - - - -- -:::WhatsNew{title="What's New in Kestra"} -::: - -:::SupportLinks{title="Support"} -::: \ No newline at end of file diff --git a/data/enterprise-quotes.json b/data/enterprise-quotes.json index d047adab509..b3dfe2c5a4c 100644 --- a/data/enterprise-quotes.json +++ b/data/enterprise-quotes.json @@ -1,6 +1,6 @@ [ { - "quote": "This tool is an absolute game changer for Orchestration: the UI, build quality, architecture and features are top notch. It's by far the easiest tool I've ever set-up, thanks to the excellent documentation and rapid response. It's already revolutionising the way my team works.", + "text": "This tool is an absolute game changer for Orchestration: the UI, build quality, architecture and features are top notch. It's by far the easiest tool I've ever set-up, thanks to the excellent documentation and rapid response. It's already revolutionising the way my team works.", "author": { "name": "Arthur Mills", "title": "Senior Data Engineer", @@ -9,7 +9,7 @@ "logo": "/landing/home/quotes-companies/EssenceMediacom.svg" }, { - "quote": "Kestra is the unifying layer for our data and workflows. You can start small, but then there is no limit to the possibilities and scalability of such an open architecture.", + "text": "Kestra is the unifying layer for our data and workflows. You can start small, but then there is no limit to the possibilities and scalability of such an open architecture.", "author": { "name": "Julien Henrion", "title": "Head of Data Engineering", @@ -18,7 +18,7 @@ "logo": "/landing/home/quotes-companies/LeroyMerlin.svg" }, { - "quote": "Companies typically don't like to share their secret weapon but everyone in the data world needs to know about Kestra. It has been a pivotal part of giving us flexibility and scalability we need to pull off complex processes we do at Foundation Direct.", + "text": "Companies typically don't like to share their secret weapon but everyone in the data world needs to know about Kestra. It has been a pivotal part of giving us flexibility and scalability we need to pull off complex processes we do at Foundation Direct.", "author": { "name": "Michael Heidner", "title": "SVP of Analytics and Business Intelligence", @@ -27,7 +27,7 @@ "logo": "/landing/home/quotes-companies/Foundation.svg" }, { - "quote": "The main advantage I see in Kestra is the use of YAML for creating flexible workflows. This allows us to chain pieces of metadata together dynamically, and the user-friendly UI helps our internal users create simple-to-understand inputs for the data pipelines we develop", + "text": "The main advantage I see in Kestra is the use of YAML for creating flexible workflows. This allows us to chain pieces of metadata together dynamically, and the user-friendly UI helps our internal users create simple-to-understand inputs for the data pipelines we develop", "author": { "name": "Kyle Hanson", "title": "Lead Software Engineer", @@ -36,7 +36,7 @@ "logo": "/landing/home/quotes-companies/Acxiom.svg" }, { - "quote": "We're convinced we chose the right tool. The support and communication are great. Kestra adapts to any tool thanks to its plugins, and it's easy for anyone to understand.", + "text": "We're convinced we chose the right tool. The support and communication are great. Kestra adapts to any tool thanks to its plugins, and it's easy for anyone to understand.", "author": { "name": "Ruben Boniz Martinez", "title": "Team Leader", @@ -45,7 +45,7 @@ "logo": "/landing/home/quotes-companies/quadis.svg" }, { - "quote": "Kestra is like the Wizard of Oz Wizard, doing its magic behind the curtain", + "text": "Kestra is like the Wizard of Oz Wizard, doing its magic behind the curtain", "author": { "name": "Amy King", "title": "Cybersecurity & Technology Controls", @@ -54,7 +54,7 @@ "logo": "/landing/home/quotes-companies/JP-Morgan-Chase-Co.svg" }, { - "quote": "I'm very impressed with what your team has here in Kestra. I moved some of my automated jobs over from Apache NIFI to Kestra. Kestra is way easier to work with because of everything being in the UI.", + "text": "I'm very impressed with what your team has here in Kestra. I moved some of my automated jobs over from Apache NIFI to Kestra. Kestra is way easier to work with because of everything being in the UI.", "author": { "name": "Jake Kruse", "title": "Associate System Consultant", @@ -63,7 +63,7 @@ "logo": "/landing/home/quotes-companies/Union-Pacific-RailRoad.svg" }, { - "quote": "I ported 80% of the prefect workflow in about a week to kestra, learing the syntax as i go […] yeah the yaml definitions make it super approachable.", + "text": "I ported 80% of the prefect workflow in about a week to kestra, learing the syntax as i go […] yeah the yaml definitions make it super approachable.", "author": { "name": "Leon Jacobs", "title": "Purple Team Cybersecurity", @@ -72,7 +72,7 @@ "logo": "/landing/home/quotes-companies/Orange.svg" }, { - "quote": "I enjoy the overall robustness of Kestra, which allows for processing data at scale in cloud environments and ensures the reproducibility of processes. Its strong observability, ease of development, and flexibility make it a versatile solution for managing data pipelines, including those in the field of genomics.", + "text": "I enjoy the overall robustness of Kestra, which allows for processing data at scale in cloud environments and ensures the reproducibility of processes. Its strong observability, ease of development, and flexibility make it a versatile solution for managing data pipelines, including those in the field of genomics.", "author": { "name": "Yohann Nédélec", "title": "Bioinformatician", @@ -81,7 +81,7 @@ "logo": "/landing/home/quotes-companies/Sophia-Genetics.svg" }, { - "quote": "I've been using Kestra on data projects at Sopht, also a french company, and it's been amazing for data processes. The declarative approach really works well for easy scalable contexts.", + "text": "I've been using Kestra on data projects at Sopht, also a french company, and it's been amazing for data processes. The declarative approach really works well for easy scalable contexts.", "author": { "name": "Lirav Duvashni", "title": "CEO", @@ -90,7 +90,7 @@ "logo": "/landing/home/quotes-companies/DataFlooder.svg" }, { - "quote": "Kestra’s UI and speed of development is brilliant. Very quick to prototype a new pipeline, continuously iterate, and test things out. Love the replay feature. It has very clear separation of pipeline and processing code.", + "text": "Kestra’s UI and speed of development is brilliant. Very quick to prototype a new pipeline, continuously iterate, and test things out. Love the replay feature. It has very clear separation of pipeline and processing code.", "author": { "name": "Ollie Steiner", "title": "Senior Data Engineer", @@ -99,7 +99,7 @@ "logo": "/landing/home/quotes-companies/Vyoma-Space.svg" }, { - "quote": "I’ve been really enjoying Kestra! It’s been much simpler to use than building Airflow DAGs or using Prefect, the plugins are incredibly handy.", + "text": "I’ve been really enjoying Kestra! It’s been much simpler to use than building Airflow DAGs or using Prefect, the plugins are incredibly handy.", "author": { "name": "Sophia Alice", "title": "Senior Data Engineer", @@ -108,7 +108,7 @@ "logo": "/landing/home/quotes-companies/Political-Data.svg" }, { - "quote": "Kestra is becoming mission critical.", + "text": "Kestra is becoming mission critical.", "author": { "name": "Ernesto Vargas", "title": "CTO", @@ -117,7 +117,7 @@ "logo": "/landing/home/quotes-companies/Mattilda.svg" }, { - "quote": "The exceptional pre-sales support and commitment to providing a high-performance product have laid the foundation for a great partnership.", + "text": "The exceptional pre-sales support and commitment to providing a high-performance product have laid the foundation for a great partnership.", "author": { "name": "Pattrick Ferreira", "title": "Product Manager", @@ -126,7 +126,7 @@ "logo": "/landing/home/quotes-companies/CleverConnect.svg" }, { - "quote": "Kestra is the first exciting thing I’ve seen in a long time.I’ve spent a huge part of my career looking for a solution that handle huge data sets.", + "text": "Kestra is the first exciting thing I’ve seen in a long time.I’ve spent a huge part of my career looking for a solution that handle huge data sets.", "author": { "name": "Michael Reynolds", "title": "Lead Research Engineer", @@ -135,7 +135,7 @@ "logo": "/landing/home/quotes-companies/TwoSix.svg" }, { - "quote": "Thank you for your hard work in creating this good software. It is beginner friendly and easy to customize.", + "text": "Thank you for your hard work in creating this good software. It is beginner friendly and easy to customize.", "author": { "name": "Daniel Theodorus", "title": "IT Project Manager", @@ -144,7 +144,7 @@ "logo": "/landing/home/quotes-companies/Airpaz.svg" }, { - "quote": "I'd like to say the product is fantastic! I love it so far! […] With Kestra we run git pull, build dbt models, and run Elementary reports and send a notification over Slack for the Elementary report, and it’s a breeze!", + "text": "I'd like to say the product is fantastic! I love it so far! […] With Kestra we run git pull, build dbt models, and run Elementary reports and send a notification over Slack for the Elementary report, and it’s a breeze!", "author": { "name": "Ohad Srur", "title": "Co-Founder", @@ -153,7 +153,7 @@ "logo": "/landing/home/quotes-companies/EduBIAnalytics.svg" }, { - "quote": "Kestra is an easy-to-learn, feature-rich platform for a wide variety of use cases. Its web interface simplifies flows and logs monitoring. ", + "text": "Kestra is an easy-to-learn, feature-rich platform for a wide variety of use cases. Its web interface simplifies flows and logs monitoring. ", "author": { "name": "Mourad Bouloussa", "title": "Principal Engineer", @@ -162,7 +162,7 @@ "logo": "/landing/home/quotes-companies/SopraSteria.svg" }, { - "quote": "Kestra meets the needs perfectly, it’s very simple to use and manages the complexities behind it to offer a huge saving in time and costs.", + "text": "Kestra meets the needs perfectly, it’s very simple to use and manages the complexities behind it to offer a huge saving in time and costs.", "author": { "name": "Oussama Bakkali", "title": "Data Engineer", @@ -171,7 +171,7 @@ "logo": "/landing/home/quotes-companies/ADEOServices.svg" }, { - "quote": "Easy to use and very powerful, it does everything I need, and orchestrating flows has never been easier.", + "text": "Easy to use and very powerful, it does everything I need, and orchestrating flows has never been easier.", "author": { "name": "Fares Daoud", "title": "Data Engineer", @@ -180,7 +180,7 @@ "logo": "/landing/home/quotes-companies/Decathlon.svg" }, { - "quote": "With Kestra, I got started in minutes, no complex deployment, no rate limits, no lock-in to Python. Triggers, logs, multi-language support, it all just works. Compared to Prefect, Kestra feels like everything is in the right place.", + "text": "With Kestra, I got started in minutes, no complex deployment, no rate limits, no lock-in to Python. Triggers, logs, multi-language support, it all just works. Compared to Prefect, Kestra feels like everything is in the right place.", "author": { "name": "John Sturgeon", "title": "Software Engineer", @@ -189,7 +189,7 @@ "logo": "/landing/home/quotes-companies/Apple.svg" }, { - "quote": "Kestra is really capable of supporting the growth of the company thanks to complete and controlled scalability!", + "text": "Kestra is really capable of supporting the growth of the company thanks to complete and controlled scalability!", "author": { "name": "Alexandre Millet-Bassez", "title": "Senior Data Manager", @@ -198,7 +198,7 @@ "logo": "/landing/home/quotes-companies/Ntico.svg" }, { - "quote": "Kestra has changed how we handle data orchestration. Instead of spending days fixing issues, we now have full visibility and control. As we scale, having a system that grows with us is invaluable", + "text": "Kestra has changed how we handle data orchestration. Instead of spending days fixing issues, we now have full visibility and control. As we scale, having a system that grows with us is invaluable", "author": { "name": "John Kim", "title": "IT Lead", @@ -207,7 +207,7 @@ "logo": "/landing/home/quotes-companies/Fila.svg" }, { - "quote": "I don't want my teams to have to write Python. That's why I'm more interested in Kestra than Airflow", + "text": "I don't want my teams to have to write Python. That's why I'm more interested in Kestra than Airflow", "author": { "name": "", "title": "Cybersecurity & Technology Controls", diff --git a/layouts/default.vue b/layouts/default.vue index 13cd009419a..2f324526238 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -4,7 +4,7 @@ -+ @@ -23,6 +23,8 @@ const scrolled = ref(false) provide(linkSymbolInjectionKey, NuxtLink) + const transparentHeader = computed(() => route.meta.transparentHeader === true) + const {data: bannerMessages} = await useCachedAsyncData<{results: Record }>( `header-annonces`, () => { diff --git a/nuxt.config.ts b/nuxt.config.ts deleted file mode 100644 index c71b6d6e52c..00000000000 --- a/nuxt.config.ts +++ /dev/null @@ -1,403 +0,0 @@ -import * as sass from "sass"; -import { CollectionNames } from "./content.config.names"; - -const DEFAULT_KESTRA_API_URL = 'https://api.kestra.io/v1'; - -export default defineNuxtConfig({ - modules: [ - '@nuxt/devtools', - '@nuxt/image', - 'nuxt-multi-cache', - 'vue3-carousel-nuxt', - 'nuxt-lazy-hydrate', - 'nuxt-aos', - '@saslavik/nuxt-gtm', - '@nuxtjs/sitemap', - '@nuxtjs/robots', - '@nuxt/content', - "nitro-cloudflare-dev", - ], - image: { - dir: 'public', - provider: process.env.CF_PAGES_BRANCH === 'main' ? 'cloudflare' : 'ipx', - format: ['webp', 'avif', 'png'], - cloudflare: { - modifiers: { - format: 'webp' - }, - }, - ipx: { - modifiers: { - format: 'webp' - }, - }, - quality: 80, - densities: [1, 2], - domains: ['kestra.io', '*.kestra-io.pages.dev'], - }, - sitemap: { - sitemaps: { - default: { - includeAppSources: true, - sources: ['/api/sitemap'] - }, - plugins: { - sources: ['/api/sitemap'] - }, - blueprints: { - sources: ['/api/sitemap'] - } - }, - }, - - app: { - baseURL: "/", - // pageTransition: {name: 'page', mode: 'out-in'} - head: { - link: [ - {rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png'}, - {rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png'}, - {rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png'}, - {rel: 'manifest', href: '/site.webmanifest'}, - {rel: 'mask-icon', href: '/safari-pinned-tab.svg', color: '#2c0059'}, - {name: 'msapplication-TileColor', content: '#2c0059'}, - {rel: 'sitemap', type: 'application/xml', href: '/sitemap.xml', title: 'Sitemap'}, - {rel: 'alternate', type: 'application/rss+xml', href: '/rss.xml', title: 'Blog Articles RSS'}, - {rel: 'preconnect', href: 'https://fonts.gstatic.com'}, - {rel: 'preconnect', href: 'https://fonts.googleapis.com'}, - {rel: 'dns-prefetch', href: 'https://eu.i.posthog.com'}, - {rel: 'dns-prefetch', href: 'https://js-eu1.hs-scripts.com'}, - ], - meta: [ - {name: 'msapplication-TileColor', content: '#2c0059'}, - {name: 'theme-color', content: '#2c0059'}, - {property: 'og:image', content: '/og-image.png'} - ], - } - }, - - css: [ - '@/assets/styles/vendor.scss', - '@/assets/styles/app.scss', - '@/assets/styles/theme.scss' - ], - - content: { - build: { - markdown: { - remarkPlugins: { - 'remark-flexible-markers': { - markerClassName: 'type-mark', - }, - 'remark-code-import': { - rootDir: process.cwd() - }, - }, - highlight: false, - }, - } - }, - - devServer: { - port: 3001 - }, - - features: { - inlineStyles: false - }, - - vue: { - compilerOptions: { - isCustomElement: (tag) => { - return tag === "rapi-doc"; - } - } - }, - vite: { - server: { - fs: { - allow: [ - "../ui-libs" - ] - } - }, - build: { - rollupOptions: { - external: [ - 'shiki/onig.wasm', - ] - } - }, - optimizeDeps: { - include: [ - "lodash", - "debug", - ], - exclude: [ - '* > @kestra-io/ui-libs' - ] - }, - resolve: { - alias: { - 'node:path': 'path-browserify' - } - }, - css: { - preprocessorOptions: { - scss: { - api: 'modern', - logger: sass.Logger.silent - }, - }, - }, - }, - - gtm: { - id: 'GTM-T4F85WRF', - enabled: false, - debug: false, - enableRouterSync: true, - devtools: true, - }, - - runtimeConfig: { - public: { - siteUrl: process.env.NUXT_PUBLIC_SITE_URL || 'https://kestra.io', - apiUrl: process.env.NUXT_PUBLIC_API_URL || DEFAULT_KESTRA_API_URL, - currentSHA: (process.env.CF_PAGES_BRANCH && process.env.CF_PAGES_COMMIT_SHA && process.env.CF_PAGES_BRANCH === 'main') - ? process.env.CF_PAGES_COMMIT_SHA - : 'dev', - docs: { - sections: { - "Get Started with Kestra": [ - "Getting Started", - "Tutorial", - "Architecture", - "Installation Guide", - "User Interface" - // "Video Tutorials" - ], - "Build with Kestra": [ - "Concepts", - "Workflow Components", - "Multi-Language Script Tasks", - "AI Tools", - "Version Control & CI/CD", - "Plugin Developer Guide", - "How-to Guides" - ], - "Scale with Kestra": [ - "Cloud & Enterprise Edition", - "Task Runners", - // "Worker Groups", - "Best Practices" - ], - "Manage Kestra": [ - "Administrator Guide", - "Migration Guide", - "Performance" - ], - "Reference Docs": [ - "Configuration", - "Expressions", - "API Reference", - "Terraform Provider", - "Kestra CLI" - ] - } - }, - CollectionNames, - posthog: { - enabled: process.env.POSTHOG_ENABLED !== "false" - }, - }, - }, - - nitro: { - storage: { - kv: { - driver: "cloudflare-kv-binding", - binding: "CLOUDFLARE_KVSTORAGE" - } - }, - devStorage: { - kv: { - driver: "fs", - base: './.data/db' - } - }, - prerender: { - routes: [ - '/rss.xml', - ], - autoSubfolderIndex: false, - }, - }, - - routeRules: { - '/slack': {redirect: `${DEFAULT_KESTRA_API_URL}/communities/slack/redirect`}, - '/docs/api-guide': {redirect: '/docs/api-reference'}, - '/docs/administrator-guide/configuration': {redirect: '/docs/configuration-guide'}, - '/doc': {redirect: '/docs'}, - '/blog': {redirect: '/blogs'}, - '/docs/plugin-library': {redirect: '/docs/getting-started/plugins'}, - '/docs/enterprise/setup-page': {redirect: '/docs/enterprise/setup'}, - '/docs/developer-guide/plugins': {redirect: '/docs/plugin-developer-guide'}, - '/docs/troubleshooting': {redirect: '/docs/administrator-guide/troubleshooting'}, - '/docs/developer-guide/scripts/rust': {redirect: '/docs/developer-guide/scripts/additional-languages'}, - '/docs/developer-guide/scripts/additional-languages': {redirect: '/docs/developer-guide/scripts/languages'}, - '/docs/developer-guide/best-practice': {redirect: '/docs/best-practices'}, - '/docs/developer-guide/best-practices': {redirect: '/docs/best-practices'}, - '/docs/developer-guide/error-handling': {redirect: '/docs/workflow-components/errors'}, - '/docs/developer-guide/scripts/output-directory': {redirect: '/docs/developer-guide/scripts/input-output-files'}, - '/docs/best-practice': {redirect: '/docs/best-practices'}, - '/docs/best-practices/pebble-templating-with-namespace-files': {redirect: '/docs/best-practices/expressions-with-namespace-files'}, - '/docs/workflow-components/trigger': {redirect: '/docs/workflow-components/triggers'}, - '/docs/workflow-components/realtime-triggers': {redirect: '/docs/workflow-components/realtime-trigger'}, - '/docs/workflow-components/triggers/conditions': {redirect: '/docs/workflow-components/triggers#conditions'}, - '/docs/workflow-components/flow-properties': {redirect: '/docs/workflow-components/flow'}, - '/docs/workflow-components/task-defaults': {redirect: '/docs/workflow-components/plugin-defaults'}, - '/docs/concepts/expression/expression-types': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/expression-usage': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/filter': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/function': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/operator': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/tag': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/test': {redirect: '/docs/expressions'}, - '/docs/concepts/expression/deprecated-handlebars': {redirect: '/docs/expressions'}, - '/docs/concepts/expression': {redirect: '/docs/expressions'}, - '/docs/expression': {redirect: '/docs/expressions'}, - '/docs/migration-guide/core-script-tasks': {redirect: '/docs/migration-guide/0.11.0/core-script-tasks'}, - '/docs/migration-guide/templates': {redirect: '/docs/migration-guide/0.11.0/templates'}, - '/docs/migration-guide/listeners': {redirect: '/docs/migration-guide/0.12.0/listeners'}, - '/docs/migration-guide/recursive-rendering': {redirect: '/docs/migration-guide/0.14.0/recursive-rendering'}, - '/docs/migration-guide/inputs-name': {redirect: '/docs/migration-guide/0.15.0/inputs-name'}, - '/docs/migration-guide/micronaut4': {redirect: '/docs/migration-guide/0.15.0/micronaut4'}, - '/docs/migration-guide/schedule-conditions': {redirect: '/docs/migration-guide/0.15.0/schedule-conditions'}, - '/docs/migration-guide/subflow-outputs': {redirect: '/docs/migration-guide/0.15.0/subflow-outputs'}, - '/docs/migration-guide/local-files': {redirect: '/docs/migration-guide/0.17.0/local-files'}, - '/docs/migration-guide/plugin-discovery-mechanism': {redirect: '/docs/migration-guide/0.17.0/plugin-discovery-mechanism'}, - '/docs/migration-guide/renamed-plugins': {redirect: '/docs/migration-guide/0.17.0/renamed-plugins'}, - '/docs/migration-guide/volume-mount': {redirect: '/docs/migration-guide/0.17.0/volume-mount'}, - '/docs/how-to-guides/errors': {redirect: '/docs/workflow-components/errors'}, - '/docs/how-to-guides/python-pip': {redirect: '/docs/how-to-guides/python'}, - '/docs/how-to-guides/local-file-sync': {redirect: '/docs/how-to-guides/local-flow-sync'}, - '/docs/how-to-guides/google-spreadsheets': {redirect: '/docs/how-to-guides/google-sheets'}, - '/docs/how-to-guides/ssl-configuration': {redirect: '/docs/administrator-guide/ssl-configuration'}, - '/docs/how-to-guide': {redirect: '/docs/how-to-guides'}, - '/docs/developer-guide/': {redirect: '/docs'}, - '/docs/developer-guide/storage': {redirect: '/docs/concepts/storage'}, - '/docs/developer-guide/caching': {redirect: '/docs/concepts/caching'}, - '/docs/developer-guide/namespace-files': {redirect: '/docs/concepts/namespace-files'}, - '/docs/developer-guide/scripts': {redirect: '/docs/workflow-components/tasks/scripts'}, - '/docs/developer-guide/git': {redirect: '/docs/version-control-cicd/git'}, - '/docs/concepts/flowable-tasks': {redirect: '/docs/workflow-components/tasks/flowable-tasks'}, - '/docs/concepts/runnable-tasks': {redirect: '/docs/workflow-components/tasks/runnable-tasks'}, - '/docs/concepts/task-runners': {redirect: '/docs/task-runners'}, - '/docs/enterprise/enterprise-edition': {redirect: '/docs/enterprise/overview/enterprise-edition'}, - '/docs/enterprise/setup': {redirect: '/docs/enterprise/overview/setup'}, - '/docs/enterprise/releases': {redirect: '/docs/enterprise/overview/releases'}, - '/docs/enterprise/audit-logs': {redirect: '/docs/enterprise/governance/audit-logs'}, - '/docs/enterprise/namespace-management': {redirect: '/docs/enterprise/governance/namespace-management'}, - '/docs/enterprise/centralized-task-configuration': {redirect: '/docs/enterprise/governance/namespace-management'}, - '/docs/enterprise/custom-blueprints': {redirect: '/docs/enterprise/governance/custom-blueprints'}, - '/docs/enterprise/logshipper': {redirect: '/docs/enterprise/governance/logshipper'}, - '/docs/enterprise/secrets': {redirect: '/docs/enterprise/governance/secrets'}, - '/docs/enterprise/secrets-manager': {redirect: '/docs/enterprise/governance/secrets-manager'}, - '/docs/enterprise/tenants': {redirect: '/docs/enterprise/governance/tenants'}, - '/docs/enterprise/authentication': {redirect: '/docs/enterprise/auth/authentication'}, - '/enterprise/auth/sso': {redirect: '/enterprise/auth/sso'}, - '/docs/enterprise/api': {redirect: '/docs/enterprise/auth/api'}, - '/docs/enterprise/api-tokens': {redirect: '/docs/enterprise/auth/api-tokens'}, - '/docs/enterprise/invitations': {redirect: '/docs/enterprise/auth/invitations'}, - '/docs/enterprise/rbac': {redirect: '/docs/enterprise/auth/rbac'}, - '/docs/enterprise/scim': {redirect: '/docs/enterprise/auth/scim'}, - '/docs/enterprise/service-accounts': {redirect: '/docs/enterprise/auth/service-accounts'}, - '/docs/enterprise/apps': {redirect: '/docs/enterprise/scalability/apps'}, - '/docs/enterprise/task-runners': {redirect: '/docs/enterprise/scalability/task-runners'}, - '/docs/enterprise/worker-group': {redirect: '/docs/enterprise/scalability/worker-group'}, - '/docs/enterprise/worker-isolation': {redirect: '/docs/enterprise/governance/worker-isolation'}, - '/docs/enterprise/scalability/worker-isolation': {redirect: '/docs/enterprise/governance/worker-isolation'}, - '/docs/enterprise/announcements': {redirect: '/docs/enterprise/instance/announcements'}, - '/docs/enterprise/dashboard': {redirect: '/docs/enterprise/instance/dashboard'}, - '/docs/enterprise/maintenance-mode': {redirect: '/docs/enterprise/instance/maintenance-mode'}, - '/docs/enterprise/governance/centralized-task-configuration': {redirect: '/docs/enterprise/governance/namespace-management'}, - '/docs/faq/enterprise': {redirect: '/docs/enterprise/ee-faq'}, - '/docs/user-interface-guide/blueprints': {redirect: '/docs/ui/blueprints'}, - '/docs/administrator-guide/server-cli': {redirect: '/docs/server-cli'}, - '/docs/configuration-guide': {redirect: '/docs/configuration'}, - '/docs/configuration-guide/**': {redirect: '/docs/configuration'}, - '/docs/ui/dashboards': {redirect: '/docs/ui/dashboard'}, - '/docs/flow-examples/**': {redirect: '/docs/how-to-guides'}, - '/docs/installation/troubleshooting': {redirect: '/docs/administrator-guide/troubleshooting'}, - '/docs/faq/troubleshooting': {redirect: '/docs/administrator-guide/troubleshooting'}, - '/docs/faq/flows': {redirect: '/docs/workflow-components/flows#faq'}, - '/docs/faq/variables': {redirect: '/docs/workflow-components/variables#faq'}, - '/docs/faq/internal-storage': {redirect: '/docs/developer-guide/storage#internal-storage-faq'}, - '/docs/faq': {redirect: '/docs/installation/troubleshooting'}, - '/docs/enterprise/kestra-identity': {redirect: '/docs/brand-assets'}, - '/docs/scripts/runners': {redirect: '/docs/scripts/task-runners'}, - '/plugin': {redirect: '/plugins'}, - '/videos': {redirect: '/tutorial-videos/all'}, - '/tutorial-videos': {redirect: '/tutorial-videos/all'}, - '/community-guidelines': {redirect: '/docs/getting-started/community-guidelines'}, - '/docs/tutorial/docker': {redirect: '/docs/tutorial/scripts'}, - '/docs/workflow-components/tasks/scripts': {redirect: '/docs/scripts'}, - '/t/**': {proxy: 'https://eu.posthog.com/**'}, - '/trust': {redirect: 'https://app.drata.com/trust/0a8e867d-7c4c-4fc5-bdc7-217f9c839604'}, - '/docs/ui/administration/stats': {redirect: '/docs/ui/administration/system-overview'}, - '/docs/architecture/executor': {redirect: '/docs/architecture/server-components#executor'}, - '/docs/architecture/worker': {redirect: '/docs/architecture/server-components#worker'}, - '/docs/architecture/scheduler': {redirect: '/docs/architecture/server-components#scheduler'}, - '/docs/architecture/indexer': {redirect: '/docs/architecture/server-components#indexer'}, - '/docs/architecture/webserver': {redirect: '/docs/architecture/server-components#webserver'}, - '/docs/architecture/internal-storage': {redirect: '/docs/architecture/main-components#internal-storage'}, - '/docs/ee-server-cli': {redirect: '/docs/server-cli'} - - }, - - build: { - transpile: ['vue3-count-to'], - extractCSS: true - }, - - optimization: { - minimize: true, - splitChunks: { - chunks: 'all', - automaticNameDelimiter: '.', - name: true, - maxSize: 144000, - cacheGroups: { - vendor: { - name: 'node_vendors', - test: /[\\/]node_modules[\\/]/, - chunks: 'all', - maxSize: 144000 - } - } - } - }, - - multiCache: { - disableCacheOverviewLogMessage: true, - data: { - enabled: true, - }, - }, - - aos: { - offset: 0, // offset (in px) from the original trigger point - once: false, // whether animation should happen only once - while scrolling down - }, - - devtools: { - timeline: { - enabled: true - } - }, - - - - compatibilityDate: '2024-07-16' -}) diff --git a/package-lock.json b/package-lock.json index 5fe8b8b22df..1219e385639 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,8 +7,10 @@ "": { "name": "kestra.io", "version": "1.0.0", - "hasInstallScript": true, "dependencies": { + "@astrojs/cloudflare": "^12.6.9", + "@astrojs/mdx": "^4.3.6", + "@astrojs/vue": "^5.1.1", "@kestra-io/ui-libs": "^0.0.252", "@popperjs/core": "^2.11.8", "@rive-app/canvas": "^2.31.2", @@ -16,6 +18,8 @@ "@vue-flow/controls": "^1.1.3", "@vue-flow/core": "^1.46.2", "@vueuse/core": "^13.9.0", + "aos": "^2.3.4", + "astro-expressive-code": "^0.41.3", "axios": "^1.11.0", "better-sqlite3": "^12.2.0", "bootstrap": "^5.3.8", @@ -29,33 +33,29 @@ "path-browserify": "^1.0.1", "posthog-js": "^1.261.0", "rapidoc": "^9.3.8", + "remark-link-rewrite": "^1.0.7", "sharp": "^0.34.3", "shiki": "^3.12.1", "slugify": "^1.6.6", + "unist-util-visit": "^5.0.0", "vanilla-cookieconsent": "^3.1.0", - "vue": "^3.5.20", + "vue": "^3.5.21", "vue-material-design-icons": "^5.3.1", "vue3-carousel-nuxt": "^1.1.6", - "vue3-count-to": "^1.1.2", - "vuex": "^4.1.0" + "vue3-count-to": "^1.1.2" }, "devDependencies": { - "@nuxt/content": "^3.6.3", - "@nuxt/devtools": "^2.6.3", - "@nuxt/image": "^1.11.0", - "@nuxtjs/mdc": "^0.17.3", - "@nuxtjs/robots": "^5.5.1", - "@nuxtjs/sitemap": "^7.4.3", - "@saslavik/nuxt-gtm": "^0.1.2", + "@types/aos": "^3.0.7", + "@types/bootstrap": "^5.2.10", "@types/node": "^24.3.0", + "astro": "^5.14.1", "nitro-cloudflare-dev": "^0.2.2", - "nuxt": "^4.0.3", - "nuxt-aos": "^1.2.5", - "nuxt-multi-cache": "^4.0.1", "remark-code-import": "file:./utils/remark-code-import", + "remark-directive": "^4.0.0", "remark-flexible-markers": "^1.3.0", "rss": "^1.2.2", "sass": "^1.91.0", + "sharp": "^0.34.2", "wrangler": "^4.33.1" }, "engines": { @@ -76,6 +76,12 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@antfu/install-pkg/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" + }, "node_modules/@antfu/utils": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.2.0.tgz", @@ -85,38 +91,169 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.9.3", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", - "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", - "dev": true, + "node_modules/@apitools/openapi-parser": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@apitools/openapi-parser/-/openapi-parser-0.0.33.tgz", + "integrity": "sha512-on8oZKkRPrPUvJmmQGpLtlcthNrREH5OjDUK2ZczKuFPOx8Tkn9mzyPc7DTQ7O0JQolaZIwymFmBaajglI6LHA==", + "license": "MIT", + "dependencies": { + "swagger-client": "^3.29.3" + } + }, + "node_modules/@astrojs/cloudflare": { + "version": "12.6.9", + "resolved": "https://registry.npmjs.org/@astrojs/cloudflare/-/cloudflare-12.6.9.tgz", + "integrity": "sha512-9LPTxQ484rOL0BqOodY+itXmD901YBdalGrah+V5e0k6r5ClRB2O9WSamDJxDt8o3Wq21ulJAbddMP3yKgsXCw==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.3", + "@astrojs/underscore-redirects": "1.0.0", + "@cloudflare/workers-types": "^4.20250913.0", + "tinyglobby": "^0.2.15", + "vite": "^6.3.6", + "wrangler": "4.37.0" + }, + "peerDependencies": { + "astro": "^5.7.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.3.tgz", + "integrity": "sha512-6Pl0bQEIChuW5wqN7jdKrzWfCscW2rG/Cz+fzt4PhSQX2ivBpnhXgFUCs0M3DCYvjYHnPVG2W36X5rmFjZ62sw==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.7.tgz", + "integrity": "sha512-KXGdq6/BC18doBCYXp08alHlWChH0hdD2B1qv9wIyOHbvwI5K6I7FhSta8dq1hBQNdun8YkKPR013D/Hm8xd0g==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.3", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.0", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.12.2", + "smol-toml": "^1.4.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.6.tgz", + "integrity": "sha512-jH04tYgaqLfq3To42+z1oEcXrXUzo3BxZ4fTkb+7BEmOJkQ9/c3iIixFEC+x0GgE8lJb4SuEDGldpAv7+1yY8A==", "license": "MIT", "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" + "@astrojs/markdown-remark": "6.3.7", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "kleur": "^4.1.5", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" }, "engines": { - "node": ">= 16" + "node": "18.20.8 || ^20.3.0 || >=22.0.0" }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" + "peerDependencies": { + "astro": "^5.0.0" } }, - "node_modules/@apitools/openapi-parser": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@apitools/openapi-parser/-/openapi-parser-0.0.33.tgz", - "integrity": "sha512-on8oZKkRPrPUvJmmQGpLtlcthNrREH5OjDUK2ZczKuFPOx8Tkn9mzyPc7DTQ7O0JQolaZIwymFmBaajglI6LHA==", + "node_modules/@astrojs/mdx/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", "license": "MIT", "dependencies": { - "swagger-client": "^3.29.3" + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/underscore-redirects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@astrojs/underscore-redirects/-/underscore-redirects-1.0.0.tgz", + "integrity": "sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ==", + "license": "MIT" + }, + "node_modules/@astrojs/vue": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@astrojs/vue/-/vue-5.1.1.tgz", + "integrity": "sha512-bMpyejcyAfXC+myWKHA6bg0dAzNBMfhLq+PnDY6h+czg1aj/ClSbJOPayzMjOGNSmRUNm+y95ctnZsA+XZkvUQ==", + "license": "MIT", + "dependencies": { + "@vitejs/plugin-vue": "5.2.1", + "@vitejs/plugin-vue-jsx": "^4.2.0", + "@vue/compiler-sfc": "^3.5.21", + "vite": "^6.3.6", + "vite-plugin-vue-devtools": "^7.7.7" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0", + "vue": "^3.2.30" } }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -131,7 +268,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -141,7 +277,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -172,7 +307,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -182,7 +316,6 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.28.3", @@ -199,7 +332,6 @@ "version": "7.27.3", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.3" @@ -212,7 +344,6 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -229,7 +360,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -239,7 +369,6 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -261,7 +390,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -271,7 +399,6 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -281,7 +408,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -295,7 +421,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -309,7 +434,6 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -327,7 +451,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" @@ -340,7 +463,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -350,7 +472,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", @@ -368,7 +489,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -400,7 +520,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -410,7 +529,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", @@ -435,6 +553,23 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -490,11 +625,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -510,7 +659,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" @@ -536,7 +684,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -662,7 +809,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" @@ -678,7 +824,6 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", @@ -710,7 +855,6 @@ "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -725,7 +869,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -766,6 +909,17 @@ "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", "license": "MIT" }, + "node_modules/@capsizecss/unpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-2.4.0.tgz", + "integrity": "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==", + "license": "MIT", + "dependencies": { + "blob-to-buffer": "^1.2.8", + "cross-fetch": "^3.0.4", + "fontkit": "^2.0.2" + } + }, "node_modules/@chevrotain/cst-dts-gen": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", @@ -809,7 +963,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.0.tgz", "integrity": "sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==", - "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { "mime": "^3.0.0" @@ -822,7 +975,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -832,13 +984,12 @@ } }, "node_modules/@cloudflare/unenv-preset": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.2.tgz", - "integrity": "sha512-JY7Uf8GhWcbOMDZX8ke2czp9f9TijvJN4CpRBs3+WYN9U7jHpj3XaV+HHm78iHkAwTm/JeBHqyQNhq/PizynRA==", - "dev": true, + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.3.tgz", + "integrity": "sha512-tsQQagBKjvpd9baa6nWVIv399ejiqcrUBBW6SZx6Z22+ymm+Odv5+cFimyuCsD/fC1fQTwfRmwXBNpzvHSeGCw==", "license": "MIT OR Apache-2.0", "peerDependencies": { - "unenv": "2.0.0-rc.20", + "unenv": "2.0.0-rc.21", "workerd": "^1.20250828.1" }, "peerDependenciesMeta": { @@ -848,13 +999,12 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20250902.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250902.0.tgz", - "integrity": "sha512-mwC/YEtDUGfnjXdbW5Lya+bgODrpJ5RxxqpaTjtMJycqnjR0RZgVpOqISwGfBHIhseykU3ahPugM5t91XkBKTg==", + "version": "1.20250906.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250906.0.tgz", + "integrity": "sha512-E+X/YYH9BmX0ew2j/mAWFif2z05NMNuhCTlNYEGLkqMe99K15UewBqajL9pMcMUKxylnlrEoK3VNxl33DkbnPA==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -865,13 +1015,12 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20250902.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250902.0.tgz", - "integrity": "sha512-5Wr6a5/ixoXuMPOvbprN8k9HhAHDBh8f7H5V4DN/Xb4ORoGkI9AbC5QPpYV0wa3Ncf+CRSGobdmZNyO24hRccA==", + "version": "1.20250906.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250906.0.tgz", + "integrity": "sha512-X5apsZ1SFW4FYTM19ISHf8005FJMPfrcf4U5rO0tdj+TeJgQgXuZ57IG0WeW7SpLVeBo8hM6WC8CovZh41AfnA==", "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -882,13 +1031,12 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20250902.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250902.0.tgz", - "integrity": "sha512-1yJGt56VQBuG01nrhkRGoa1FGz7xQwJTrgewxt/MRRtigZTf84qJQiPQxyM7PQWCLREKa+JS7G8HFqvOwK7kZA==", + "version": "1.20250906.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250906.0.tgz", + "integrity": "sha512-rlKzWgsLnlQ5Nt9W69YBJKcmTmZbOGu0edUsenXPmc6wzULUxoQpi7ZE9k3TfTonJx4WoQsQlzCUamRYFsX+0Q==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -899,13 +1047,12 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20250902.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250902.0.tgz", - "integrity": "sha512-ArDodWzfo0BVqMQGUgaOGV5Mzf8wEMUX8TJonExpGbYavoVXVDbp2rTLFRJg1vkFGpmw1teCtSoOjSDisFZQMg==", + "version": "1.20250906.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250906.0.tgz", + "integrity": "sha512-DdedhiQ+SeLzpg7BpcLrIPEZ33QKioJQ1wvL4X7nuLzEB9rWzS37NNNahQzc1+44rhG4fyiHbXBPOeox4B9XVA==", "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -916,13 +1063,12 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20250902.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250902.0.tgz", - "integrity": "sha512-DT/o8ZSkmze1YGI7vgVt4ST+VYGb3tNChiFnOM9Z8YOejqKqbVvATB4gi/xMSnNR9CsKFqH4hHWDDtz+wf4uZg==", + "version": "1.20250906.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250906.0.tgz", + "integrity": "sha512-Q8Qjfs8jGVILnZL6vUpQ90q/8MTCYaGR3d1LGxZMBqte8Vr7xF3KFHPEy7tFs0j0mMjnqCYzlofmPNY+9ZaDRg==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -932,11 +1078,16 @@ "node": ">=16" } }, + "node_modules/@cloudflare/workers-types": { + "version": "4.20250913.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250913.0.tgz", + "integrity": "sha512-JjrYEvRn7cyALxwoFTw3XChaQneHSJOXqz2t5iKEpNzAnC2iPQU75rtTK/gw03Jjy4SHY5aEBh/uqQePtonZlA==", + "license": "MIT OR Apache-2.0" + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" @@ -949,23 +1100,19 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", - "dev": true, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "engines": { + "node": ">=14" } }, "node_modules/@emnapi/runtime": { @@ -978,17 +1125,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", @@ -996,7 +1132,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1013,7 +1148,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1030,7 +1164,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1047,7 +1180,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1096,7 +1228,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1113,7 +1244,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1130,7 +1260,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1147,7 +1276,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1164,7 +1292,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1181,7 +1308,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1198,7 +1324,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1215,7 +1340,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1232,7 +1356,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1249,7 +1372,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1282,7 +1404,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1299,7 +1420,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1316,7 +1436,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1333,7 +1452,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1350,7 +1468,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1367,7 +1484,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1384,7 +1500,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1401,7 +1516,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1418,7 +1532,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1428,6 +1541,51 @@ "node": ">=18" } }, + "node_modules/@expressive-code/core": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.3.tgz", + "integrity": "sha512-9qzohqU7O0+JwMEEgQhnBPOw5DtsQRBXhW++5fvEywsuX44vCGGof1SL5OvPElvNgaWZ4pFZAFSlkNOkGyLwSQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.3.tgz", + "integrity": "sha512-rFQtmf/3N2CK3Cq/uERweMTYZnBu+CwxBdHuOftEmfA9iBE7gTVvwpbh82P9ZxkPLvc40UMhYt7uNuAZexycRQ==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.3" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.3.tgz", + "integrity": "sha512-RlTARoopzhFJIOVHLGvuXJ8DCEme/hjV+ZnRJBIxzxsKVpGPW4Oshqg9xGhWTYdHstTsxO663s0cdBLzZj9TQA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.3", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.3.tgz", + "integrity": "sha512-SN8tkIzDpA0HLAscEYD2IVrfLiid6qEdE9QLlGVSxO1KEw7qYvjpbNBQjUjMr5/jvTJ7ys6zysU2vLPHE0sb2g==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.3" + } + }, "node_modules/@fastify/accept-negotiator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-2.0.1.tgz", @@ -1444,44 +1602,6 @@ ], "license": "MIT" }, - "node_modules/@fingerprintjs/botd": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@fingerprintjs/botd/-/botd-1.9.1.tgz", - "integrity": "sha512-7kv3Yolsx9E56i+L1hCEcupH5yqcI5cmVktxy6B0K7rimaH5qDXwsiA5FL+fkxeUny7XQKn7p13HvK7ofDZB3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@gtm-support/core": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@gtm-support/core/-/core-2.3.1.tgz", - "integrity": "sha512-eD0hndQjhgKm5f/7IA9fZYujmHiVMY+fnYv4mdZSmz5XJQlS4TiTmpdZx2l7I2A9rI9J6Ysz8LpXYYNo/Xq4LQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@gtm-support/vue-gtm": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@gtm-support/vue-gtm/-/vue-gtm-2.2.0.tgz", - "integrity": "sha512-7nhBTRkTG0mD+7r7JvNalJz++YwszZk0oP1HIY6fCgz6wNKxT6LuiXCqdPrZmNPe/WbPIKuqxGZN5s+i6NZqow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@gtm-support/core": "^2.0.0" - }, - "optionalDependencies": { - "vue-router": ">= 4.1.0 < 5.0.0" - }, - "peerDependencies": { - "vue": ">= 3.2.0 < 4.0.0" - }, - "peerDependenciesMeta": { - "vue-router": { - "optional": true - } - } - }, "node_modules/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", @@ -1489,9 +1609,9 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.1.tgz", - "integrity": "sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==", "license": "MIT", "dependencies": { "@antfu/install-pkg": "^1.1.0", @@ -1967,150 +2087,12 @@ } }, "node_modules/@ioredis/commands": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.3.1.tgz", - "integrity": "sha512-bYtU8avhGIcje3IhvF9aSjsa5URMZBHnwKtOvXsT4sfYy9gppW11gLPT/9oNqlJZD47yPKveQFTAFWpHjKvUoQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", + "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } + "optional": true, + "peer": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -2139,6 +2121,16 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -2295,6 +2287,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/core/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -2653,8 +2661,9 @@ "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" @@ -2667,22 +2676,15 @@ "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, "node_modules/@kestra-io/ui-libs": { "version": "0.0.252", "resolved": "https://registry.npmjs.org/@kestra-io/ui-libs/-/ui-libs-0.0.252.tgz", @@ -2724,23 +2726,6 @@ "yaml": "^2.5.1" } }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@lit-labs/ssr-dom-shim": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.4.0.tgz", @@ -2756,36 +2741,59 @@ "@lit-labs/ssr-dom-shim": "^1.4.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", - "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", "dependencies": { - "consola": "^3.2.3", - "detect-libc": "^2.0.0", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^2.6.7", - "nopt": "^8.0.0", - "semver": "^7.5.3", - "tar": "^7.4.0" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@mdx-js/mdx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">= 12" } }, "node_modules/@mermaid-js/parser": { @@ -2797,1589 +2805,95 @@ "langium": "3.3.1" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.3.tgz", - "integrity": "sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.5", - "@emnapi/runtime": "^1.4.5", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxt/cli": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.28.0.tgz", - "integrity": "sha512-WQ751WxWLBIeH3TDFt/LWQ2znyAKxpR5+gpv80oerwnVQs4GKajAfR6dIgExXZkjaPUHEFv2lVD9vM+frbprzw==", - "dev": true, + "node_modules/@nuxt/kit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.2.tgz", + "integrity": "sha512-P5q41xeEOa6ZQC0PvIP7TSBmOAMxXK4qihDcCbYIJq8RcVsEPbGZVlidmxE6EOw1ucSyodq9nbV31FAKwoL4NQ==", "license": "MIT", "dependencies": { "c12": "^3.2.0", - "citty": "^0.1.6", - "clipboardy": "^4.0.0", - "confbox": "^0.2.2", "consola": "^3.4.2", "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", "exsolve": "^1.0.7", - "fuse.js": "^7.1.0", - "get-port-please": "^3.2.0", - "giget": "^2.0.0", - "h3": "^1.15.4", - "httpxy": "^0.1.7", + "ignore": "^7.0.5", "jiti": "^2.5.1", - "listhen": "^1.9.0", - "nypm": "^0.6.1", - "ofetch": "^1.4.1", + "klona": "^2.0.6", + "mlly": "^1.8.0", "ohash": "^2.0.11", "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2", "scule": "^1.3.0", "semver": "^7.7.2", "std-env": "^3.9.0", - "tinyexec": "^1.0.1", + "tinyglobby": "^0.2.15", "ufo": "^1.6.1", - "youch": "^4.1.0-beta.11" - }, - "bin": { - "nuxi": "bin/nuxi.mjs", - "nuxi-ng": "bin/nuxi.mjs", - "nuxt": "bin/nuxi.mjs", - "nuxt-cli": "bin/nuxi.mjs" + "unctx": "^2.4.1", + "unimport": "^5.2.0", + "untyped": "^2.0.0" }, "engines": { - "node": "^16.10.0 || >=18.0.0" + "node": ">=18.12.0" } }, - "node_modules/@nuxt/content": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@nuxt/content/-/content-3.7.1.tgz", - "integrity": "sha512-QjUyxvC3IhLca9gZuGGZslL+L2PkxFwiPD/fbXN1X0EuUfbe17H/AMt53ZRezWrxs6MOaLbyWLHzcllcjEB/jQ==", - "dev": true, + "node_modules/@nuxtjs/mdc": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@nuxtjs/mdc/-/mdc-0.17.4.tgz", + "integrity": "sha512-I5ZYUWVlE2xZAkfBG6B0/l2uddDZlr8X2WPVMPYNY4zocobBjMgykj4aqYXHY+N35HRYsa+IpuUCf30bR8xCbA==", "license": "MIT", "dependencies": { "@nuxt/kit": "^4.1.1", - "@nuxtjs/mdc": "^0.17.4", + "@shikijs/core": "^3.12.2", "@shikijs/langs": "^3.12.2", - "@sqlite.org/sqlite-wasm": "3.50.4-build1", - "@standard-schema/spec": "^1.0.0", - "@webcontainer/env": "^1.1.1", - "c12": "^3.2.0", - "chokidar": "^4.0.3", + "@shikijs/themes": "^3.12.2", + "@shikijs/transformers": "^3.12.2", + "@types/hast": "^3.0.4", + "@types/mdast": "^4.0.4", + "@vue/compiler-core": "^3.5.21", "consola": "^3.4.2", - "db0": "^0.3.2", + "debug": "^4.4.1", "defu": "^6.1.4", "destr": "^2.0.5", - "git-url-parse": "^16.1.0", - "jiti": "^2.5.1", - "json-schema-to-typescript": "^15.0.4", - "knitwork": "^1.2.0", - "listhen": "^1.9.0", + "detab": "^3.0.2", + "github-slugger": "^2.0.0", + "hast-util-format": "^1.1.0", + "hast-util-to-mdast": "^10.1.2", + "hast-util-to-string": "^3.0.1", "mdast-util-to-hast": "^13.2.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.2", - "micromark-util-character": "^2.1.1", - "micromark-util-chunked": "^2.0.1", - "micromark-util-resolve-all": "^2.0.1", "micromark-util-sanitize-uri": "^2.0.1", - "micromatch": "^4.0.8", - "minimark": "^0.2.0", - "minimatch": "^10.0.3", - "nuxt-component-meta": "^0.14.0", - "nypm": "^0.6.1", - "ohash": "^2.0.11", + "parse5": "^8.0.0", "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "remark-mdc": "^3.6.0", - "scule": "^1.3.0", - "shiki": "^3.12.2", - "slugify": "^1.6.6", - "socket.io-client": "^4.8.1", - "tar": "^7.4.3", - "tinyglobby": "^0.2.15", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unified": "^11.0.5", - "unist-util-stringify-position": "^4.0.0", - "unist-util-visit": "^5.0.0", - "ws": "^8.18.3", - "zod": "^3.25.76", - "zod-to-json-schema": "^3.24.6" - }, - "peerDependencies": { - "@electric-sql/pglite": "*", - "@libsql/client": "*", - "@valibot/to-json-schema": "^1.0.0", - "better-sqlite3": "^12.2.0", - "sqlite3": "*", - "valibot": "^1.0.0" - }, - "peerDependenciesMeta": { - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "@valibot/to-json-schema": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "valibot": { - "optional": true - } - } - }, - "node_modules/@nuxt/content/node_modules/@nuxt/kit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.2.tgz", - "integrity": "sha512-P5q41xeEOa6ZQC0PvIP7TSBmOAMxXK4qihDcCbYIJq8RcVsEPbGZVlidmxE6EOw1ucSyodq9nbV31FAKwoL4NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "c12": "^3.2.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.15", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/devalue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", - "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nuxt/devtools": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-2.6.3.tgz", - "integrity": "sha512-n+8we7pr0tNl6w+KfbFDXZsYpWIYL4vG/daIdRF66lQ6fLyQy/CcxDAx8+JNu3Ew96RjuBtWRSbCCv454L5p0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/devtools-kit": "2.6.3", - "@nuxt/devtools-wizard": "2.6.3", - "@nuxt/kit": "^3.18.1", - "@vue/devtools-core": "^7.7.7", - "@vue/devtools-kit": "^7.7.7", - "birpc": "^2.5.0", - "consola": "^3.4.2", - "destr": "^2.0.5", - "error-stack-parser-es": "^1.0.5", - "execa": "^8.0.1", - "fast-npm-meta": "^0.4.6", - "get-port-please": "^3.2.0", - "hookable": "^5.5.3", - "image-meta": "^0.2.1", - "is-installed-globally": "^1.0.0", - "launch-editor": "^2.11.1", - "local-pkg": "^1.1.2", - "magicast": "^0.3.5", - "nypm": "^0.6.1", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.3.0", - "semver": "^7.7.2", - "simple-git": "^3.28.0", - "sirv": "^3.0.1", - "structured-clone-es": "^1.0.0", - "tinyglobby": "^0.2.14", - "vite-plugin-inspect": "^11.3.2", - "vite-plugin-vue-tracer": "^1.0.0", - "which": "^5.0.0", - "ws": "^8.18.3" - }, - "bin": { - "devtools": "cli.mjs" - }, - "peerDependencies": { - "vite": ">=6.0" - } - }, - "node_modules/@nuxt/devtools-kit": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-2.6.3.tgz", - "integrity": "sha512-cDmai3Ws6AbJlYy1p4CCwc718cfbqtAjXe6oEc6q03zoJnvX1PsvKUfmU+yuowfqTSR6DZRmH4SjCBWuMjgaKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.18.1", - "execa": "^8.0.1" - }, - "peerDependencies": { - "vite": ">=6.0" - } - }, - "node_modules/@nuxt/devtools-wizard": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-2.6.3.tgz", - "integrity": "sha512-FWXPkuJ1RUp+9nWP5Vvk29cJPNtm4OO38bgr9G8vGbqcRznzgaSODH/92c8sm2dKR7AF+9MAYLL+BexOWOkljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.4.2", - "diff": "^8.0.2", - "execa": "^8.0.1", - "magicast": "^0.3.5", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "prompts": "^2.4.2", - "semver": "^7.7.2" - }, - "bin": { - "devtools-wizard": "cli.mjs" - } - }, - "node_modules/@nuxt/image": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@nuxt/image/-/image-1.11.0.tgz", - "integrity": "sha512-4kzhvb2tJfxMsa/JZeYn1sMiGbx2J/S6BQrQSdXNsHgSvywGVkFhTiQGjoP6O49EsXyAouJrer47hMeBcTcfXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.18.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "h3": "^1.15.3", - "image-meta": "^0.2.1", - "knitwork": "^1.2.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "std-env": "^3.9.0", - "ufo": "^1.6.1" - }, - "engines": { - "node": ">=18.20.6" - }, - "optionalDependencies": { - "ipx": "^2.1.1" - } - }, - "node_modules/@nuxt/image/node_modules/@fastify/accept-negotiator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@fastify/accept-negotiator/-/accept-negotiator-1.1.0.tgz", - "integrity": "sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nuxt/image/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@nuxt/image/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nuxt/image/node_modules/ipx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ipx/-/ipx-2.1.1.tgz", - "integrity": "sha512-XuM9FEGOT+/45mfAWZ5ykwkZ/oE7vWpd1iWjRffMWlwAYIRzb/xD6wZhQ4BzmPMX6Ov5dqK0wUyD0OEN9oWT6g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@fastify/accept-negotiator": "^1.1.0", - "citty": "^0.1.5", - "consola": "^3.2.3", - "defu": "^6.1.4", - "destr": "^2.0.2", - "etag": "^1.8.1", - "h3": "^1.10.0", - "image-meta": "^0.2.0", - "listhen": "^1.5.6", - "ofetch": "^1.3.3", - "pathe": "^1.1.2", - "sharp": "^0.32.6", - "svgo": "^3.2.0", - "ufo": "^1.3.2", - "unstorage": "^1.10.1", - "xss": "^1.0.14" - }, - "bin": { - "ipx": "bin/ipx.mjs" - } - }, - "node_modules/@nuxt/image/node_modules/ipx/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@nuxt/image/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0", - "optional": true - }, - "node_modules/@nuxt/image/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@nuxt/image/node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@nuxt/image/node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/@nuxt/kit": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.19.1.tgz", - "integrity": "sha512-cLKNdmfFk49o9Tt7g+vwD9rYN7cLg0D6K6CRB+4aaQYxveJXQbZGgZ4z7CGq5HxIG22Ki8G3XSXaiN1s6lVyZg==", - "license": "MIT", - "dependencies": { - "c12": "^3.2.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.14", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/schema": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-4.1.1.tgz", - "integrity": "sha512-s4ELQEw6er4kop4e9HkTZ2ByVEvOGic9YJmesr2QI3O+q01CLSZE6aepbRLsq1Hz6bbfq/UrFw8MLuHs7l03aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "^3.5.20", - "consola": "^3.4.2", - "defu": "^6.1.4", - "pathe": "^2.0.3", - "std-env": "^3.9.0", - "ufo": "1.6.1" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/telemetry": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.6.6.tgz", - "integrity": "sha512-Zh4HJLjzvm3Cq9w6sfzIFyH9ozK5ePYVfCUzzUQNiZojFsI2k1QkSBrVI9BGc6ArKXj/O6rkI6w7qQ+ouL8Cag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.15.4", - "citty": "^0.1.6", - "consola": "^3.4.2", - "destr": "^2.0.3", - "dotenv": "^16.4.7", - "git-url-parse": "^16.0.1", - "is-docker": "^3.0.0", - "ofetch": "^1.4.1", - "package-manager-detector": "^1.1.0", - "pathe": "^2.0.3", - "rc9": "^2.1.2", - "std-env": "^3.8.1" - }, - "bin": { - "nuxt-telemetry": "bin/nuxt-telemetry.mjs" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/telemetry/node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/@nuxt/vite-builder": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-4.1.1.tgz", - "integrity": "sha512-hRIHu9a1x2HFFSXQt3+eG4s8GP1QhuzjiCmd/sciC55NISc0oP69tTmOmFOp3L8G2BapSZ/O1CZEnO/XoAqZkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "4.1.1", - "@rollup/plugin-replace": "^6.0.2", - "@vitejs/plugin-vue": "^6.0.1", - "@vitejs/plugin-vue-jsx": "^5.1.1", - "autoprefixer": "^10.4.21", - "consola": "^3.4.2", - "cssnano": "^7.1.1", - "defu": "^6.1.4", - "esbuild": "^0.25.9", - "escape-string-regexp": "^5.0.0", - "exsolve": "^1.0.7", - "get-port-please": "^3.2.0", - "h3": "^1.15.4", - "jiti": "^2.5.1", - "knitwork": "^1.2.0", - "magic-string": "^0.30.18", - "mlly": "^1.8.0", - "mocked-exports": "^0.1.1", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "postcss": "^8.5.6", - "rollup-plugin-visualizer": "^6.0.3", - "std-env": "^3.9.0", - "ufo": "^1.6.1", - "unenv": "^2.0.0-rc.19", - "vite": "^7.1.4", - "vite-node": "^3.2.4", - "vite-plugin-checker": "^0.10.3", - "vue-bundle-renderer": "^2.1.2" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vue": "^3.3.4" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/@nuxt/kit": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.1.tgz", - "integrity": "sha512-2MGfOXtbcxdkbUNZDjyEv4xmokicZhTrQBMrmNJQztrePfpKOVBe8AiGf/BfbHelXMKio5PgktiRoiEIyIsX4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "c12": "^3.2.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.14", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxtjs/mdc": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@nuxtjs/mdc/-/mdc-0.17.4.tgz", - "integrity": "sha512-I5ZYUWVlE2xZAkfBG6B0/l2uddDZlr8X2WPVMPYNY4zocobBjMgykj4aqYXHY+N35HRYsa+IpuUCf30bR8xCbA==", - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^4.1.1", - "@shikijs/core": "^3.12.2", - "@shikijs/langs": "^3.12.2", - "@shikijs/themes": "^3.12.2", - "@shikijs/transformers": "^3.12.2", - "@types/hast": "^3.0.4", - "@types/mdast": "^4.0.4", - "@vue/compiler-core": "^3.5.21", - "consola": "^3.4.2", - "debug": "^4.4.1", - "defu": "^6.1.4", - "destr": "^2.0.5", - "detab": "^3.0.2", - "github-slugger": "^2.0.0", - "hast-util-format": "^1.1.0", - "hast-util-to-mdast": "^10.1.2", - "hast-util-to-string": "^3.0.1", - "mdast-util-to-hast": "^13.2.0", - "micromark-util-sanitize-uri": "^2.0.1", - "parse5": "^8.0.0", - "pathe": "^2.0.3", - "property-information": "^7.1.0", - "rehype-external-links": "^3.0.0", - "rehype-minify-whitespace": "^6.0.2", - "rehype-raw": "^7.0.0", - "rehype-remark": "^10.0.1", - "rehype-slug": "^6.0.0", - "rehype-sort-attribute-values": "^5.0.1", - "rehype-sort-attributes": "^5.0.1", - "remark-emoji": "^5.0.2", - "remark-gfm": "^4.0.1", - "remark-mdc": "v3.6.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-stringify": "^11.0.0", - "scule": "^1.3.0", - "shiki": "^3.12.2", - "ufo": "^1.6.1", - "unified": "^11.0.5", - "unist-builder": "^4.0.0", - "unist-util-visit": "^5.0.0", - "unwasm": "^0.3.11", - "vfile": "^6.0.3" - } - }, - "node_modules/@nuxtjs/mdc/node_modules/@nuxt/kit": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.1.tgz", - "integrity": "sha512-2MGfOXtbcxdkbUNZDjyEv4xmokicZhTrQBMrmNJQztrePfpKOVBe8AiGf/BfbHelXMKio5PgktiRoiEIyIsX4g==", - "license": "MIT", - "dependencies": { - "c12": "^3.2.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.14", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxtjs/robots": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@nuxtjs/robots/-/robots-5.5.1.tgz", - "integrity": "sha512-CxKJZKkmS6n15/yDSQ8quhUKOTEhNxx8uwGtXihxeNY/wJW10HQIu2c69HiKefwJrAQly0MpcInf/NbcNqF9uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fingerprintjs/botd": "^1.9.1", - "@nuxt/kit": "^4.0.3", - "consola": "^3.4.2", - "defu": "^6.1.4", - "nuxt-site-config": "^3.2.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "sirv": "^3.0.1", - "std-env": "^3.9.0", - "ufo": "^1.6.1" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@nuxtjs/robots/node_modules/@nuxt/kit": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.1.tgz", - "integrity": "sha512-2MGfOXtbcxdkbUNZDjyEv4xmokicZhTrQBMrmNJQztrePfpKOVBe8AiGf/BfbHelXMKio5PgktiRoiEIyIsX4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "c12": "^3.2.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.14", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxtjs/sitemap": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@nuxtjs/sitemap/-/sitemap-7.4.3.tgz", - "integrity": "sha512-edJ0bVuKS87PefTnKVMqcEwSZbur0yLg2eCKU2kjNDI1jC9tOnCHwXMHQficiKPXZolzqmlK7+U23Tv95OzVbg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/devtools-kit": "^2.5.0", - "@nuxt/kit": "^3.17.5", - "chalk": "^5.4.1", - "defu": "^6.1.4", - "fast-xml-parser": "^5.2.5", - "h3-compression": "^0.3.2", - "nuxt-site-config": "^3.2.2", - "ofetch": "^1.4.1", - "pathe": "^2.0.3", - "pkg-types": "^2.1.1", - "radix3": "^1.1.2", - "semver": "^7.7.2", - "sirv": "^3.0.1", - "std-env": "^3.9.0", - "ufo": "^1.6.1", - "ultrahtml": "^1.6.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@oxc-minify/binding-android-arm64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-android-arm64/-/binding-android-arm64-0.86.0.tgz", - "integrity": "sha512-jOgbDgp6A1ax9sxHPRHBxUpxIzp2VTgbZ/6HPKIVUJ7IQqKVsELKFXIOEbCDlb1rUhZZtGf53MFypXf72kR5eQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-darwin-arm64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-arm64/-/binding-darwin-arm64-0.86.0.tgz", - "integrity": "sha512-LQkjIHhIzxVYnxfC2QV7MMe4hgqIbwK07j+zzEsNWWfdmWABw11Aa6FP0uIvERmoxstzsDT77F8c/+xhxswKiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-darwin-x64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-darwin-x64/-/binding-darwin-x64-0.86.0.tgz", - "integrity": "sha512-AuLkeXIvJ535qOhFzZfHBkcEZA59SN1vKUblW2oN+6ClZfIMru0I2wr0cCHA9QDxIVDkI7swDu29qcn2AqKdrg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-freebsd-x64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-freebsd-x64/-/binding-freebsd-x64-0.86.0.tgz", - "integrity": "sha512-UcXLcM8+iHW1EL+peHHV1HDBFUVdoxFMJC7HBc2U83q9oiF/K73TnAEgW/xteR+IvbV/9HD+cQsH+DX6oBXoQg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm-gnueabihf": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.86.0.tgz", - "integrity": "sha512-UtSplQY10Idp//cLS5i2rFaunS71padZFavHLHygNAxJBt+37DPKDl/4kddpV6Kv2Mr6bhw2KpXGAVs0C3dIOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm-musleabihf": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.86.0.tgz", - "integrity": "sha512-P5efCOl9QiwqqJHrw1Q+4ssexvOz+MAmgTmBorbdEM3WJdIHR1CWGDj4GqcvKBlwpBqt4XilOuoN0QD8dfl85A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.86.0.tgz", - "integrity": "sha512-hwHahfs//g9iZLQmKldjQPmnpzq76eyHvfkmdnXXmPtwTHnwXL1hPlNbTIqakUirAsroBeQwXqzHm3I040R+mg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-arm64-musl": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.86.0.tgz", - "integrity": "sha512-S2dL24nxWqDCwrq48xlZBvhSIBcEWOu3aDOiaccP4q73PiTLrf6rm1M11J7vQNSRiH6ao9UKr7ZMsepCZcOyfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-riscv64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.86.0.tgz", - "integrity": "sha512-itZ24A1a5NOw0ibbt6EYOHdBojfV4vbiC209d06Dwv5WLXtntHCjc8P4yfrCsC22uDmMPNkVa+UL+OM4mkUrwg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-s390x-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.86.0.tgz", - "integrity": "sha512-/nJAwS/uit19qXNpaOybf7GYJI7modbXYVZ8q1pIFdxs6HkhZLxS1ZvcIzY3W75+37u+uKeZ4MbygawAN8kQpQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-x64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.86.0.tgz", - "integrity": "sha512-3qnWZB2cOj5Em/uEJqJ1qP/8lxtoi/Rf1U8fmdLzPW5zIaiTRUr/LklB4aJ+Vc/GU5g3HX5nFPQG3ZnEV3Ktzg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-linux-x64-musl": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-linux-x64-musl/-/binding-linux-x64-musl-0.86.0.tgz", - "integrity": "sha512-+ZqYG8IQSRq9dR2djrnyzGHlmwGRKdueVjHYbEOwngb/4h/+FxAOaNUbsoUsCthAfXTrZHVXiQMTKJ32r7j2Bg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-wasm32-wasi": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-wasm32-wasi/-/binding-wasm32-wasi-0.86.0.tgz", - "integrity": "sha512-ixeSZW7jzd3g9fh8MoR9AzGLQxMCo//Q2mVpO2S/4NmcPtMaJEog85KzHULgUvbs70RqxTHEUqtVgpnc/5lMWA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-win32-arm64-msvc": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.86.0.tgz", - "integrity": "sha512-cN309CnFVG8jeSRd+lQGnoMpZAVmz4bzH4fgqJM0NsMXVnFPGFceG/XiToLoBA1FigGQvkV0PJ7MQKWxBHPoUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-minify/binding-win32-x64-msvc": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-minify/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.86.0.tgz", - "integrity": "sha512-YAqCKtZ9KKhSW73d/Oa9Uut0myYnCEUL2D0buMjJ4p0PuK1PQsMCJsmX4ku0PgK31snanZneRwtEjjNFYNdX2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.86.0.tgz", - "integrity": "sha512-BfNFEWpRo4gqLHKvRuQmhbPGeJqB1Ka/hsPhKf1imAojwUcf/Dr/yRkZBuEi2yc1LWBjApKYJEqpsBUmtqSY1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.86.0.tgz", - "integrity": "sha512-gRSnEHcyNEfLdNj6v8XKcuHUaZnRpH2lOZFztuGEi23ENydPOQVEtiZYexuHOTeaLGgzw+93TgB4n/YkjYodug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.86.0.tgz", - "integrity": "sha512-6mdymm8i+VpLTJP19D3PSFumMmAyfhhhIRWcRHsc0bL7CSZjCWbvRb00ActKrGKWtsol/A/KKgqglJwpvjlzOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.86.0.tgz", - "integrity": "sha512-mc2xYRPxhzFg4NX1iqfIWP+8ORtXiNpAkaomNDepegQFlIFUmrESa3IJrKJ/4vg77Tbti7omHbraOqwdTk849g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.86.0.tgz", - "integrity": "sha512-LZzapjFhwGQMKefcFsn3lJc/mTY37fBlm0jjEvETgNCyd5pH4gDwOcrp/wZHAz2qw5uLWOHaa69I6ci5lBjJgA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.86.0.tgz", - "integrity": "sha512-/rhJMpng7/Qgn8hE4sigxTRb04+zdO0K1kfAMZ3nONphk5r2Yk2RjyEpLLz17adysCyQw/KndaMHNv8GR8VMNg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.86.0.tgz", - "integrity": "sha512-IXEZnk6O0zJg5gDn1Zvt5Qx62Z3E+ewrKwPgMfExqnNCLq+Ix2g7hQypevm/S6qxVgyz5HbiW+a/5ziMFXTCJQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.86.0.tgz", - "integrity": "sha512-QG7DUVZ/AtBaUGMhgToB4glOdq0MGAEYU1MJQpNB5HqiEcOpteF9Pd+oPfscj2zrGPd47KNyljtJRBKJr6Ut0w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.86.0.tgz", - "integrity": "sha512-smz+J6riX2du2lp0IKeZSaOBIhhoE2N/L1IQdOLCpzB0ikjCDBoyNKdDM7te8ZDq3KDnRmJChmhQGd8P1/LGBQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.86.0.tgz", - "integrity": "sha512-vas1BOMWVdicuimmi5Y+xPj3csaYQquVA45Im9a/DtVsypVeh8RWYXBMO1qJNM5Fg5HD0QvYNqxvftx3c+f5pg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.86.0.tgz", - "integrity": "sha512-3Fsi+JA3NwdZdrpC6AieOP48cuBrq0q59JgnR0mfoWfr9wHrbn2lt8EEubrj6EXpBUmu1Zii7S9NNRC6fl/d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.86.0.tgz", - "integrity": "sha512-89/d43EW76wJagz8u5zcKW8itB2rnS/uN7un5APb8Ebme8TePBwDyxo64J6oY5rcJYkfJ6lEszSF/ovicsNVPw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-wasm32-wasi": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.86.0.tgz", - "integrity": "sha512-gRrGmE2L27stNMeiAucy/ffHF9VjYr84MizuJzSYnnKmd5WXf3HelNdd0UYSJnpb7APBuyFSN2Oato+Qb6yAFw==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.86.0.tgz", - "integrity": "sha512-parTnpNviJYR3JIFLseDGip1KkYbhWLeuZG9OMek62gr6Omflddoytvb17s+qODoZqFAVjvuOmVipDdjTl9q3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.86.0.tgz", - "integrity": "sha512-FTso24eQh3vPTe/SOTf0/RXfjJ13tsk5fw728fm+z5y6Rb+mmEBfyVT6XxyGhEwtdfnRSZawheX74/9caI1etw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.86.0.tgz", - "integrity": "sha512-bJ57vWNQnOnUe5ZxUkrWpLyExxqb0BoyQ+IRmI/V1uxHbBNBzFGMIjKIf5ECFsgS0KgUUl8TM3a4xpeAtAnvIA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxc-transform/binding-android-arm64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-android-arm64/-/binding-android-arm64-0.86.0.tgz", - "integrity": "sha512-025JJoCWi04alNef6WvLnGCbx2MH9Ld2xvr0168bpOcpBjxt8sOZawu0MPrZQhnNWWiX8rrwrhuUDasWCWHxFw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-darwin-arm64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-arm64/-/binding-darwin-arm64-0.86.0.tgz", - "integrity": "sha512-dJls3eCO1Y2dc4zAdA+fiRbQwlvFFDmfRHRpGOllwS1FtvKQ7dMkRFKsHODEdxWakxISLvyabUmkGOhcJ47Dog==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-darwin-x64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-darwin-x64/-/binding-darwin-x64-0.86.0.tgz", - "integrity": "sha512-udMZFZn6FEy36tVMs/yrczEqWyCJc+l/lqIMS4xYWsm/6qVafUWDSAZJLgcPilng16IdMnHINkc8NSz7Pp1EVw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-freebsd-x64": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-freebsd-x64/-/binding-freebsd-x64-0.86.0.tgz", - "integrity": "sha512-41J5qSlypbE0HCOd+4poFD96+ZKoR8sfDn5qdaU0Hc5bT5Drwat/wv06s9Y5Lu86uXYTwPPj6kbbxHHsiV2irw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm-gnueabihf": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.86.0.tgz", - "integrity": "sha512-mrI+nKgwRsr4FYjb0pECrNTVnNvHAflukS3SFqFHI8n+3LJgrCYDcnbrFD/4VWKp2EUrkIZ//RhwgGsTiSXbng==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm-musleabihf": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.86.0.tgz", - "integrity": "sha512-FXWyvpxiEXBewA3L6HGFtEribqFjGOiounD8ke/4C1F5134+rH5rNrgK6vY116P4MtWKfZolMRdvlzaD3TaX0A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.86.0.tgz", - "integrity": "sha512-gktU/9WLAc0d2hAq8yRi3K92xwkWoDt1gJmokMOfb1FU4fyDbzbt13jdZEd6KVn2xLaiQeaFTTfFTghFsJUM3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-arm64-musl": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.86.0.tgz", - "integrity": "sha512-2w5e5qiTBYQ0xc1aSY1GNyAOP9BQFEjN43FI3OhrRWZXHOj3inqcVSlptO/hHGK3Q2bG26kWLfSNFOEylTX39A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-riscv64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.86.0.tgz", - "integrity": "sha512-PfnTYm+vQ9X5VNXqs0Z3S67Xp2FoZj5RteYKUNwL+j/sxGi05eps+EWLVrcGsuN9x2GHFpTiqBz3lzERCn2USg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-s390x-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.86.0.tgz", - "integrity": "sha512-uHgGN0rFfqDcdkLUITshqrpV34PRKAiRwsw6Jgkg7CRcRGIU8rOJc568EU0jfhTZ1zO5MJKt/S8D6cgIFJwe0A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-x64-gnu": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.86.0.tgz", - "integrity": "sha512-MtrvfU2RkSD+oTnzG4Xle3jK8FXJPQa1MhYQm0ivcAMf0tUQDojTaqBtM/9E0iFr/4l1xZODJOHCGjLktdpykg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-linux-x64-musl": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-linux-x64-musl/-/binding-linux-x64-musl-0.86.0.tgz", - "integrity": "sha512-wTTTIPcnoS04SRJ7HuOL/VxIu1QzUtv2n6Mx0wPIEQobj2qPGum0qYGnFEMU0Njltp+8FAUg5EfX6u3udRQBbQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-wasm32-wasi": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-wasm32-wasi/-/binding-wasm32-wasi-0.86.0.tgz", - "integrity": "sha512-g+0bf+ZA2DvBHQ+0u8TvEY8ERo86Brqvdghfv06Wph2qGTlhzSmrE0c0Zurr7yhtqI5yZjMaBr2HbqwW1kHFng==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.3" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@oxc-transform/binding-win32-arm64-msvc": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.86.0.tgz", - "integrity": "sha512-dgBeU4qBEag0rhW3OT9YHgj4cvW51KZzrxhDQ1gAVX2fqgl+CeJnu0a9q+DMhefHrO3c8Yxwbt7NxUDmWGkEtg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" + "property-information": "^7.1.0", + "rehype-external-links": "^3.0.0", + "rehype-minify-whitespace": "^6.0.2", + "rehype-raw": "^7.0.0", + "rehype-remark": "^10.0.1", + "rehype-slug": "^6.0.0", + "rehype-sort-attribute-values": "^5.0.1", + "rehype-sort-attributes": "^5.0.1", + "remark-emoji": "^5.0.2", + "remark-gfm": "^4.0.1", + "remark-mdc": "v3.6.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-stringify": "^11.0.0", + "scule": "^1.3.0", + "shiki": "^3.12.2", + "ufo": "^1.6.1", + "unified": "^11.0.5", + "unist-builder": "^4.0.0", + "unist-util-visit": "^5.0.0", + "unwasm": "^0.3.11", + "vfile": "^6.0.3" } }, - "node_modules/@oxc-transform/binding-win32-x64-msvc": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.86.0.tgz", - "integrity": "sha512-M1eCl8xz7MmEatuqWdr+VdvNCUJ+d4ECF+HND39PqRCVkaH+Vl1rcyP5pLILb2CB/wTb2DMvZmb9RCt5+8S5TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" }, "node_modules/@parcel/watcher": { "version": "2.5.1", @@ -4702,22 +3216,10 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@polka/url": { "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, "license": "MIT" }, "node_modules/@popperjs/core": { @@ -4734,27 +3236,15 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.5.tgz", "integrity": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==", - "dev": true, "license": "MIT", "dependencies": { "kleur": "^4.1.5" } }, - "node_modules/@poppinss/colors/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@poppinss/dumper": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.4.tgz", "integrity": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==", - "dev": true, "license": "MIT", "dependencies": { "@poppinss/colors": "^4.1.5", @@ -4763,10 +3253,9 @@ } }, "node_modules/@poppinss/dumper/node_modules/@sindresorhus/is": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz", - "integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.1.0.tgz", + "integrity": "sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==", "license": "MIT", "engines": { "node": ">=18" @@ -4779,7 +3268,6 @@ "version": "10.2.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -4792,7 +3280,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.2.tgz", "integrity": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==", - "dev": true, "license": "MIT" }, "node_modules/@posthog/core": { @@ -4808,207 +3295,15 @@ "license": "MIT" }, "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", - "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", - "dev": true, + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz", + "integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==", "license": "MIT" }, - "node_modules/@rollup/plugin-alias": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", - "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.6.tgz", - "integrity": "sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "fdir": "^6.2.0", - "is-reference": "1.2.1", - "magic-string": "^0.30.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz", - "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", - "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/pluginutils": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -5027,27 +3322,13 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", - "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.2.tgz", + "integrity": "sha512-uLN8NAiFVIRKX9ZQha8wy6UUs06UNSZ32xj6giK/rmMXAgKahwExvK6SsmgU5/brh4w/nSgj8e0k3c1HBQpa0A==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5055,13 +3336,12 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", - "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.2.tgz", + "integrity": "sha512-oEouqQk2/zxxj22PNcGSskya+3kV0ZKH+nQxuCCOGJ4oTXBdNTbv+f/E3c74cNLeMO1S5wVWacSws10TTSB77g==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5069,9 +3349,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", - "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.2.tgz", + "integrity": "sha512-OZuTVTpj3CDSIxmPgGH8en/XtirV5nfljHZ3wrNwvgkT5DQLhIKAeuFSiwtbMto6oVexV0k1F1zqURPKf5rI1Q==", "cpu": [ "arm64" ], @@ -5082,9 +3362,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", - "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.2.tgz", + "integrity": "sha512-Wa/Wn8RFkIkr1vy1k1PB//VYhLnlnn5eaJkfTQKivirOvzu5uVd2It01ukeQstMursuz7S1bU+8WW+1UPXpa8A==", "cpu": [ "x64" ], @@ -5095,13 +3375,12 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", - "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.2.tgz", + "integrity": "sha512-QkzxvH3kYN9J1w7D1A+yIMdI1pPekD+pWx7G5rXgnIlQ1TVYVC6hLl7SOV9pi5q9uIDF9AuIGkuzcbF7+fAhow==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5109,13 +3388,12 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", - "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.2.tgz", + "integrity": "sha512-dkYXB0c2XAS3a3jmyDkX4Jk0m7gWLFzq1C3qUnJJ38AyxIF5G/dyS4N9B30nvFseCfgtCEdbYFhk0ChoCGxPog==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5123,13 +3401,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", - "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.2.tgz", + "integrity": "sha512-9VlPY/BN3AgbukfVHAB8zNFWB/lKEuvzRo1NKev0Po8sYFKx0i+AQlCYftgEjcL43F2h9Ui1ZSdVBc4En/sP2w==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5137,13 +3414,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", - "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.2.tgz", + "integrity": "sha512-+GdKWOvsifaYNlIVf07QYan1J5F141+vGm5/Y8b9uCZnG/nxoGqgCmR24mv0koIWWuqvFYnbURRqw1lv7IBINw==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5151,13 +3427,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", - "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.2.tgz", + "integrity": "sha512-df0Eou14ojtUdLQdPFnymEQteENwSJAdLf5KCDrmZNsy1c3YaCNaJvYsEUHnrg+/DLBH612/R0xd3dD03uz2dg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5165,27 +3440,25 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", - "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.2.tgz", + "integrity": "sha512-iPeouV0UIDtz8j1YFR4OJ/zf7evjauqv7jQ/EFs0ClIyL+by++hiaDAfFipjOgyz6y6xbDvJuiU4HwpVMpRFDQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", - "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.50.2.tgz", + "integrity": "sha512-OL6KaNvBopLlj5fTa5D5bau4W82f+1TyTZRr2BdnfsrnQnmdxh4okMxR2DcDkJuh4KeoQZVuvHvzuD/lyLn2Kw==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5193,13 +3466,12 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", - "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.2.tgz", + "integrity": "sha512-I21VJl1w6z/K5OTRl6aS9DDsqezEZ/yKpbqlvfHbW0CEF5IL8ATBMuUx6/mp683rKTK8thjs/0BaNrZLXetLag==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5207,13 +3479,12 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", - "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.2.tgz", + "integrity": "sha512-Hq6aQJT/qFFHrYMjS20nV+9SKrXL2lvFBENZoKfoTH2kKDOJqff5OSJr4x72ZaG/uUn+XmBnGhfr4lwMRrmqCQ==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5221,13 +3492,12 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", - "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.2.tgz", + "integrity": "sha512-82rBSEXRv5qtKyr0xZ/YMF531oj2AIpLZkeNYxmKNN6I2sVE9PGegN99tYDLK2fYHJITL1P2Lgb4ZXnv0PjQvw==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5235,13 +3505,12 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", - "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.2.tgz", + "integrity": "sha512-4Q3S3Hy7pC6uaRo9gtXUTJ+EKo9AKs3BXKc2jYypEcMQ49gDPFU2P1ariX9SEtBzE5egIX6fSUmbmGazwBVF9w==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5249,9 +3518,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", - "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.2.tgz", + "integrity": "sha512-9Jie/At6qk70dNIcopcL4p+1UirusEtznpNtcq/u/C5cC4HBX7qSGsYIcG6bdxj15EYWhHiu02YvmdPzylIZlA==", "cpu": [ "x64" ], @@ -5262,13 +3531,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", - "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.2.tgz", + "integrity": "sha512-HPNJwxPL3EmhzeAnsWQCM3DcoqOz3/IC6de9rWfGR8ZCuEHETi9km66bH/wG3YH0V3nyzyFEGUZeL5PKyy4xvw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5276,13 +3544,12 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", - "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.2.tgz", + "integrity": "sha512-nMKvq6FRHSzYfKLHZ+cChowlEkR2lj/V0jYj9JnGUVPL2/mIeFGmVM2mLaFeNa5Jev7W7TovXqXIG2d39y1KYA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5290,13 +3557,12 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", - "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.2.tgz", + "integrity": "sha512-eFUvvnTYEKeTyHEijQKz81bLrUQOXKZqECeiWH6tb8eXXbZk+CXSG2aFrig2BQ/pjiVRj36zysjgILkqarS2YA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5304,13 +3570,12 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", - "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.2.tgz", + "integrity": "sha512-cBaWmXqyfRhH8zmUxK3d3sAhEWLrtMjWBRwdMMHJIXSjvjLKvv49adxiEz+FJ8AP90apSDDBx2Tyd/WylV6ikA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -5318,49 +3583,17 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", - "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.2.tgz", + "integrity": "sha512-APwKy6YUhvZaEoHyM+9xqmTpviEI+9eL7LoCH+aLcvWYHJ663qG5zx7WzWZY+a9qkg5JtzcMyJ9z0WtQBMDmgA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@saslavik/nuxt-gtm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@saslavik/nuxt-gtm/-/nuxt-gtm-0.1.2.tgz", - "integrity": "sha512-nt7rCreXcdLv43g1dFl8tMZhyC97IOU+or0zMJ3Qo3du+6i1DGsr/Dw3Q8xu1AOQYunDQBZb5W9JOJNzCv3DZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@gtm-support/vue-gtm": "^2.0.0", - "@nuxt/kit": "^3.5.1", - "defu": "^6.1.2", - "sirv": "^2.0.3" - }, - "peerDependencies": { - "nuxt": ">=3.0.0" - } - }, - "node_modules/@saslavik/nuxt-gtm/node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } + ] }, "node_modules/@scarf/scarf": { "version": "1.4.0", @@ -5369,6 +3602,12 @@ "hasInstallScript": true, "license": "Apache-2.0" }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, "node_modules/@shikijs/core": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.12.2.tgz", @@ -5465,19 +3704,6 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -5498,45 +3724,20 @@ "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, "node_modules/@speed-highlight/core": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.7.tgz", "integrity": "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==", - "dev": true, "license": "CC0-1.0" }, - "node_modules/@sqlite.org/sqlite-wasm": { - "version": "3.50.4-build1", - "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.50.4-build1.tgz", - "integrity": "sha512-Qig2Wso7gPkU1PtXwFzndh+CTRzrIFxVGqv6eCetjU7YqxlHItj+GvQYwYTppCRgAPawtRN/4AJcEgB9xDHGug==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "sqlite-wasm": "bin/index.js" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "dev": true, - "license": "MIT" - }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.47.tgz", - "integrity": "sha512-oVsrb65yXetnjJ369uZYUntaOo3Nr7+oh+A6+TAsunXcYNwGkSzTZJtzSMHyLlEcNh8UouvAj3GI9MSV3XF5yA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.0.0-beta.48.tgz", + "integrity": "sha512-Euyqg5ueJEaNP3N0Gq62fl/713QM0EgmI03Jp2lJRCB7ew7QHfqrXKXnjVKUj450pZ54itmUPHEqg0U8VwgqIA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.0.0-beta.47", + "@swagger-api/apidom-error": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5544,14 +3745,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.47.tgz", - "integrity": "sha512-TsKbzKUmL0In3tZC0Stoz7GXoI4JtZXJT15BZbHWJeKlXNUi8S2cL0CoXK3+Dpm0fnElQ3xoGPWc2aivRaETPg==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.0.0-beta.48.tgz", + "integrity": "sha512-J5WWbd0Hhr3l9NgiqaPLDbStEtgcL0gsFwwt/CkaprCfTR4+jRoqs8kpAxO1mR2+MNLsdNeTbEdQQ3quD6L41Q==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", + "@swagger-api/apidom-ast": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -5561,37 +3762,37 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.47.tgz", - "integrity": "sha512-DxIEh/CZuYSjq75VNsS/VmntG/z5N4UsXaE9kdcsBFlFWyr8595UkbzahkwXR1BsaAmIuiBWAHkfkL08nppbzA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.0.0-beta.48.tgz", + "integrity": "sha512-f6zrC0D2hcOn+pHSOvL/uOrDTLAOVTOoi3OEA9NtxOwzJS6pJV1epG95Xn7CLSnZJoG/DRk4WMyWDUFbseekHg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.47.tgz", - "integrity": "sha512-O8l2MRhgQGnB9VrllYuxBER/w8TIgDnnWru/ox1p6VxS2rOcdXait/bc4Te4rVgW9mhq201ksk0tek7owFni6g==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.0.0-beta.48.tgz", + "integrity": "sha512-IvMZnNjHu+PdQ1hrAnNRewnxYp6WeZm488plnlmgz+BDQ/KQYfBtJ/5oqa+YGuitcNlJEl30g8CHsWOEsDvNwQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", "@swaggerexpert/json-pointer": "^2.10.1" } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.47.tgz", - "integrity": "sha512-4WxMGv0NjgRLrKovDdXncIQYJHPScc+EJpJLeofDfozzf9ZST4ATY9EaGG0HN2W4Ks8oqq5HZ16ehkbxM4BIVg==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.0.0-beta.48.tgz", + "integrity": "sha512-261lrM+dO00UkKVrdFJAuE6YIJnf1PsIVqBUHKbn8qND9MPl4vLcznoa0Uj2g/Adul723OxcTzXDiaGPNnJ/1A==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5599,15 +3800,15 @@ } }, "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.47.tgz", - "integrity": "sha512-jAx7P/JCX10kpdw4ytatAo7qujFzi3n9GsrMdFglEmoG9IOyZSVzs0l51/VFv9+3YrO4oVAYrcPJC/q9zMebmw==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.0.0-beta.48.tgz", + "integrity": "sha512-8vrBh8/OaEls89xB2H/V39ioo6zTIDooFdZYWlZekBJOUt7k1q3fpWoTtj+OC/tmUAlMAN0JSImb5WnPxh2BTg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5615,15 +3816,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.47.tgz", - "integrity": "sha512-I65p3z2EhcWatsfwyEv48qFOEXGI/YECisxFMp7dpvC744910NRWj0S9Tyvle3iaFOnTbfzfhpunyie3vEl4WQ==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.0.0-beta.48.tgz", + "integrity": "sha512-FyZ8TrUU+6ZholTHw6VzAQdUErLp/cYmR9TKP/AWc1lN/iSnkWI9hzHIR2vxNPmV0+0ykshtVILW4E1d/MYW6Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5631,15 +3832,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.47.tgz", - "integrity": "sha512-Fx0Vxi8uIbL8G6oEKu45Yxu7zkyMS1Z5uT9r1VHSWoIviiK7GSWor91whdjJxzF58hmsiq4WTXtvP5Yx/uSLTg==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.0.0-beta.48.tgz", + "integrity": "sha512-bpNlGwP6ImODwyzQFnV6700KPjWO/+7epVNHrXoHAK1Go55oHsZZ/bfJiRX1F44Vs6VzVvdsGvCX+DH5Ig3fqQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5647,15 +3848,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.47.tgz", - "integrity": "sha512-VJMDct86oAg/GGllXXP3tVwlFBa3A+qoRZLO5zZMs4oEoNWdZbB8JJmzsSr8JRu4monU/Hfqa1UGzTNZaw2bZQ==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.0.0-beta.48.tgz", + "integrity": "sha512-YQkXnqHf7TrQZHSbSOudA+7g7ItQi7hW+H3IZK8XDYaOxcqtKhwSvIl2/L8zEUrZ/d3ObAlK/vUs+6WX8u9Ktg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5663,14 +3864,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.47.tgz", - "integrity": "sha512-ETExA5eiNyBaDUAyKws0jyA1gNlT4vwjyXRBLck/upJTdTXu+kuNWqC1DHNCvkfnfNPON1REzKysr+6NKHayRQ==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.0.0-beta.48.tgz", + "integrity": "sha512-Kv8wkL1kGrdnmTU0s5EPaoRDMWDualWqCLW7bxvhtczUsmHXQLpvD5pKHsBEF731MkZovtxMWEvBMZZrft1jeg==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.47", - "@swagger-api/apidom-core": "^1.0.0-beta.47", + "@swagger-api/apidom-ast": "^1.0.0-beta.48", + "@swagger-api/apidom-core": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5678,15 +3879,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.47.tgz", - "integrity": "sha512-Qcp83uHhYcO9cL+NOtlLP67ymfnHqk4UmrsLUWNklNe3Xff5Ry/HdwIkCH3Mo99EY1w+cgXy4E3e9OO+YK1OQA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.0.0-beta.48.tgz", + "integrity": "sha512-cUeltQJmAre1P8n3rr6aURKvIy82845ZqD0I0s93qXPXbJ8tI74P2GSFbT/o2K8mOcltDgt/6hfsBbxuPkKN4g==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5694,15 +3895,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.47.tgz", - "integrity": "sha512-oOhh+2fnUf/fEPx8ZgGgWALVEVmuJMdIEmyH/QWu+ROFP+S7/waf+gcVQvUk2+CRXBZIwKSQ5dtQyS6UduC79Q==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.0.0-beta.48.tgz", + "integrity": "sha512-lJpzZKWurhvI/PlpCIG6lHGnYpx+O2m9HwXFuy0n0bj59hrxbLqQAg94cEc8u0ix8jPWQaBY5Bicm+/9/BsLUw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5710,16 +3911,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.47.tgz", - "integrity": "sha512-TiDRsmwhj8SsR59CPT65dSitn/p3lNOxE89FPTgmzj4dH9+GXq8OD9PNOvDi14NwdqWNTy5VO265AeThbkLYtw==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.0.0-beta.48.tgz", + "integrity": "sha512-oDtcNpWevXZG3X4GJLhsBIZ7kD/TbIsZ9c/bjbW1DfEhKemkpayO0zDRpNVqEoCmp3BI/6Iye0cjxPQhavd49A==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5727,15 +3928,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.47.tgz", - "integrity": "sha512-6Or7Lb/Q+tU+16ZvHjmUVA8qorf7xMgkN9g6bY3WdtCZvj5vjaWWKAAVCYbblE2aOixjXW59IO21folDkFsbVA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.0.0-beta.48.tgz", + "integrity": "sha512-1lKdHHmJOBvKGQJMSZU5d5EeYu1JvcXZEZlVtnM2UBig70+RG2oDzZUfkrwgfLp47QbE34fqJdJU7YiwqetGhA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5743,17 +3944,17 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.47.tgz", - "integrity": "sha512-Ecl+fpKQUj84rUAXvi9e7GHN8IQX75ZhaLnry+zjzHabxvd6XRDrQIg5h9CErNcvRKzbN3hQVJziL958FFr9cg==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.0.0-beta.48.tgz", + "integrity": "sha512-d2q3aPK7/s6YfQGwL9M4AB6aC2Z4HjpGLO8nFzrnzdHxJeW0+PVEaZ3+vwCestZvm5KENwXi2E6wtdDk5jBMIw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.47", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-json-pointer": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.47", + "@swagger-api/apidom-ast": "^1.0.0-beta.48", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-json-pointer": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5761,112 +3962,112 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.47.tgz", - "integrity": "sha512-0XPt5oekb8WMw/Uc9Lg8gULd04iYZsNGLiJvmwWmLSXtkM6+A4NbGAI3yqKjx0xIvPbE9zGYWUJ5lUW+/mfkag==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.0.0-beta.48.tgz", + "integrity": "sha512-9PbK8sLotn1VoEnR1CIRGc1ZABNYWCUWvtZ0Q1CKEn+/O6kuJ7t8+sW1gNcULV/t0YPqMfrkAd+YA3+eDki4zw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.47.tgz", - "integrity": "sha512-0QUsN/6z7LJEOJK4EwuffQUwhsZVaohdO7gY/EkXzysdX0nXtgQoHNjD2NPfYQ1UK9YzCqqTGbUPZatr0gLQ8A==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.0.0-beta.48.tgz", + "integrity": "sha512-K7b0wLtq3vUovr0TnIlr02TexGB1zj1LQmU5YFNZEntg+H/pA7dWSVISbpfR58NDhNEZ7JETJJwhDqOVQufbEw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-api-design-systems": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.47.tgz", - "integrity": "sha512-4kR02c2/LJKRWb0hBe7vHmlTkMU8rPzz8AHhvxndvVMV3eqJBig+JV07hZNjPl8EyFp5i2TFAOiZ5NTgWkdUPA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.0.0-beta.48.tgz", + "integrity": "sha512-ILiUAYb9wOBHpjlxd2LkC/2QJQCPD9Uj0U4TAKnRieR/yAQzbjIKYt1kvWr3A7CIOMlZQE3orE6d9I//J0SENQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.47.tgz", - "integrity": "sha512-OdFs6LlDamNS4zTx2+KmrLHinJ53PU6Zyr3EVnLlt1fWgAU+yeBwZriuPf/s9qlou7CexUmIE4jxG3WaxR2HDQ==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.0.0-beta.48.tgz", + "integrity": "sha512-KzsskMDhoukAJxC7Q94+4Ad5qmU7JYp/LI1r2VpH/ePzjMfQlMSNi16n4Iob4POBuFTej0CgJjnC1geXhVp6Nw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-arazzo-1": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.47.tgz", - "integrity": "sha512-TublzUaytvg0GErRaujvJDaK+uiz6bG1v4Uh558CH/M54iIUiUkb0trTcn3dfBikryOkRHUMjQPJqQaqvPF4ew==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.0.0-beta.48.tgz", + "integrity": "sha512-oIm4Rc+jWZspkS5LMgt4SyX7WzV+UufelzRZ/UAD7daGQmbNA7NnRmR/1Nbm+CUu9bqXTIDW84UP1GqgOfbc4Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.47.tgz", - "integrity": "sha512-tcJV1GF6p1QxwXUlrZlLh9eHfiGem8Ez+hVEttEdQn12251K2oDcbUXSwMAKwnVJTyMUUhHEzuUu+jCXnM4x9w==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.0.0-beta.48.tgz", + "integrity": "sha512-roErhkfaRjCOGUu+JMbWApP7dDLgW+6lHJy3/iMIxo/jU3fvLyjvJdualzPNOmr4z08ocBwZJErkI3dmUG/Rzg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-asyncapi-2": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.47.tgz", - "integrity": "sha512-UJScI1+FuAoflP7yM+uluKpJ9kVRxHnlZ5QJFdBys/ZDfi+3exrG5lFnniQgUWHgsIUc75PlnCo6HvRFNenkfw==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.0.0-beta.48.tgz", + "integrity": "sha512-9AlHpfNkL0BoKyTF4MrUJuST8JzsJYUjq0LRTmut1xTRM/qzvteXPymUo8vuTpyPqEhMneGTseeu3YAPplSOmA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.47", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", + "@swagger-api/apidom-ast": "^1.0.0-beta.48", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -5876,112 +4077,112 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.47.tgz", - "integrity": "sha512-n2L6Zf5FJB3ARPT2zebg28pmpSEXzKjxxDLmfgBWvy51U6ifIFXthKelhAbLEBar/hd1esBun7Mckt9IqQ+M2g==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.0.0-beta.48.tgz", + "integrity": "sha512-N08FmErRUzTNeKscLGs1IO5a3M5JXo4EsyOAZu47xYke7WFihK8QzDK/W4zvWdnm5zAh5NqzmVqB64uzVYjCOw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.47.tgz", - "integrity": "sha512-lEvsx7OvZTd/3faQs5eZSMd7+P5UNefO9TyrhZYApxXieK3BOPBMrwBb99a31DkyWfmht52lLqPuoWmJWKLdug==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.0.0-beta.48.tgz", + "integrity": "sha512-0tLMHyuBLYiTkzwCONQmarL1gjGc1LP/V2FnmBUAFl2ShV1ErIlW9OhmM9x0ZlpxUhktOJMlbQsX8FNSOOExBA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.47.tgz", - "integrity": "sha512-j09UQ8lcSSjhIJOcD12YuTVNSgW1SXcL+3D1DXesC3p87lEJ/wt+Agp409SyNvP1JrG3+u2d1TVHpSgVyYaUVA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.0.0-beta.48.tgz", + "integrity": "sha512-DPV7oN8SQKgmj9OIT05vNTDoYlV1sxgvFMFbX+b2ph0i+YU0PToOt/BYMFjmfz/EdqyQpXqEFilhA4zXf0OHfA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-json": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.47.tgz", - "integrity": "sha512-guXJChf6Lod0lXiJpdM5BOdHxBH+SFxTaIL58tbgdo6OnYbGwxgETdAAoM15Wg/PV3EAj+sW6VwEoVy9ZuOu0Q==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.0.0-beta.48.tgz", + "integrity": "sha512-fKA1y9KgFzUhtbWduJBM8s8hRxBvcAx6iXcr4A2mTqeQcSYFyX9HyBeIdAyFJXGladGW+AZOdg1HatP7IMevDQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-2": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.47.tgz", - "integrity": "sha512-ddNiHVh8BlCIF0x7Q2chkOt8ZGExIDaEk2DXK1pSG0w6EOlHnKMjH9ersV41oWcMtzYEv1Bg0cKJRMmI2wyi5w==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.0.0-beta.48.tgz", + "integrity": "sha512-bT1HB285oXrGY6fqKm5rDY/xTHeGOopv4yTrOYwTVMbGdc7RU8jrJ2eAsRMnv6AgRH9HeOEE5Uf2sCUS8LdYtQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-3-0": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.47.tgz", - "integrity": "sha512-cNa9/VmeECgZIGTOAz3pFgEQ06XJ0L6m4uEqA4i/uqBgPeAdGCTkYYzXKBLz2/H0JFTZCmVLJTJCKMwj3lOZNQ==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.0.0-beta.48.tgz", + "integrity": "sha512-jAB1OwPRcMR1nwFSy+U+qjCXZArATifnQhEfxsAU0TUtP3um5bHdz1ALwjS1zUBMhySE4MXiPsvI4O4Tl0BC6Q==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.47", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-ns-openapi-3-1": "^1.0.0-beta.48", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.47.tgz", - "integrity": "sha512-60KES2FGgtGZPcpaHmwZwW9j1S5rjMX55s+OyvPPPz/gz++Jk5I6klrkdodnqzMwVAfvlHnsTzDpw9a1haS6aA==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.0.0-beta.48.tgz", + "integrity": "sha512-FXKjiBbSCw3ZgZKjVgo7bOdrSIr8ltJDR4SaEaqzXTFXOhpHln0idJSnfJoMnvHJH0oSieKiHbPs1+OjHXmK5A==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.0.0-beta.47", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", + "@swagger-api/apidom-ast": "^1.0.0-beta.48", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", @@ -6033,14 +4234,14 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.47.tgz", - "integrity": "sha512-C7QFRUo5wLG/WYKqt5MfithG/eOYbBvV+fVpoO7HJb32tOFLcXoA3fberxnRaTMSguC8U4ajIteMayRwCq3Ksg==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.0.0-beta.48.tgz", + "integrity": "sha512-Z11xCSDC9Y6/cOvrKlqLMCZxyj/s2xctE5CCL2N+GHhNdZGSF7YoRRms84X9Rs2qZ8YQCZo5QlV3KwweHnLB2w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.0.0-beta.47", - "@swagger-api/apidom-error": "^1.0.0-beta.47", + "@swagger-api/apidom-core": "^1.0.0-beta.48", + "@swagger-api/apidom-error": "^1.0.0-beta.48", "@types/ramda": "~0.30.0", "axios": "^1.9.0", "minimatch": "^7.4.3", @@ -6158,35 +4359,22 @@ "node": ">=10" } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": ">=10.13.0" + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" } }, - "node_modules/@tusbar/cache-control": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tusbar/cache-control/-/cache-control-1.0.2.tgz", - "integrity": "sha512-PXfjYTYBVvMPYCLDWj+xIOA9ITFbbhWCHzLcqUCJ5TPGm4JO4cxpGb7x3K8Q1K1ADgNgfBxLsDcTMVRydtZB9A==", + "node_modules/@types/aos": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/aos/-/aos-3.0.7.tgz", + "integrity": "sha512-sEhyFqvKauUJZDbvAB3Pggynrq6g+2PS4XB3tmUr+mDL1gfDJnwslUC4QQ7/l8UD+LWpr3RxZVR/rHoZrLqZVg==", "dev": true, "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -6232,6 +4420,16 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/bootstrap": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.2.10.tgz", + "integrity": "sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.2" + } + }, "node_modules/@types/d3": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", @@ -6271,9 +4469,9 @@ } }, "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", "license": "MIT" }, "node_modules/@types/d3-axis": { @@ -6500,6 +4698,24 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/fontkit": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/geojson": { "version": "7946.0.16", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", @@ -6552,20 +4768,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -6575,28 +4777,35 @@ "@types/unist": "*" } }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, - "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", - "dev": true, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "@types/unist": "*" } }, - "node_modules/@types/parse-path": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", - "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==", - "dev": true, - "license": "MIT" + "node_modules/@types/node": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.4.0.tgz", + "integrity": "sha512-gUuVEAK4/u6F9wRLznPUU4WGUacSEBDPoC2TrBkw3GAnOLHBL45QdfHOXp1kJ4ypBGLxTOB+t7NJLpKoC3gznQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.11.0" + } }, "node_modules/@types/ramda": { "version": "0.30.2", @@ -6607,13 +4816,6 @@ "types-ramda": "^0.30.1" } }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -6662,174 +4864,38 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, - "node_modules/@unhead/vue": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-2.0.14.tgz", - "integrity": "sha512-Ym9f+Kd2Afqek2FtUHvYvK+j2uZ2vbZ6Rr9NCnNGGBMdmafAuiZpT117YGyh0ARcueL6Znia0U8ySqPsnHOZIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hookable": "^5.5.3", - "unhead": "2.0.14" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": ">=3.5.18" - } - }, - "node_modules/@vercel/nft": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.30.1.tgz", - "integrity": "sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^10.4.5", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vercel/nft/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vercel/nft/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vercel/nft/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@vitejs/plugin-vue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", - "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", - "dev": true, + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.29" - }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "node_modules/@vitejs/plugin-vue-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-5.1.1.tgz", - "integrity": "sha512-uQkfxzlF8SGHJJVH966lFTdjM/lGcwJGzwAHpVqAPDD/QcsqoUGa+q31ox1BrUfi+FLP2ChVp7uLXE3DkHyDdQ==", - "dev": true, + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.2.0.tgz", + "integrity": "sha512-DSTrmrdLp+0LDNF77fqrKfx7X0ErRbOcUAgJL/HbSesqQwoUvUQ4uYQqaex+rovqgGcoPqVk+AwUh3v9CuiYIw==", "license": "MIT", "dependencies": { - "@babel/core": "^7.28.3", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/plugin-transform-typescript": "^7.28.0", - "@rolldown/pluginutils": "^1.0.0-beta.34", - "@vue/babel-plugin-jsx": "^1.5.0" + "@babel/core": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1", + "@rolldown/pluginutils": "^1.0.0-beta.9", + "@vue/babel-plugin-jsx": "^1.4.0" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vite": "^5.0.0 || ^6.0.0", "vue": "^3.0.0" } }, - "node_modules/@vitejs/plugin-vue-jsx/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.36.tgz", - "integrity": "sha512-qa+gfzhv0/Xv52zZInENLu6JbsnSjSExD7kTaNm7Qn5LUIH6IQb7l9pB+NrsU5/Bvt9aqcBTdRGc7x1DYMTiqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/language-core": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.23.tgz", - "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.23" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.23.tgz", - "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.23.tgz", - "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.23", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, "node_modules/@vue-flow/background": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@vue-flow/background/-/background-1.3.2.tgz", @@ -6851,9 +4917,9 @@ } }, "node_modules/@vue-flow/core": { - "version": "1.46.3", - "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.46.3.tgz", - "integrity": "sha512-OiR3vrfxvgBmR6N5zw6H4eRvs/51hj3orMktqw4b/nWq0BydWlY+PquTe/Kcw6A7RRqPu51XqOOvUm5aPw5fcg==", + "version": "1.46.4", + "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.46.4.tgz", + "integrity": "sha512-qswfL4acg74wAG8/+x6cryctSzmTfSAi/KOZLWlb3yyIPCK6fG+flGwB2VqDQrlYvZEY8HClJOWQty+T2UpWXg==", "license": "MIT", "dependencies": { "@vueuse/core": "^10.5.0", @@ -6960,46 +5026,16 @@ } } }, - "node_modules/@vue-macros/common": { - "version": "3.0.0-beta.16", - "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.0.0-beta.16.tgz", - "integrity": "sha512-8O2gWxWFiaoNkk7PGi0+p7NPGe/f8xJ3/INUufvje/RZOs7sJvlI1jnR4lydtRFa/mU0ylMXUXXjSK0fHDEYTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-sfc": "^3.5.17", - "ast-kit": "^2.1.1", - "local-pkg": "^1.1.1", - "magic-string-ast": "^1.0.0", - "unplugin-utils": "^0.2.4" - }, - "engines": { - "node": ">=20.18.0" - }, - "funding": { - "url": "https://github.com/sponsors/vue-macros" - }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, "node_modules/@vue/babel-helper-vue-transform-on": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", - "dev": true, "license": "MIT" }, "node_modules/@vue/babel-plugin-jsx": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -7025,7 +5061,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -7091,17 +5126,6 @@ "@vue/shared": "3.5.21" } }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/@vue/devtools-api": { "version": "6.6.4", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", @@ -7112,7 +5136,6 @@ "version": "7.7.7", "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.7.tgz", "integrity": "sha512-9z9TLbfC+AjAi1PQyWX+OErjIaJmdFlbDHcD+cAMYKY6Bh5VlsAtCeGyRMrXwIlMEQPukvnWt3gZBLwTAIMKzQ==", - "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-kit": "^7.7.7", @@ -7130,7 +5153,6 @@ "version": "7.7.7", "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", - "dev": true, "license": "MIT", "dependencies": { "@vue/devtools-shared": "^7.7.7", @@ -7146,50 +5168,11 @@ "version": "7.7.7", "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", - "dev": true, "license": "MIT", "dependencies": { "rfdc": "^1.4.1" } }, - "node_modules/@vue/language-core": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.8.tgz", - "integrity": "sha512-eYs6PF7bxoPYvek9qxceo1BCwFbJZYqJll+WaYC8o8ec60exqj+n+QRGGiJHSeUfYp0hDxARbMdxMq/fbPgU5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.23", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^2.0.5", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1", - "picomatch": "^4.0.2" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@vue/reactivity": { "version": "3.5.21", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.21.tgz", @@ -7278,36 +5261,6 @@ "vue": "^3.5.0" } }, - "node_modules/@webcontainer/env": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz", - "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==", - "dev": true, - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -7320,43 +5273,53 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "license": "MIT", "peerDependencies": { - "acorn": "^8" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/alien-signals": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-2.0.7.tgz", - "integrity": "sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg==", - "dev": true, - "license": "MIT" - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -7373,11 +5336,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -7396,16 +5371,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansis": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.1.0.tgz", - "integrity": "sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -7419,11 +5384,22 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/aos": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz", "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==", - "dev": true, "license": "MIT", "dependencies": { "classlist-polyfill": "^1.0.3", @@ -7437,192 +5413,161 @@ "integrity": "sha512-SlI+nLMQDzCZfS39ihzjGp3JNBQfJXyMi6cg9tkLOCPVErgFsUIAEdO9IezR7kbP5Xd0ozcPNQBkf9TO5cHgWw==", "license": "BSD-2-Clause" }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", "engines": { - "node": ">= 14" + "node": ">= 0.4" } }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "astring": "bin/astring" } }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", + "node_modules/astro": { + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.14.1.tgz", + "integrity": "sha512-gPa8NY7/lP8j8g81iy8UwANF3+aukKRWS68IlthZQNgykpg80ne6lbHOp6FErYycxQ1TUhgEfkXVDQZAoJx8Bg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@astrojs/compiler": "^2.12.2", + "@astrojs/internal-helpers": "0.7.3", + "@astrojs/markdown-remark": "6.3.7", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^2.4.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.2.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.0.2", + "cssesc": "^3.0.0", + "debug": "^4.4.1", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.3.2", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.3.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.18", + "magicast": "^0.3.5", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.0", + "package-manager-detector": "^1.3.0", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.2", + "shiki": "^3.12.0", + "smol-toml": "^1.4.2", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.5.2", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.0", + "vfile": "^6.0.3", + "vite": "^6.3.6", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.24.6", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/ast-kit": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.1.2.tgz", - "integrity": "sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g==", - "dev": true, + "node_modules/astro-expressive-code": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.3.tgz", + "integrity": "sha512-u+zHMqo/QNLE2eqYRCrK3+XMlKakv33Bzuz+56V1gs8H0y6TZ0hIi3VNbIxeTn51NLn+mJfUV/A0kMNfE4rANw==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "pathe": "^2.0.3" + "rehype-expressive-code": "^0.41.3" }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0" + } + }, + "node_modules/astro/node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", "engines": { - "node": ">=20.18.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "node": ">=0.3.1" } }, - "node_modules/ast-walker-scope": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.8.2.tgz", - "integrity": "sha512-3pYeLyDZ6nJew9QeBhS4Nly02269Dkdk32+zdbbKmL6n4ZuaGorwwA+xx12xgOciA8BF1w9x+dlH7oUkFTW91w==", - "dev": true, + "node_modules/astro/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "ast-kit": "^2.1.2" - }, - "engines": { - "node": ">=20.18.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "@types/estree": "^1.0.0" } }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true, - "license": "MIT" - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/axios": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", @@ -7634,12 +5579,14 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true, - "license": "Apache-2.0" + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } }, "node_modules/babel-jest": { "version": "29.7.0", @@ -7784,115 +5731,44 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", - "dev": true, - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.3.tgz", - "integrity": "sha512-1aGs5pRVLToMQ79elP+7cc0u0s/wXAzfBv/7hDloT7WFggLqECCas5qqPky7WHCFdsBH5WDq6sD4fAoz5sJbtA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, - "license": "Apache-2.0", - "optional": true, + "license": "MIT", "dependencies": { - "streamx": "^2.21.0" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -7922,6 +5798,25 @@ ], "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.4.tgz", + "integrity": "sha512-L+YvJwGAgwJBV1p6ffpSTa2KRc69EeeYGYjRVWKs0GKrK+LON0GC0gV+rKSNtALEDvMDqkvCFq9r1r94/Gjwxw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/better-sqlite3": { "version": "12.2.0", "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.2.0.tgz", @@ -7949,7 +5844,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -8008,7 +5902,26 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", - "dev": true, + "license": "MIT" + }, + "node_modules/blob-to-buffer": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/blob-to-buffer/-/blob-to-buffer-1.2.9.tgz", + "integrity": "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, "node_modules/boolbase": { @@ -8036,6 +5949,28 @@ "@popperjs/core": "^2.11.8" } }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -8057,11 +5992,19 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { - "version": "4.25.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", - "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", - "dev": true, + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.0.tgz", + "integrity": "sha512-P9go2WrP9FiPwLv3zqRD/Uoxo0RSHjzFCiQz7d4vbmwNqQFo9T9WCeP/Qn5EbcKQY6DBbkxEXNcpJOmncNrb7A==", "funding": [ { "type": "opencollective", @@ -8078,9 +6021,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001737", - "electron-to-chromium": "^1.5.211", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.2", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -8124,28 +6068,17 @@ "ieee754": "^1.2.1" } }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" @@ -8158,22 +6091,22 @@ } }, "node_modules/c12": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.2.0.tgz", - "integrity": "sha512-ixkEtbYafL56E6HiFuonMm1ZjoKtIo7TH68/uiEq4DAwv9NcUX2nJ95F8TrbMeNjqIkZpruo3ojXQJ+MGG5gcQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.0.tgz", + "integrity": "sha512-K9ZkuyeJQeqLEyqldbYLG3wjqwpw4BVaAqvmxq3GYKK0b1A/yYQdIcJxkzAOWcNVWhJpRXAPfZFueekiY/L8Dw==", "license": "MIT", "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", - "dotenv": "^17.2.1", + "dotenv": "^17.2.2", "exsolve": "^1.0.7", "giget": "^2.0.0", "jiti": "^2.5.1", "ohash": "^2.0.11", "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", + "perfect-debounce": "^2.0.0", + "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { @@ -8185,15 +6118,11 @@ } } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "node_modules/c12/node_modules/perfect-debounce": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", + "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", + "license": "MIT" }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", @@ -8219,33 +6148,21 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { "version": "1.0.30001741", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -8276,7 +6193,6 @@ "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -8375,21 +6291,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "funding": [ { "type": "github", @@ -8421,9 +6326,20 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz", "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==", - "dev": true, "license": "Unlicense" }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clipboardy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", @@ -8456,12 +6372,87 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "devOptional": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -8477,6 +6468,16 @@ "node": ">= 0.12.0" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -8525,13 +6526,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true, - "license": "MIT" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -8546,67 +6540,29 @@ }, "node_modules/comma-separated-tokens": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/compatx": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.2.0.tgz", - "integrity": "sha512-6gLRNt4ygsi5NyMVhceOCFv14CIdDFN7fQjX1U4+47qVE/+kjPoXMK65KWK+dWxmFzMTuKazoQ9sch6pM0p5oA==", - "dev": true, - "license": "MIT" - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8633,14 +6589,12 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -8656,7 +6610,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dev": true, "license": "MIT", "dependencies": { "is-what": "^4.1.8" @@ -8690,13 +6643,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cose-base": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", @@ -8706,33 +6652,6 @@ "layout-base": "^1.0.0" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -8788,14 +6707,13 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/croner": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/croner/-/croner-9.1.0.tgz", - "integrity": "sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==", - "dev": true, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", "license": "MIT", - "engines": { - "node": ">=18.0" + "dependencies": { + "node-fetch": "^2.7.0" } }, "node_modules/cross-spawn": { @@ -8842,19 +6760,6 @@ "uncrypto": "^0.1.3" } }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, "node_modules/css-select": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", @@ -8871,6 +6776,22 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-selector-parser": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.1.3.tgz", + "integrity": "sha512-gJMigczVZqYAk0hPVzx/M4Hm1D9QOtqkdQk9005TNzDIUGzo5cnHEDiKUT7jGPximL/oYb+LIitcHFQ4aKupxg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/css-tree": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", @@ -8900,7 +6821,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -8915,85 +6835,6 @@ "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", "license": "MIT" }, - "node_modules/cssnano": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.1.tgz", - "integrity": "sha512-fm4D8ti0dQmFPeF8DXSAA//btEmqCOgAc/9Oa3C1LW94h5usNrJEfrON7b4FkPZgnDEn6OUs5NdxiJZmAtGOpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^7.0.9", - "lilconfig": "^3.1.3" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/cssnano-preset-default": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.9.tgz", - "integrity": "sha512-tCD6AAFgYBOVpMBX41KjbvRh9c2uUjLXRyV7KHSIrwHiq5Z9o0TFfUCoM3TwVrRsRteN3sVXGNvjVNxYzkpTsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.1", - "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.4", - "postcss-convert-values": "^7.0.7", - "postcss-discard-comments": "^7.0.4", - "postcss-discard-duplicates": "^7.0.2", - "postcss-discard-empty": "^7.0.1", - "postcss-discard-overridden": "^7.0.1", - "postcss-merge-longhand": "^7.0.5", - "postcss-merge-rules": "^7.0.6", - "postcss-minify-font-values": "^7.0.1", - "postcss-minify-gradients": "^7.0.1", - "postcss-minify-params": "^7.0.4", - "postcss-minify-selectors": "^7.0.5", - "postcss-normalize-charset": "^7.0.1", - "postcss-normalize-display-values": "^7.0.1", - "postcss-normalize-positions": "^7.0.1", - "postcss-normalize-repeat-style": "^7.0.1", - "postcss-normalize-string": "^7.0.1", - "postcss-normalize-timing-functions": "^7.0.1", - "postcss-normalize-unicode": "^7.0.4", - "postcss-normalize-url": "^7.0.1", - "postcss-normalize-whitespace": "^7.0.1", - "postcss-ordered-values": "^7.0.2", - "postcss-reduce-initial": "^7.0.4", - "postcss-reduce-transforms": "^7.0.1", - "postcss-svgo": "^7.1.0", - "postcss-unique-selectors": "^7.0.4" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/cssnano-utils": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.1.tgz", - "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -9553,8 +7394,9 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/db0/-/db0-0.3.2.tgz", "integrity": "sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==", - "devOptional": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", @@ -9584,17 +7426,10 @@ } } }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9673,7 +7508,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", @@ -9690,7 +7524,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -9699,16 +7532,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/defu": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", @@ -9737,22 +7560,13 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "devOptional": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -9800,11 +7614,22 @@ "node": ">=8" } }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/devalue": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz", "integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==", - "dev": true, "license": "MIT" }, "node_modules/devlop": { @@ -9820,15 +7645,11 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -9840,6 +7661,25 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -9904,35 +7744,6 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/dot-prop": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", - "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^4.18.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dot-prop/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dotenv": { "version": "17.2.2", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", @@ -9954,6 +7765,15 @@ "node": ">=4" } }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -9968,32 +7788,10 @@ "node": ">= 0.4" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { - "version": "1.5.215", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz", - "integrity": "sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==", - "dev": true, + "version": "1.5.218", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.218.tgz", + "integrity": "sha512-uwwdN0TUHs8u6iRgN8vKeWZMRll4gBkz+QMqdS7DDe49uiK68/UX92lFb61oiFPrpYZNeZIqa4bA7O6Aiasnzg==", "license": "ISC" }, "node_modules/emittery": { @@ -10010,10 +7808,9 @@ } }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "license": "MIT" }, "node_modules/emojilib": { @@ -10021,98 +7818,24 @@ "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", "license": "MIT" - }, - "node_modules/emoticon": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", - "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", - "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "dev": true, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", - "engines": { - "node": ">=10.0.0" + "dependencies": { + "once": "^1.4.0" } }, "node_modules/entities": { @@ -10128,9 +7851,9 @@ } }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10141,7 +7864,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -10175,7 +7897,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { @@ -10205,11 +7926,42 @@ "node": ">= 0.4" } }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -10251,19 +8003,11 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -10290,6 +8034,106 @@ "node": ">=4" } }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -10305,25 +8149,11 @@ "node": ">= 0.6" } }, - "node_modules/event-target-shim": { + "node_modules/eventemitter3": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" }, "node_modules/eventsource-parser": { "version": "3.0.6", @@ -10370,7 +8200,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -10405,6 +8234,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/expressive-code": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.3.tgz", + "integrity": "sha512-YLnD62jfgBZYrXIPQcJ0a51Afv9h8VlWqEGK9uU2T5nL/5rb8SnA86+7+mgCZe5D34Tff5RNEA5hjNVJYHzrFg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.3", + "@expressive-code/plugin-frames": "^0.41.3", + "@expressive-code/plugin-shiki": "^0.41.3", + "@expressive-code/plugin-text-markers": "^0.41.3" + } + }, "node_modules/exsolve": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", @@ -10417,30 +8258,12 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "license": "MIT" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/fast-json-patch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", @@ -10454,45 +8277,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-npm-meta": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-0.4.6.tgz", - "integrity": "sha512-zbBBOAOlzxfrU4WSnbCHk/nR6Vf32lSEPxDEvNOR08Z5DSZ/A6qJu0rqrHVcexBTd1hc2gim998xnqF/R1PuEw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -10503,12 +8287,44 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fflate": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", "license": "MIT" }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -10553,6 +8369,15 @@ "node": ">=18" } }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -10573,21 +8398,31 @@ } } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", + "node_modules/fontace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.0.tgz", + "integrity": "sha512-czoqATrcnxgWb/nAkfyIrRp6Q8biYj7nGnL6zfhTcX+JKKpWHFBnb8uNMw/kZr7u++3Y3wYSYoZgHkCcsuBpBg==", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@types/fontkit": "^2.0.8", + "fontkit": "^2.0.4" + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" } }, "node_modules/form-data": { @@ -10606,36 +8441,26 @@ "node": ">= 6" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, + "node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -10647,7 +8472,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -10667,21 +8491,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fuse.js": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -10694,7 +8507,19 @@ "dev": true, "license": "ISC", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-intrinsic": { @@ -10779,27 +8604,6 @@ "giget": "dist/cli.mjs" } }, - "node_modules/git-up": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", - "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^9.2.0" - } - }, - "node_modules/git-url-parse": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", - "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", - "dev": true, - "license": "MIT", - "dependencies": { - "git-up": "^8.1.0" - } - }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -10834,24 +8638,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { @@ -10878,22 +8668,6 @@ "node": "*" } }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "15.15.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", @@ -10906,40 +8680,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -10956,7 +8696,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "license": "ISC" }, "node_modules/graphlib": { @@ -10969,22 +8708,6 @@ "lodash": "^4.17.15" } }, - "node_modules/gzip-size": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", - "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", - "dev": true, - "license": "MIT", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/h3": { "version": "1.15.4", "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", @@ -11002,19 +8725,6 @@ "uncrypto": "^0.1.3" } }, - "node_modules/h3-compression": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/h3-compression/-/h3-compression-0.3.2.tgz", - "integrity": "sha512-B+yCKyDRnO0BXSfjAP4tCXJgJwmnKp3GyH5Yh66mY9KuOCrrGQSPk/gBFG2TgH7OyB/6mvqNZ1X0XNVuy0qRsw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/codedredd" - }, - "peerDependencies": { - "h3": "^1.6.0" - } - }, "node_modules/hachure-fill": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", @@ -11103,6 +8813,48 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/hast-util-from-html/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/hast-util-from-parse5": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", @@ -11271,6 +9023,61 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-html": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", @@ -11294,6 +9101,33 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-mdast": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz", @@ -11408,28 +9242,16 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true, "license": "MIT" }, "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", "license": "MIT" }, "node_modules/html-to-image": { @@ -11458,32 +9280,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" }, "node_modules/http-shutdown": { "version": "1.2.2", @@ -11495,27 +9296,6 @@ "node": ">= 0.12.0" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/httpxy": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz", - "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -11526,11 +9306,14 @@ } }, "node_modules/humanize-duration": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.33.0.tgz", - "integrity": "sha512-vYJX7BSzn7EQ4SaP2lPYVy+icHDppB6k7myNeI3wrSRfwMS5+BHyGgzpHR0ptqJ2AQ6UuIKrclSg5ve6Ci4IAQ==", + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/humanize-duration/-/humanize-duration-3.33.1.tgz", + "integrity": "sha512-hwzSCymnRdFx9YdRkQQ0OYequXiVAV6ZGQA2uzocwB0F4309Ke6pO8dg0P8LHhRQJyVjGteRTAA/zNfEcpXn8A==", "license": "Unlicense", - "peer": true + "peer": true, + "funding": { + "url": "https://github.com/sponsors/EvanHahn" + } }, "node_modules/iconv-lite": { "version": "0.6.3", @@ -11583,7 +9366,7 @@ "version": "5.1.3", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/import-local": { @@ -11606,18 +9389,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/impound": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/impound/-/impound-1.0.0.tgz", - "integrity": "sha512-8lAJ+1Arw2sMaZ9HE2ZmL5zOcMnt18s6+7Xqgq2aUVy4P1nlzAyPtzCDxsk51KVFwHEEdc6OWvUyqwHwhRYaug==", - "dev": true, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "license": "MIT", - "dependencies": { - "exsolve": "^1.0.5", - "mocked-exports": "^0.1.1", - "pathe": "^2.0.3", - "unplugin": "^2.3.2", - "unplugin-utils": "^0.2.4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/imurmurhash": { @@ -11648,15 +9427,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" }, "node_modules/internmap": { "version": "2.0.3", @@ -11671,8 +9446,9 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.7.0.tgz", "integrity": "sha512-NUcA93i1lukyXU+riqEyPtSEkyFq8tX90uL659J+qpCZ3rEdViB/APC58oAhIh3+bJln2hzdlZbBZsGNrlsR8g==", - "devOptional": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ioredis/commands": "^1.3.0", "cluster-key-slot": "^1.1.0", @@ -11849,7 +9625,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -11895,40 +9670,16 @@ "dependencies": { "is-docker": "^3.0.0" }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" - }, + "bin": { + "is-inside-container": "cli.js" + }, "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -11938,19 +9689,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", @@ -11963,26 +9701,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "protocols": "^2.0.1" - } - }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -11995,11 +9713,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "dev": true, "license": "MIT", "engines": { "node": ">=12.13" @@ -12038,23 +9767,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -12126,21 +9838,12 @@ "node": ">=8" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/istanbul-reports/node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } + "license": "MIT" }, "node_modules/jest": { "version": "29.7.0", @@ -12283,6 +9986,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/jest-changed-files/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-changed-files/node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -12300,6 +10019,19 @@ "node": ">=6" } }, + "node_modules/jest-changed-files/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", @@ -12365,6 +10097,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-circus/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-circus/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -12511,6 +10272,22 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-config/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", @@ -12971,6 +10748,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-runner/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runner/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", @@ -13154,6 +10960,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", @@ -13316,7 +11151,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -13335,7 +11169,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -13351,45 +11184,10 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-to-typescript": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", - "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.5", - "@types/json-schema": "^7.0.15", - "@types/lodash": "^4.17.7", - "is-glob": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "prettier": "^3.2.5", - "tinyglobby": "^0.2.9" - }, - "bin": { - "json2ts": "dist/src/cli.js" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/json-schema-to-zod": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/json-schema-to-zod/-/json-schema-to-zod-2.6.1.tgz", - "integrity": "sha512-uiHmWH21h9FjKJkRBntfVGTLpYlCZ1n98D0izIlByqQLqpmkQpNTBtfbdP04Na6+43lgsvrShFh2uWLkQDKJuQ==", - "dev": true, - "license": "ISC", - "bin": { - "json-schema-to-zod": "dist/cjs/cli.js" - } - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -13398,6 +11196,18 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/katex": { "version": "0.16.22", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", @@ -13429,10 +11239,9 @@ "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" }, "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "license": "MIT", "engines": { "node": ">=6" @@ -13475,69 +11284,12 @@ "node": ">=16.0.0" } }, - "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -13548,19 +11300,6 @@ "node": ">=6" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -13681,42 +11420,28 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, "license": "MIT" }, "node_modules/lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "devOptional": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true, "license": "MIT" }, "node_modules/longest-streak": { @@ -13733,38 +11458,11 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, - "node_modules/magic-regexp": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.10.0.tgz", - "integrity": "sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12", - "mlly": "^1.7.2", - "regexp-tree": "^0.1.27", - "type-level-regexp": "~0.1.17", - "ufo": "^1.5.4", - "unplugin": "^2.0.0" - } - }, - "node_modules/magic-regexp/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/magic-string": { "version": "0.30.19", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", @@ -13774,27 +11472,10 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/magic-string-ast": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.2.tgz", - "integrity": "sha512-8ngQgLhcT0t3YBdn9CGkZqCYlvwW9pm7aWJwd7AxseVWf1RU8ZHCQvG1mt3N5vvUme+pXTcHB8G/7fE666U8Vw==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=20.18.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, "node_modules/magicast": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "devOptional": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.25.4", @@ -13828,6 +11509,18 @@ "tmpl": "1.0.5" } }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -13867,6 +11560,43 @@ "dev": true, "license": "MIT" }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -14008,6 +11738,83 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", @@ -14095,16 +11902,6 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, "node_modules/mermaid": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.11.0.tgz", @@ -14202,6 +11999,26 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-gfm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", @@ -14313,10 +12130,112 @@ "license": "MIT", "dependencies": { "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", @@ -14366,6 +12285,33 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "node_modules/micromark-factory-space": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", @@ -14567,6 +12513,31 @@ ], "license": "MIT" }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", @@ -14709,20 +12680,16 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz", - "integrity": "sha512-2OfDPL+e03E0LrXaGYOtTFIYhiuzep94NSsuhrNULq+stylcJedcHdzHtz0atMUuGwJfFYs0YL5xeC/Ca2x0eQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa" - ], + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", - "bin": { - "mime": "bin/cli.js" - }, "engines": { - "node": ">=16" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/mime-db": { @@ -14770,21 +12737,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/miniflare": { - "version": "4.20250902.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250902.0.tgz", - "integrity": "sha512-QHjI17yVDxDXsjDvX6GNRySx2uYsQJyiZ2MRBAsA0CFpAI2BcHd4oz0FIjbqgpZK+4Fhm7OKht/AfBNCd234Zg==", - "dev": true, + "version": "4.20250906.2", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250906.2.tgz", + "integrity": "sha512-SXGv8Rdd91b6UXZ5eW3rde/gSJM6WVLItMNFV7u9axUVhACvpT4CB5p80OBfi2OOsGfOuFQ6M6s8tMxJbzioVw==", "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "0.8.1", @@ -14794,8 +12750,8 @@ "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", - "undici": "^7.10.0", - "workerd": "1.20250902.0", + "undici": "7.14.0", + "workerd": "1.20250906.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" @@ -14814,7 +12770,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -14837,7 +12792,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -14860,7 +12814,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14877,7 +12830,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14894,7 +12846,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14911,7 +12862,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14928,7 +12878,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14945,7 +12894,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14962,7 +12910,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14979,7 +12926,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -14996,7 +12942,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -15019,7 +12964,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -15042,7 +12986,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -15065,7 +13008,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -15088,7 +13030,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -15111,7 +13052,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -15134,7 +13074,6 @@ "cpu": [ "wasm32" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -15154,7 +13093,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -15174,7 +13112,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -15191,7 +13128,6 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -15201,10 +13137,9 @@ } }, "node_modules/miniflare/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -15214,7 +13149,6 @@ "version": "0.33.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", - "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -15254,7 +13188,6 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -15276,7 +13209,6 @@ "version": "4.1.0-beta.10", "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", - "dev": true, "license": "MIT", "dependencies": { "@poppinss/colors": "^4.1.5", @@ -15290,7 +13222,6 @@ "version": "3.22.3", "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -15308,29 +13239,6 @@ "node": ">=6" } }, - "node_modules/minimark": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/minimark/-/minimark-0.2.0.tgz", - "integrity": "sha512-AmtWU9pO0C2/3AM2pikaVhJ//8E5rOpJ7+ioFQfjIq+wCsBeuZoxPd97hBFZ9qrI7DMHZudwGH3r8A7BMnsIew==", - "dev": true, - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -15340,52 +13248,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true, "license": "MIT" }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -15421,13 +13289,6 @@ "pathe": "^2.0.1" } }, - "node_modules/mocked-exports": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/mocked-exports/-/mocked-exports-0.1.1.tgz", - "integrity": "sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==", - "dev": true, - "license": "MIT" - }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -15455,7 +13316,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -15467,18 +13327,10 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, - "license": "MIT" - }, "node_modules/nanoid": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", - "dev": true, "funding": [ { "type": "github", @@ -15493,13 +13345,6 @@ "node": "^18 || >=20" } }, - "node_modules/nanotar": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.2.0.tgz", - "integrity": "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==", - "dev": true, - "license": "MIT" - }, "node_modules/napi-build-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", @@ -15512,191 +13357,39 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" - }, - "node_modules/neotraverse": { - "version": "0.6.18", - "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", - "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/nitro-cloudflare-dev": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/nitro-cloudflare-dev/-/nitro-cloudflare-dev-0.2.2.tgz", - "integrity": "sha512-aZfNTVdgXPQeAmXW0Tw8hm3usAHr4qVG4Bg3WhHBGeZYuXr9OyT04Ztb+STkMzhyaXvfMHViAaPUPg06iAYqag==", - "dev": true, - "license": "MIT", - "dependencies": { - "consola": "^3.4.0", - "mlly": "^1.7.4", - "pkg-types": "^2.1.0" - } - }, - "node_modules/nitropack": { - "version": "2.12.5", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.12.5.tgz", - "integrity": "sha512-KDTFhATOzqWHXFZkNlAH9J989Wibpl6s38eaYZj/Km2GbcUBLdcDxL4x7vd9pHWhD1Yk1u5oLh8+MsqJeQ7GMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cloudflare/kv-asset-handler": "^0.4.0", - "@rollup/plugin-alias": "^5.1.1", - "@rollup/plugin-commonjs": "^28.0.6", - "@rollup/plugin-inject": "^5.0.5", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^16.0.1", - "@rollup/plugin-replace": "^6.0.2", - "@rollup/plugin-terser": "^0.4.4", - "@vercel/nft": "^0.30.1", - "archiver": "^7.0.1", - "c12": "^3.2.0", - "chokidar": "^4.0.3", - "citty": "^0.1.6", - "compatx": "^0.2.0", - "confbox": "^0.2.2", - "consola": "^3.4.2", - "cookie-es": "^2.0.0", - "croner": "^9.1.0", - "crossws": "^0.3.5", - "db0": "^0.3.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "dot-prop": "^9.0.0", - "esbuild": "^0.25.9", - "escape-string-regexp": "^5.0.0", - "etag": "^1.8.1", - "exsolve": "^1.0.7", - "globby": "^14.1.0", - "gzip-size": "^7.0.0", - "h3": "^1.15.4", - "hookable": "^5.5.3", - "httpxy": "^0.1.7", - "ioredis": "^5.7.0", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "listhen": "^1.9.0", - "magic-string": "^0.30.18", - "magicast": "^0.3.5", - "mime": "^4.0.7", - "mlly": "^1.8.0", - "node-fetch-native": "^1.6.7", - "node-mock-http": "^1.0.2", - "ofetch": "^1.4.1", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^2.0.0", - "pkg-types": "^2.3.0", - "pretty-bytes": "^7.0.1", - "radix3": "^1.1.2", - "rollup": "^4.50.0", - "rollup-plugin-visualizer": "^6.0.3", - "scule": "^1.3.0", - "semver": "^7.7.2", - "serve-placeholder": "^2.0.2", - "serve-static": "^2.2.0", - "source-map": "^0.7.6", - "std-env": "^3.9.0", - "ufo": "^1.6.1", - "ultrahtml": "^1.6.0", - "uncrypto": "^0.1.3", - "unctx": "^2.4.1", - "unenv": "2.0.0-rc.20", - "unimport": "^5.2.0", - "unplugin-utils": "^0.3.0", - "unstorage": "^1.17.0", - "untyped": "^2.0.0", - "unwasm": "^0.3.11", - "youch": "4.1.0-beta.8", - "youch-core": "^0.3.3" - }, - "bin": { - "nitro": "dist/cli/index.mjs", - "nitropack": "dist/cli/index.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "xml2js": "^0.6.2" - }, - "peerDependenciesMeta": { - "xml2js": { - "optional": true - } - } - }, - "node_modules/nitropack/node_modules/cookie-es": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", - "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==", - "dev": true, - "license": "MIT" - }, - "node_modules/nitropack/node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", - "dev": true, - "license": "MIT" - }, - "node_modules/nitropack/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/nitropack/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", "engines": { - "node": ">= 12" + "node": ">= 10" } }, - "node_modules/nitropack/node_modules/unplugin-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.0.tgz", - "integrity": "sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==", + "node_modules/nitro-cloudflare-dev": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/nitro-cloudflare-dev/-/nitro-cloudflare-dev-0.2.2.tgz", + "integrity": "sha512-aZfNTVdgXPQeAmXW0Tw8hm3usAHr4qVG4Bg3WhHBGeZYuXr9OyT04Ztb+STkMzhyaXvfMHViAaPUPg06iAYqag==", "dev": true, "license": "MIT", "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "consola": "^3.4.0", + "mlly": "^1.7.4", + "pkg-types": "^2.1.0" } }, - "node_modules/nitropack/node_modules/youch": { - "version": "4.1.0-beta.8", - "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.8.tgz", - "integrity": "sha512-rY2A2lSF7zC+l7HH9Mq+83D1dLlsPnEvy8jTouzaptDZM6geqZ3aJe/b7ULCwRURPtWV3vbDjA2DDMdoBol0HQ==", - "dev": true, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.4", - "@poppinss/dumper": "^0.6.3", - "@speed-highlight/core": "^1.2.7", - "cookie": "^1.0.2", - "youch-core": "^0.3.1" + "@types/nlcst": "^2.0.0" }, - "engines": { - "node": ">=18" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/node-abi": { @@ -15762,7 +13455,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -15815,8 +13507,8 @@ "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "devOptional": true, "license": "MIT", + "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -15837,28 +13529,11 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz", - "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==", - "dev": true, + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "license": "MIT" }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -15868,16 +13543,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", @@ -15917,265 +13582,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nuxt": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-4.1.1.tgz", - "integrity": "sha512-xLDbWgz3ggAfUjcbmTzmLLPWOEB61thnjnqyasZlYyh/Ty2EDT1qvOiM9HT+9ycBxElI2DmyYewY8WOPRxWMiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/cli": "^3.28.0", - "@nuxt/devalue": "^2.0.2", - "@nuxt/devtools": "^2.6.3", - "@nuxt/kit": "4.1.1", - "@nuxt/schema": "4.1.1", - "@nuxt/telemetry": "^2.6.6", - "@nuxt/vite-builder": "4.1.1", - "@unhead/vue": "^2.0.14", - "@vue/shared": "^3.5.20", - "c12": "^3.2.0", - "chokidar": "^4.0.3", - "compatx": "^0.2.0", - "consola": "^3.4.2", - "cookie-es": "^2.0.0", - "defu": "^6.1.4", - "destr": "^2.0.5", - "devalue": "^5.3.2", - "errx": "^0.1.0", - "esbuild": "^0.25.9", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "exsolve": "^1.0.7", - "h3": "^1.15.4", - "hookable": "^5.5.3", - "ignore": "^7.0.5", - "impound": "^1.0.0", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "magic-string": "^0.30.18", - "mlly": "^1.8.0", - "mocked-exports": "^0.1.1", - "nanotar": "^0.2.0", - "nitropack": "^2.12.4", - "nypm": "^0.6.1", - "ofetch": "^1.4.1", - "ohash": "^2.0.11", - "on-change": "^5.0.1", - "oxc-minify": "^0.86.0", - "oxc-parser": "^0.86.0", - "oxc-transform": "^0.86.0", - "oxc-walker": "^0.4.0", - "pathe": "^2.0.3", - "perfect-debounce": "^2.0.0", - "pkg-types": "^2.3.0", - "radix3": "^1.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "0.2.14", - "ufo": "^1.6.1", - "ultrahtml": "^1.6.0", - "uncrypto": "^0.1.3", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "unplugin": "^2.3.10", - "unplugin-vue-router": "^0.15.0", - "unstorage": "^1.17.0", - "untyped": "^2.0.0", - "vue": "^3.5.20", - "vue-bundle-renderer": "^2.1.2", - "vue-devtools-stub": "^0.1.0", - "vue-router": "^4.5.1" - }, - "bin": { - "nuxi": "bin/nuxt.mjs", - "nuxt": "bin/nuxt.mjs" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "@types/node": ">=18.12.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - }, - "@types/node": { - "optional": true - } - } - }, - "node_modules/nuxt-aos": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/nuxt-aos/-/nuxt-aos-1.2.5.tgz", - "integrity": "sha512-tNEXMOKijCg+SygLvjp2VbEy7yQcC6ertzI23bCa6DPlu134bfzSYUGOJRSFSKtYjnrqIW7MzLpqPTfTwd8A3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/devtools-kit": "^1.3.9", - "@nuxt/kit": "^3.12.3", - "aos": "^2.3.4" - } - }, - "node_modules/nuxt-aos/node_modules/@nuxt/devtools-kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.7.0.tgz", - "integrity": "sha512-+NgZ2uP5BuneqvQbe7EdOEaFEDy8762c99pLABtn7/Ur0ExEsQJMP7pYjjoTfKubhBqecr5Vo9yHkPBj1eHulQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.15.0", - "@nuxt/schema": "^3.15.0", - "execa": "^7.2.0" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/nuxt-aos/node_modules/@nuxt/schema": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.19.1.tgz", - "integrity": "sha512-87IfTFaJdHXIfOXrWH7lQDp5LcKPH3h7kc8UdXWBLrCy3lsxxTu42TWJV948fWKVYHCx0O/Er3bno5gMLD+IVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/shared": "^3.5.20", - "consola": "^3.4.2", - "defu": "^6.1.4", - "pathe": "^2.0.3", - "std-env": "^3.9.0", - "ufo": "1.6.1" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/nuxt-aos/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/nuxt-aos/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nuxt-aos/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/nuxt-aos/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/nuxt-component-meta": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/nuxt-component-meta/-/nuxt-component-meta-0.14.0.tgz", - "integrity": "sha512-RaL6bHJujuZmw/G+uNWAHYktf3k4hdlBIy+FqudXji42IefrJKdSMkh5ixyhsfEHWsuTYGKxD2NU3sq990KGrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^4.1.1", - "citty": "^0.1.6", - "json-schema-to-zod": "^2.6.1", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "scule": "^1.3.0", - "typescript": "^5.9.2", - "ufo": "^1.6.1", - "vue-component-meta": "^3.0.6" - }, - "bin": { - "nuxt-component-meta": "bin/nuxt-component-meta.mjs" - } - }, - "node_modules/nuxt-component-meta/node_modules/@nuxt/kit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.2.tgz", - "integrity": "sha512-P5q41xeEOa6ZQC0PvIP7TSBmOAMxXK4qihDcCbYIJq8RcVsEPbGZVlidmxE6EOw1ucSyodq9nbV31FAKwoL4NQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "c12": "^3.2.0", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.5.1", - "klona": "^2.0.6", - "mlly": "^1.8.0", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.15", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.2.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/nuxt-component-meta/node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/nuxt-lazy-hydrate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/nuxt-lazy-hydrate/-/nuxt-lazy-hydrate-1.0.0.tgz", @@ -16183,60 +13589,13 @@ "license": "MIT", "dependencies": { "@nuxt/kit": "^3.3.2", - "vue3-lazy-hydration": "^1.2.1" - } - }, - "node_modules/nuxt-multi-cache": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nuxt-multi-cache/-/nuxt-multi-cache-4.0.3.tgz", - "integrity": "sha512-ozfdovvS8ffCTDrHq2UcBI/yQJ9ncbzG50jho7qpg/vWFc85NOD1a3Tpl8Jh/IJj3SiCIkmTC72Cqq9NuHHaEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tusbar/cache-control": "^1.0.2" - } - }, - "node_modules/nuxt-site-config": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-3.2.2.tgz", - "integrity": "sha512-0zCo8nZKk11F4oEWvioTPpxYesJtiwWGfanh1coOfPmvGdYuCcJ/pusy8zdPb6xQkvAYqpTZUy7KKfjXjrE8rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.17.5", - "nuxt-site-config-kit": "3.2.2", - "pathe": "^2.0.3", - "pkg-types": "^2.1.0", - "sirv": "^3.0.1", - "site-config-stack": "3.2.2", - "ufo": "^1.6.1" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/nuxt-site-config-kit": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-3.2.2.tgz", - "integrity": "sha512-SmTBVm6JQd5zHBy04/qn0gWo3rg1HTRGT/H91hxk/o+mDB3ll+TkzpZekD46RUBO/AD02ArLG5n2ndu6zhWsHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nuxt/kit": "^3.17.5", - "pkg-types": "^2.1.0", - "site-config-stack": "3.2.2", - "std-env": "^3.9.0", - "ufo": "^1.6.1" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" + "vue3-lazy-hydration": "^1.2.1" } }, - "node_modules/nuxt/node_modules/@nuxt/kit": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.1.1.tgz", - "integrity": "sha512-2MGfOXtbcxdkbUNZDjyEv4xmokicZhTrQBMrmNJQztrePfpKOVBe8AiGf/BfbHelXMKio5PgktiRoiEIyIsX4g==", - "dev": true, + "node_modules/nuxt-lazy-hydrate/node_modules/@nuxt/kit": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.19.2.tgz", + "integrity": "sha512-+QiqO0WcIxsKLUqXdVn3m4rzTRm2fO9MZgd330utCAaagGmHsgiMJp67kE14boJEPutnikfz3qOmrzBnDIHUUg==", "license": "MIT", "dependencies": { "c12": "^3.2.0", @@ -16248,6 +13607,7 @@ "ignore": "^7.0.5", "jiti": "^2.5.1", "klona": "^2.0.6", + "knitwork": "^1.2.0", "mlly": "^1.8.0", "ohash": "^2.0.11", "pathe": "^2.0.3", @@ -16256,7 +13616,7 @@ "scule": "^1.3.0", "semver": "^7.7.2", "std-env": "^3.9.0", - "tinyglobby": "^0.2.14", + "tinyglobby": "^0.2.15", "ufo": "^1.6.1", "unctx": "^2.4.1", "unimport": "^5.2.0", @@ -16266,78 +13626,6 @@ "node": ">=18.12.0" } }, - "node_modules/nuxt/node_modules/cookie-es": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-2.0.0.tgz", - "integrity": "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==", - "dev": true, - "license": "MIT" - }, - "node_modules/nuxt/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/nuxt/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/nuxt/node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", - "dev": true, - "license": "MIT" - }, - "node_modules/nuxt/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/nuxt/node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, "node_modules/nypm": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.1.tgz", @@ -16357,6 +13645,12 @@ "node": "^14.16.0 || >=16.10.0" } }, + "node_modules/nypm/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" + }, "node_modules/ofetch": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", @@ -16374,32 +13668,6 @@ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, - "node_modules/on-change": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/on-change/-/on-change-5.0.1.tgz", - "integrity": "sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/on-change?sponsor=1" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -16441,53 +13709,6 @@ "regex-recursion": "^6.0.2" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/openapi-path-templating": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/openapi-path-templating/-/openapi-path-templating-2.2.1.tgz", @@ -16512,134 +13733,16 @@ "node": ">=12.20.0" } }, - "node_modules/oxc-minify": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/oxc-minify/-/oxc-minify-0.86.0.tgz", - "integrity": "sha512-pjtM94KElw/RxF3R1ls1ADcBUyZcrCgn0qeL4nD8cOotfzeVFa0xXwQQeCkk+5GPiOqdRApNFuJvK//lQgpqJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-minify/binding-android-arm64": "0.86.0", - "@oxc-minify/binding-darwin-arm64": "0.86.0", - "@oxc-minify/binding-darwin-x64": "0.86.0", - "@oxc-minify/binding-freebsd-x64": "0.86.0", - "@oxc-minify/binding-linux-arm-gnueabihf": "0.86.0", - "@oxc-minify/binding-linux-arm-musleabihf": "0.86.0", - "@oxc-minify/binding-linux-arm64-gnu": "0.86.0", - "@oxc-minify/binding-linux-arm64-musl": "0.86.0", - "@oxc-minify/binding-linux-riscv64-gnu": "0.86.0", - "@oxc-minify/binding-linux-s390x-gnu": "0.86.0", - "@oxc-minify/binding-linux-x64-gnu": "0.86.0", - "@oxc-minify/binding-linux-x64-musl": "0.86.0", - "@oxc-minify/binding-wasm32-wasi": "0.86.0", - "@oxc-minify/binding-win32-arm64-msvc": "0.86.0", - "@oxc-minify/binding-win32-x64-msvc": "0.86.0" - } - }, - "node_modules/oxc-parser": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.86.0.tgz", - "integrity": "sha512-v9+uomgqyLSxlq3qlaMqJJtXg2+rUsa368p/zkmgi5OMGmcZAtZt5GIeSVFF84iNET+08Hdx/rUtd/FyIdfNFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@oxc-project/types": "^0.86.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-parser/binding-android-arm64": "0.86.0", - "@oxc-parser/binding-darwin-arm64": "0.86.0", - "@oxc-parser/binding-darwin-x64": "0.86.0", - "@oxc-parser/binding-freebsd-x64": "0.86.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.86.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.86.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.86.0", - "@oxc-parser/binding-linux-arm64-musl": "0.86.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.86.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.86.0", - "@oxc-parser/binding-linux-x64-gnu": "0.86.0", - "@oxc-parser/binding-linux-x64-musl": "0.86.0", - "@oxc-parser/binding-wasm32-wasi": "0.86.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.86.0", - "@oxc-parser/binding-win32-x64-msvc": "0.86.0" - } - }, - "node_modules/oxc-transform": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/oxc-transform/-/oxc-transform-0.86.0.tgz", - "integrity": "sha512-Ghgm/zzjPXROMpljLy4HYBcko/25sixWi2yJQJ6rDu/ltgFB1nEQ4JYCYV5F+ENt0McsJkcgmX5I4dRfDViyDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/Boshen" - }, - "optionalDependencies": { - "@oxc-transform/binding-android-arm64": "0.86.0", - "@oxc-transform/binding-darwin-arm64": "0.86.0", - "@oxc-transform/binding-darwin-x64": "0.86.0", - "@oxc-transform/binding-freebsd-x64": "0.86.0", - "@oxc-transform/binding-linux-arm-gnueabihf": "0.86.0", - "@oxc-transform/binding-linux-arm-musleabihf": "0.86.0", - "@oxc-transform/binding-linux-arm64-gnu": "0.86.0", - "@oxc-transform/binding-linux-arm64-musl": "0.86.0", - "@oxc-transform/binding-linux-riscv64-gnu": "0.86.0", - "@oxc-transform/binding-linux-s390x-gnu": "0.86.0", - "@oxc-transform/binding-linux-x64-gnu": "0.86.0", - "@oxc-transform/binding-linux-x64-musl": "0.86.0", - "@oxc-transform/binding-wasm32-wasi": "0.86.0", - "@oxc-transform/binding-win32-arm64-msvc": "0.86.0", - "@oxc-transform/binding-win32-x64-msvc": "0.86.0" - } - }, - "node_modules/oxc-walker": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/oxc-walker/-/oxc-walker-0.4.0.tgz", - "integrity": "sha512-x5TJAZQD3kRnRBGZ+8uryMZUwkTYddwzBftkqyJIcmpBOXmoK/fwriRKATjZroR2d+aS7+2w1B0oz189bBTwfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^3.0.3", - "magic-regexp": "^0.10.0" - }, - "peerDependencies": { - "oxc-parser": ">=0.72.0" - } - }, - "node_modules/oxc-walker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -16674,6 +13777,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -16684,19 +13815,18 @@ "node": ">=6" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/package-manager-detector": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", "license": "MIT" }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" + }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", @@ -16741,28 +13871,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", - "dev": true, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", "license": "MIT", "dependencies": { - "protocols": "^2.0.0" + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/parse-url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", - "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", - "dev": true, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "license": "MIT", - "dependencies": { - "@types/parse-path": "^7.0.0", - "parse-path": "^7.0.0" - }, "engines": { - "node": ">=14.13.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { @@ -16789,16 +13925,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -16847,49 +13973,11 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/path-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" }, "node_modules/pathe": { "version": "2.0.3", @@ -16910,12 +13998,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -16999,465 +14087,44 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-calc": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", - "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" - } - }, - "node_modules/postcss-colormin": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.4.tgz", - "integrity": "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-convert-values": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.7.tgz", - "integrity": "sha512-HR9DZLN04Xbe6xugRH6lS4ZQH2zm/bFh/ZyRkpedZozhvh+awAfbA0P36InO4fZfDhvYfNJeNvlTf1sjwGbw/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-discard-comments": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", - "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.1.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", - "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-discard-empty": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", - "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", - "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", - "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.5" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-merge-rules": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.6.tgz", - "integrity": "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.1", - "postcss-selector-parser": "^7.1.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", - "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", - "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.4.tgz", - "integrity": "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "cssnano-utils": "^5.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", - "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "postcss-selector-parser": "^7.1.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", - "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", - "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", - "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", - "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-string": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", - "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", - "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.4.tgz", - "integrity": "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-url": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", - "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", - "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-ordered-values": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", - "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssnano-utils": "^5.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.4.tgz", - "integrity": "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", - "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", - "dev": true, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "postcss-selector-parser": "^6.1.1" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": ">=12.0" }, "peerDependencies": { - "postcss": "^8.4.32" + "postcss": "^8.2.14" } }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.0.tgz", - "integrity": "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^4.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.32" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", - "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^7.1.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" + "node": ">=4" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -17477,9 +14144,9 @@ } }, "node_modules/posthog-js": { - "version": "1.261.8", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.261.8.tgz", - "integrity": "sha512-HohKQ5Fuvei/3ZLIdayq6lDpeXsG891t2y2izpHu6q/1SoCS+HlYjViz3WCu9KlE7AfjfpwvN1kjnFNNPWeOig==", + "version": "1.266.0", + "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.266.0.tgz", + "integrity": "sha512-437KsO9N+pMW6FtilgKYTHel0RCWs2S7PvsNRJf20/f3npChX9i6F8cNCJ6O4Az37scC1kPdTknFY/xEGazVJw==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@posthog/core": "1.0.2", @@ -17502,9 +14169,9 @@ } }, "node_modules/preact": { - "version": "10.27.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.1.tgz", - "integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==", + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "license": "MIT", "funding": { "type": "opencollective", @@ -17537,67 +14204,19 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "license": "Apache-2.0", "engines": { "node": ">=8" } }, - "node_modules/prebuild-install/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "license": "MIT", "bin": { @@ -17610,19 +14229,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pretty-bytes": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-7.0.1.tgz", - "integrity": "sha512-285/jRCYIbMGDciDdrw0KPNC4LKEEwz/bwErcYNxSJOi4CpGUuLpb9gQpg3XJP0XYj9ldSRluXxih4lX2YN8Xw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -17638,6 +14244,21 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -17656,18 +14277,10 @@ "node": ">= 0.6.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, "license": "MIT", "dependencies": { "kleur": "^3.0.3", @@ -17677,6 +14290,15 @@ "node": ">= 6" } }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/property-information": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", @@ -17687,13 +14309,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "dev": true, - "license": "MIT" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -17743,27 +14358,6 @@ ], "license": "MIT" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", @@ -17809,26 +14403,6 @@ "node": ">=4" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/rapidoc": { "version": "9.3.8", "resolved": "https://registry.npmjs.org/rapidoc/-/rapidoc-9.3.8.tgz", @@ -17907,65 +14481,93 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dev": true, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", "dependencies": { - "minimatch": "^5.1.0" + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "license": "MIT", - "engines": { - "node": ">= 14.18.0" + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "devOptional": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -17974,8 +14576,9 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "devOptional": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "redis-errors": "^1.0.0" }, @@ -18007,14 +14610,29 @@ "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", "license": "MIT" }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "dev": true, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", "license": "MIT", - "bin": { - "regexp-tree": "bin/regexp-tree" + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.3", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.3.tgz", + "integrity": "sha512-8d9Py4c/V6I/Od2VIXFAdpiO2kc0SV2qTJsRAaqSIcM9aruW4ASLNe2kOEo1inXAAkIhpFzAHTc358HKbvpNUg==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.3" } }, "node_modules/rehype-external-links": { @@ -18049,6 +14667,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -18064,6 +14697,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-remark": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz", @@ -18127,6 +14775,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark": { "version": "15.0.1", "resolved": "https://registry.npmjs.org/remark/-/remark-15.0.1.tgz", @@ -18144,10 +14807,27 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-code-import": { - "resolved": "utils/remark-code-import", - "link": true - }, + "node_modules/remark-code-import": { + "resolved": "utils/remark-code-import", + "link": true + }, + "node_modules/remark-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-4.0.0.tgz", + "integrity": "sha512-7sxn4RfF1o3izevPV1DheyGDD6X4c9hrGpfdUpm7uC++dqrnJxIZVkk7CoKqcLm0VUMAuOol7Mno3m6g8cfMuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-emoji": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-5.0.2.tgz", @@ -18201,6 +14881,66 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-link-rewrite": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/remark-link-rewrite/-/remark-link-rewrite-1.0.7.tgz", + "integrity": "sha512-jfmXL8VL3O7Ca4g+Ya0A0S9LIpVhCUSqMHiei4N8Z8Mx9z/oEI1HDoa1ZcF9/tS0I7NwydGsPkw2zT4eeoD6+Q==", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^4.1.1" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/remark-link-rewrite/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/remark-link-rewrite/node_modules/unist-util-is": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", + "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-link-rewrite/node_modules/unist-util-visit": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", + "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-link-rewrite/node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", + "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-mdc": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/remark-mdc/-/remark-mdc-3.6.0.tgz", @@ -18227,6 +14967,20 @@ "yaml": "^2.7.1" } }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -18260,6 +15014,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/remark-stringify": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", @@ -18348,6 +15117,12 @@ "node": ">=10" } }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, "node_modules/ret": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", @@ -18357,22 +15132,71 @@ "node": ">=4" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, "license": "MIT" }, "node_modules/robust-predicates": { @@ -18382,10 +15206,9 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", - "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", - "dev": true, + "version": "4.50.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.2.tgz", + "integrity": "sha512-BgLRGy7tNS9H66aIMASq1qSYbAAJV6Z6WR4QYTvj5FgF15rZ/ympT1uixHXwzbZUBDbkvqUI1KR0fH1FhMaQ9w==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -18398,84 +15221,30 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.50.1", - "@rollup/rollup-android-arm64": "4.50.1", - "@rollup/rollup-darwin-arm64": "4.50.1", - "@rollup/rollup-darwin-x64": "4.50.1", - "@rollup/rollup-freebsd-arm64": "4.50.1", - "@rollup/rollup-freebsd-x64": "4.50.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", - "@rollup/rollup-linux-arm-musleabihf": "4.50.1", - "@rollup/rollup-linux-arm64-gnu": "4.50.1", - "@rollup/rollup-linux-arm64-musl": "4.50.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", - "@rollup/rollup-linux-ppc64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-musl": "4.50.1", - "@rollup/rollup-linux-s390x-gnu": "4.50.1", - "@rollup/rollup-linux-x64-gnu": "4.50.1", - "@rollup/rollup-linux-x64-musl": "4.50.1", - "@rollup/rollup-openharmony-arm64": "4.50.1", - "@rollup/rollup-win32-arm64-msvc": "4.50.1", - "@rollup/rollup-win32-ia32-msvc": "4.50.1", - "@rollup/rollup-win32-x64-msvc": "4.50.1", + "@rollup/rollup-android-arm-eabi": "4.50.2", + "@rollup/rollup-android-arm64": "4.50.2", + "@rollup/rollup-darwin-arm64": "4.50.2", + "@rollup/rollup-darwin-x64": "4.50.2", + "@rollup/rollup-freebsd-arm64": "4.50.2", + "@rollup/rollup-freebsd-x64": "4.50.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.2", + "@rollup/rollup-linux-arm-musleabihf": "4.50.2", + "@rollup/rollup-linux-arm64-gnu": "4.50.2", + "@rollup/rollup-linux-arm64-musl": "4.50.2", + "@rollup/rollup-linux-loong64-gnu": "4.50.2", + "@rollup/rollup-linux-ppc64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-gnu": "4.50.2", + "@rollup/rollup-linux-riscv64-musl": "4.50.2", + "@rollup/rollup-linux-s390x-gnu": "4.50.2", + "@rollup/rollup-linux-x64-gnu": "4.50.2", + "@rollup/rollup-linux-x64-musl": "4.50.2", + "@rollup/rollup-openharmony-arm64": "4.50.2", + "@rollup/rollup-win32-arm64-msvc": "4.50.2", + "@rollup/rollup-win32-ia32-msvc": "4.50.2", + "@rollup/rollup-win32-x64-msvc": "4.50.2", "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-visualizer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.3.tgz", - "integrity": "sha512-ZU41GwrkDcCpVoffviuM9Clwjy5fcUxlz0oMoTXTYsK+tcIFzbdacnrr2n8TXcHxbGKKXtOdjxM2HUS4HjkwIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "open": "^8.0.0", - "picomatch": "^4.0.2", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "rolldown": "1.x || ^1.0.0-beta", - "rollup": "2.x || 3.x || 4.x" - }, - "peerDependenciesMeta": { - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, "node_modules/roughjs": { "version": "4.6.6", "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", @@ -18523,10 +15292,9 @@ } }, "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "license": "MIT", "engines": { "node": ">=18" @@ -18535,30 +15303,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -18593,138 +15337,49 @@ }, "node_modules/sass": { "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", - "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/send/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-placeholder": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", - "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "defu": "^6.1.4" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": ">= 18" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC" }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sharp": { "version": "0.34.3", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", @@ -18768,9 +15423,9 @@ } }, "node_modules/sharp/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.0.tgz", + "integrity": "sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -18797,19 +15452,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shiki": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.12.2.tgz", @@ -18893,42 +15535,25 @@ "simple-concat": "^1.0.0" } }, - "node_modules/simple-git": { - "version": "3.28.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", - "integrity": "sha512-Rs/vQRwsn1ILH1oBUy8NucJlXmnnLeLCfcvbSehkPzbv3wwoFWIdtfd6Ndo6ZPhlPsCZ60CPI4rxurnwAa+a2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "license": "MIT" }, "node_modules/sirv": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", - "dev": true, "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", @@ -18943,25 +15568,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, "license": "MIT" }, - "node_modules/site-config-stack": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-3.2.2.tgz", - "integrity": "sha512-T1NphPh1sWlsIXbD1q1HDgHbX40miTyi++cDqXkVOuHQ/eQnGp6w8cwB8u9XmgSZsnmZpsQJgPUTNH7SX173AA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ufo": "^1.6.1" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": "^3" - } - }, "node_modules/skin-tone": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", @@ -18993,84 +15601,23 @@ "node": ">=8.0.0" } }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true, - "license": "MIT" - }, - "node_modules/socket.io-client": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", - "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, + "node_modules/smol-toml": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.4.2.tgz", + "integrity": "sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==", + "license": "BSD-3-Clause", "engines": { - "node": ">=6.0" + "node": ">= 18" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/cyyynthia" } }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -19110,7 +15657,6 @@ "version": "14.0.1", "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -19150,18 +15696,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "optional": true, + "peer": true }, "node_modules/std-env": { "version": "3.9.0", @@ -19173,27 +15710,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "dev": true, "license": "MIT", "engines": { "node": ">=4", "npm": ">=6" } }, - "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -19218,34 +15740,47 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/stringify-entities": { @@ -19266,21 +15801,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -19312,14 +15832,11 @@ } }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.0.tgz", + "integrity": "sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w==", "dev": true, "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, "engines": { "node": ">=12" }, @@ -19358,41 +15875,22 @@ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "license": "MIT" }, - "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/structured-clone-es": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/structured-clone-es/-/structured-clone-es-1.0.0.tgz", - "integrity": "sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ==", - "dev": true, - "license": "ISC" + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } }, - "node_modules/stylehacks": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.6.tgz", - "integrity": "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg==", - "dev": true, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", "license": "MIT", "dependencies": { - "browserslist": "^4.25.1", - "postcss-selector-parser": "^7.1.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.32" + "inline-style-parser": "0.2.4" } }, "node_modules/stylis": { @@ -19405,7 +15903,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", - "dev": true, "license": "MIT", "dependencies": { "copy-anything": "^3.0.2" @@ -19512,68 +16009,61 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", - "dev": true, + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", "license": "MIT", - "optional": true, "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "tar-stream": "^2.1.4" } }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/tar-fs/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, "node_modules/terser": { "version": "5.44.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", - "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -19591,15 +16081,17 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -19644,27 +16136,16 @@ "node": "*" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "dev": true, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "license": "MIT" }, "node_modules/tinyglobby": { @@ -19683,35 +16164,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -19809,21 +16261,10 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -19833,7 +16274,6 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, "license": "MIT" }, "node_modules/tree-sitter": { @@ -19939,11 +16379,30 @@ "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", "license": "Apache-2.0" }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "devOptional": true, "license": "0BSD" }, "node_modules/tunnel-agent": { @@ -19969,25 +16428,17 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-level-regexp": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/type-level-regexp/-/type-level-regexp-0.1.17.tgz", - "integrity": "sha512-wTk4DH3cxwk196uGLK/E9pE45aLfeKJacKmcEgEOA/q5dnPGNxXt0cfYdFxb57L+sEpf1oJH4Dnx/pnRcku9jg==", - "dev": true, - "license": "MIT" - }, "node_modules/types-ramda": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/types-ramda/-/types-ramda-0.30.1.tgz", @@ -19998,11 +16449,11 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "devOptional": true, + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -20021,7 +16472,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", - "dev": true, "license": "MIT" }, "node_modules/uncrypto": { @@ -20052,27 +16502,24 @@ } }, "node_modules/undici": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.15.0.tgz", - "integrity": "sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==", - "dev": true, + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", + "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "dev": true, + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.11.0.tgz", + "integrity": "sha512-kt1ZriHTi7MU+Z/r9DOdAI3ONdaR3M3csEaRc6ewa4f4dTvX4cQCbJ4NkEn0ohE4hHtq85+PhPSTY+pO/1PwgA==", "license": "MIT" }, "node_modules/unenv": { - "version": "2.0.0-rc.20", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.20.tgz", - "integrity": "sha512-8tn4tAl9vD5nWoggAAPz28vf0FY8+pQAayhU94qD+ZkIbVKCBAH/E1MWEEmhb9Whn5EgouYVfBJB20RsTLRDdg==", - "dev": true, + "version": "2.0.0-rc.21", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.21.tgz", + "integrity": "sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==", "license": "MIT", "dependencies": { "defu": "^6.1.4", @@ -20082,19 +16529,6 @@ "ufo": "^1.6.1" } }, - "node_modules/unhead": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.0.14.tgz", - "integrity": "sha512-dRP6OCqtShhMVZQe1F4wdt/WsYl2MskxKK+cvfSo0lQnrPJ4oAUQEkxRg7pPP+vJENabhlir31HwAyHUv7wfMg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hookable": "^5.5.3" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", @@ -20104,11 +16538,30 @@ "node": ">=4" } }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, "node_modules/unicorn-magic": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -20136,6 +16589,17 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unifont": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.5.2.tgz", + "integrity": "sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.0" + } + }, "node_modules/unimport": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.2.0.tgz", @@ -20170,18 +16634,6 @@ "@types/estree": "^1.0.0" } }, - "node_modules/unimport/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/unist-builder": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", @@ -20267,6 +16719,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", @@ -20280,6 +16746,33 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -20308,6 +16801,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", @@ -20322,6 +16828,15 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unplugin": { "version": "2.3.10", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", @@ -20353,77 +16868,6 @@ "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin-vue-router": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.15.0.tgz", - "integrity": "sha512-PyGehCjd9Ny9h+Uer4McbBjjib3lHihcyUEILa7pHKl6+rh8N7sFyw4ZkV+N30Oq2zmIUG7iKs3qpL0r+gXAaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue-macros/common": "3.0.0-beta.16", - "@vue/language-core": "^3.0.1", - "ast-walker-scope": "^0.8.1", - "chokidar": "^4.0.3", - "json5": "^2.2.3", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "muggle-string": "^0.4.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "scule": "^1.3.0", - "tinyglobby": "^0.2.14", - "unplugin": "^2.3.5", - "unplugin-utils": "^0.2.4", - "yaml": "^2.8.0" - }, - "peerDependencies": { - "@vue/compiler-sfc": "^3.5.17", - "vue-router": "^4.5.1" - }, - "peerDependenciesMeta": { - "vue-router": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-router/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/unraw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", @@ -20586,7 +17030,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -20702,24 +17145,23 @@ } }, "node_modules/vite": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz", - "integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==", - "dev": true, + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^20.19.0 || >=22.12.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -20728,14 +17170,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", - "less": "^4.0.0", + "less": "*", "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -20776,28 +17218,10 @@ } } }, - "node_modules/vite-dev-rpc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", - "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", - "dev": true, - "license": "MIT", - "dependencies": { - "birpc": "^2.4.0", - "vite-hot-client": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" - } - }, "node_modules/vite-hot-client": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-2.1.0.tgz", "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -20806,114 +17230,41 @@ "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-checker": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.10.3.tgz", - "integrity": "sha512-f4sekUcDPF+T+GdbbE8idb1i2YplBAoH+SfRS0e/WRBWb2rYb1Jf5Pimll0Rj+3JgIYWwG2K5LtBPCXxoibkLg==", - "dev": true, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.7.tgz", + "integrity": "sha512-d0fIh3wRcgSlr4Vz7bAk4va1MkdqhQgj9ANE/rBhsAjOnRfTLs2ocjFMvSUOsv6SRRXU9G+VM7yMgqDb6yI4iQ==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "chokidar": "^4.0.3", - "npm-run-path": "^6.0.0", - "picocolors": "^1.1.1", - "picomatch": "^4.0.3", - "strip-ansi": "^7.1.0", - "tiny-invariant": "^1.3.3", - "tinyglobby": "^0.2.14", - "vscode-uri": "^3.1.0" + "@vue/devtools-core": "^7.7.7", + "@vue/devtools-kit": "^7.7.7", + "@vue/devtools-shared": "^7.7.7", + "execa": "^9.5.2", + "sirv": "^3.0.1", + "vite-plugin-inspect": "0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" }, "engines": { - "node": ">=14.16" + "node": ">=v14.21.3" }, "peerDependencies": { - "@biomejs/biome": ">=1.7", - "eslint": ">=7", - "meow": "^13.2.0", - "optionator": "^0.9.4", - "stylelint": ">=16", - "typescript": "*", - "vite": ">=2.0.0", - "vls": "*", - "vti": "*", - "vue-tsc": "~2.2.10 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@biomejs/biome": { - "optional": true - }, - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - }, - "vue-tsc": { - "optional": true - } + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" } }, - "node_modules/vite-plugin-checker/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/vite-plugin-checker/node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "license": "MIT", - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, "engines": { "node": ">=18" }, @@ -20921,11 +17272,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-checker/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { "node": ">=12" @@ -20934,92 +17284,98 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-checker/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/vite-plugin-checker/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/execa": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.0.tgz", + "integrity": "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">=12" + "node": "^18.19.0 || >=20.5.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/vite-plugin-checker/node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite-plugin-inspect": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", - "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "license": "MIT", "dependencies": { - "ansis": "^4.1.0", - "debug": "^4.4.1", - "error-stack-parser-es": "^1.0.5", - "ohash": "^2.0.11", - "open": "^10.2.0", - "perfect-debounce": "^2.0.0", - "sirv": "^3.0.1", - "unplugin-utils": "^0.3.0", - "vite-dev-rpc": "^1.1.0" + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0-0" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-inspect/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-inspect/node_modules/open": { + "node_modules/vite-plugin-vue-devtools/node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", - "dev": true, "license": "MIT", "dependencies": { "default-browser": "^5.2.1", @@ -21034,105 +17390,100 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-inspect/node_modules/perfect-debounce": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz", - "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite-plugin-inspect/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-inspect/node_modules/unplugin-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.0.tgz", - "integrity": "sha512-JLoggz+PvLVMJo+jZt97hdIIIZ2yTzGgft9e9q8iMrC4ewufl62ekeW7mixBghonn2gVb/ICjyvlmOCUBnJLQg==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, "engines": { - "node": ">=20.19.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sxzz" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/vite-plugin-vue-tracer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-tracer/-/vite-plugin-vue-tracer-1.0.0.tgz", - "integrity": "sha512-a+UB9IwGx5uwS4uG/a9kM6fCMnxONDkOTbgCUbhFpiGhqfxrrC1+9BibV7sWwUnwj1Dg6MnRxG0trLgUZslDXA==", - "dev": true, + "node_modules/vite-plugin-vue-devtools/node_modules/vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", "license": "MIT", "dependencies": { - "estree-walker": "^3.0.3", - "exsolve": "^1.0.7", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "source-map-js": "^1.2.1" + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "engines": { + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "vite": "^6.0.0 || ^7.0.0", - "vue": "^3.5.0" + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } } }, - "node_modules/vite-plugin-vue-tracer/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.2.tgz", + "integrity": "sha512-YvEKooQcSiBTAs0DoYLfefNja9bLgkFM7NI2b07bE2SruuvX0MEa9cMaxjKVMkeCp5Nz9FRIdcN1rOdFVBeL6Q==", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], "peerDependencies": { - "picomatch": "^3 || ^4" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" }, "peerDependenciesMeta": { - "picomatch": { + "vite": { "optional": true } } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -21197,58 +17548,18 @@ "peerDependencies": { "typescript": "*" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-bundle-renderer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.1.2.tgz", - "integrity": "sha512-M4WRBO/O/7G9phGaGH9AOwOnYtY9ZpPoDVpBpRzR2jO5rFL9mgIlQIgums2ljCTC2HL1jDXFQc//CzWcAQHgAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ufo": "^1.6.1" - } - }, - "node_modules/vue-component-meta": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vue-component-meta/-/vue-component-meta-3.0.8.tgz", - "integrity": "sha512-DEdPomVB6p/zYT4XUgav+NiA2LtkoDQ7HCY0hQaHc8YvoDwA2q0hHsQdX3uDQuFNcZTiwX+lIUuGU4iaVybDcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "2.4.23", - "@vue/language-core": "3.0.8", - "path-browserify": "^1.0.1", - "vue-component-type-helpers": "3.0.8" - }, - "peerDependencies": { - "typescript": "*" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/vue-component-type-helpers": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.0.8.tgz", - "integrity": "sha512-WyR30Eq15Y/+odrUUMax6FmPbZwAp/HnC7qgR1r3lVFAcqwQ4wUoV79Mbh4SxDy3NiqDa+G4TOKD5xXSgBHo5A==", - "dev": true, - "license": "MIT" - }, "node_modules/vue-count-to": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/vue-count-to/-/vue-count-to-1.0.13.tgz", "integrity": "sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ==", "license": "MIT" }, - "node_modules/vue-devtools-stub": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", - "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vue-i18n": { "version": "11.1.12", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.1.12.tgz", @@ -21280,6 +17591,7 @@ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", "license": "MIT", + "peer": true, "dependencies": { "@vue/devtools-api": "^6.6.4" }, @@ -21309,6 +17621,40 @@ "vue3-carousel": "^0.15.0" } }, + "node_modules/vue3-carousel-nuxt/node_modules/@nuxt/kit": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.19.2.tgz", + "integrity": "sha512-+QiqO0WcIxsKLUqXdVn3m4rzTRm2fO9MZgd330utCAaagGmHsgiMJp67kE14boJEPutnikfz3qOmrzBnDIHUUg==", + "license": "MIT", + "dependencies": { + "c12": "^3.2.0", + "consola": "^3.4.2", + "defu": "^6.1.4", + "destr": "^2.0.5", + "errx": "^0.1.0", + "exsolve": "^1.0.7", + "ignore": "^7.0.5", + "jiti": "^2.5.1", + "klona": "^2.0.6", + "knitwork": "^1.2.0", + "mlly": "^1.8.0", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "rc9": "^2.1.2", + "scule": "^1.3.0", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.15", + "ufo": "^1.6.1", + "unctx": "^2.4.1", + "unimport": "^5.2.0", + "untyped": "^2.0.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, "node_modules/vue3-count-to": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vue3-count-to/-/vue3-count-to-1.1.2.tgz", @@ -21334,18 +17680,6 @@ "vue": ">=3.0.0" } }, - "node_modules/vuex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz", - "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.0.0-beta.11" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -21392,7 +17726,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/webpack-virtual-modules": { @@ -21405,34 +17738,40 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "node_modules/which": { + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "string-width": "^7.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/workerd": { - "version": "1.20250902.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250902.0.tgz", - "integrity": "sha512-rM+8ARYoy9gWJNPW89ERWyjbp7+m1hu6PFbehiP8FW9Hm5kNVo71lXFrkCP2HSsTP1OLfIU/IwanYOijJ0mQDw==", - "dev": true, + "version": "1.20250906.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250906.0.tgz", + "integrity": "sha512-ryVyEaqXPPsr/AxccRmYZZmDAkfQVjhfRqrNTlEeN8aftBk6Ca1u7/VqmfOayjCXrA+O547TauebU+J3IpvFXw==", "hasInstallScript": true, "license": "Apache-2.0", "bin": { @@ -21442,28 +17781,27 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20250902.0", - "@cloudflare/workerd-darwin-arm64": "1.20250902.0", - "@cloudflare/workerd-linux-64": "1.20250902.0", - "@cloudflare/workerd-linux-arm64": "1.20250902.0", - "@cloudflare/workerd-windows-64": "1.20250902.0" + "@cloudflare/workerd-darwin-64": "1.20250906.0", + "@cloudflare/workerd-darwin-arm64": "1.20250906.0", + "@cloudflare/workerd-linux-64": "1.20250906.0", + "@cloudflare/workerd-linux-arm64": "1.20250906.0", + "@cloudflare/workerd-windows-64": "1.20250906.0" } }, "node_modules/wrangler": { - "version": "4.34.0", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.34.0.tgz", - "integrity": "sha512-iU+T8klWX6M/oN9y2PG8HrekoHwlBs/7wNMouyRToCJGn5EFtVl98a1fxxPCgkuUNZ2sKLrCyx/TlhgilIlqpQ==", - "dev": true, + "version": "4.37.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.37.0.tgz", + "integrity": "sha512-W8IbQohQbUHFn4Hz2kh8gi0SdyFV/jyi9Uus+WrTz0F0Dc9W5qKPCjLbxibeE53+YPHyoI25l65O7nSlwX+Z6Q==", "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", - "@cloudflare/unenv-preset": "2.7.2", + "@cloudflare/unenv-preset": "2.7.3", "blake3-wasm": "2.1.5", "esbuild": "0.25.4", - "miniflare": "4.20250902.0", + "miniflare": "4.20250906.2", "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.20", - "workerd": "1.20250902.0" + "unenv": "2.0.0-rc.21", + "workerd": "1.20250906.0" }, "bin": { "wrangler": "bin/wrangler.js", @@ -21476,7 +17814,7 @@ "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20250902.0" + "@cloudflare/workers-types": "^4.20250906.0" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -21491,7 +17829,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21508,7 +17845,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21525,7 +17861,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21542,7 +17877,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21559,7 +17893,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21576,7 +17909,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21593,7 +17925,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21610,7 +17941,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21627,7 +17957,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21644,7 +17973,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21661,7 +17989,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21678,7 +18005,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21695,7 +18021,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21712,7 +18037,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21729,7 +18053,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21746,7 +18069,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21763,7 +18085,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21780,7 +18101,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21797,7 +18117,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21814,7 +18133,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21831,7 +18149,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21848,7 +18165,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21865,7 +18181,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21882,7 +18197,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21899,7 +18213,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -21913,7 +18226,6 @@ "version": "0.25.4", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -21951,72 +18263,59 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -22046,33 +18345,10 @@ "dev": true, "license": "ISC" }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/wsl-utils": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", - "dev": true, "license": "MIT", "dependencies": { "is-wsl": "^3.1.0" @@ -22100,15 +18376,6 @@ "repeat-string": "^1.5.2" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", - "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xss": { "version": "1.0.15", "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.15.tgz", @@ -22131,6 +18398,12 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -22145,7 +18418,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, "license": "ISC" }, "node_modules/yaml": { @@ -22183,70 +18455,86 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz", + "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/youch": { - "version": "4.1.0-beta.11", - "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.11.tgz", - "integrity": "sha512-sQi6PERyO/mT8w564ojOVeAlYTtVQmC2GaktQAf+IdI75/GKIggosBuvyVXvEV+FATAT6RbLdIjFoiIId4ozoQ==", - "dev": true, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", "license": "MIT", "dependencies": { - "@poppinss/colors": "^4.1.5", - "@poppinss/dumper": "^0.6.4", - "@speed-highlight/core": "^1.2.7", - "cookie": "^1.0.2", - "youch-core": "^0.3.3" + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/youch-core": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", - "dev": true, "license": "MIT", "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" @@ -22256,12 +18544,20 @@ "version": "3.24.6", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", - "dev": true, "license": "ISC", "peerDependencies": { "zod": "^3.24.1" } }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -22297,29 +18593,27 @@ } }, "utils/remark-code-import/node_modules/@types/node": { - "version": "20.19.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.13.tgz", - "integrity": "sha512-yCAeZl7a0DxgNVteXFHt9+uyFbqXGy/ShC4BlcHkoE0AfGXYv/BUiplV72DjMYXHDBXFjhvr6DD1NiRVfB4j8g==", + "version": "20.19.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.14.tgz", + "integrity": "sha512-gqiKWld3YIkmtrrg9zDvg9jfksZCcPywXVN7IauUGhilwGV/yOyeUsvpR796m/Jye0zUzMXPKe8Ct1B79A7N5Q==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, - "utils/remark-code-import/node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "utils/remark-code-import/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "bin": { - "prettier": "bin/prettier.cjs" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=14.17" } }, "utils/remark-code-import/node_modules/undici-types": { diff --git a/package.json b/package.json index ca90056e207..6424d236f67 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,11 @@ "description": "Kestra.io website", "type": "module", "scripts": { - "build": "nuxt build", - "dev": "nuxt dev", - "generate": "nuxt generate", - "preview": "nuxt preview", - "postinstall": "nuxt prepare", + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro", "pages:dev": "NITRO_PRESET=cloudflare-pages wrangler pages dev -- npm run dev", "pages:build": "NITRO_PRESET=cloudflare-pages npm run build", "pages:deploy": "wrangler pages deploy --project-name docs ./dist", @@ -17,6 +17,9 @@ "analyze": "nuxt analyze" }, "dependencies": { + "@astrojs/cloudflare": "^12.6.9", + "@astrojs/mdx": "^4.3.6", + "@astrojs/vue": "^5.1.1", "@kestra-io/ui-libs": "^0.0.252", "@popperjs/core": "^2.11.8", "@rive-app/canvas": "^2.31.2", @@ -24,6 +27,8 @@ "@vue-flow/controls": "^1.1.3", "@vue-flow/core": "^1.46.2", "@vueuse/core": "^13.9.0", + "aos": "^2.3.4", + "astro-expressive-code": "^0.41.3", "axios": "^1.11.0", "better-sqlite3": "^12.2.0", "bootstrap": "^5.3.8", @@ -37,33 +42,29 @@ "path-browserify": "^1.0.1", "posthog-js": "^1.261.0", "rapidoc": "^9.3.8", + "remark-link-rewrite": "^1.0.7", "sharp": "^0.34.3", "shiki": "^3.12.1", "slugify": "^1.6.6", + "unist-util-visit": "^5.0.0", "vanilla-cookieconsent": "^3.1.0", - "vue": "^3.5.20", + "vue": "^3.5.21", "vue-material-design-icons": "^5.3.1", "vue3-carousel-nuxt": "^1.1.6", - "vue3-count-to": "^1.1.2", - "vuex": "^4.1.0" + "vue3-count-to": "^1.1.2" }, "devDependencies": { - "@nuxt/content": "^3.6.3", - "@nuxt/devtools": "^2.6.3", - "@nuxt/image": "^1.11.0", - "@nuxtjs/mdc": "^0.17.3", - "@nuxtjs/robots": "^5.5.1", - "@nuxtjs/sitemap": "^7.4.3", - "@saslavik/nuxt-gtm": "^0.1.2", + "@types/aos": "^3.0.7", + "@types/bootstrap": "^5.2.10", "@types/node": "^24.3.0", + "astro": "^5.14.1", "nitro-cloudflare-dev": "^0.2.2", - "nuxt": "^4.0.3", - "nuxt-aos": "^1.2.5", - "nuxt-multi-cache": "^4.0.1", "remark-code-import": "file:./utils/remark-code-import", + "remark-directive": "^4.0.0", "remark-flexible-markers": "^1.3.0", "rss": "^1.2.2", "sass": "^1.91.0", + "sharp": "^0.34.2", "wrangler": "^4.33.1" }, "engines": { diff --git a/pages/index.vue b/pages/index.vue index d28a0baf638..e658db0a445 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -6,9 +6,9 @@ content="Use declarative language to build simpler, faster, scalable and flexible pipelines"/> - - - + + + @@ -21,7 +21,7 @@ - @@ -29,6 +29,7 @@ + diff --git a/src/components/layout.astro b/src/components/layout.astro new file mode 100644 index 00000000000..e21e2a6866e --- /dev/null +++ b/src/components/layout.astro @@ -0,0 +1,50 @@ +--- +import { ClientRouter } from "astro:transitions"; +import "@kestra-io/ui-libs/style.css"; +import "../../assets/styles/vendor.scss"; +import "../../assets/styles/app.scss"; +import Header from "../../components/layout/Header.vue"; +import LayoutFooter from "../../components/layout/Footer.vue"; +import LayoutFixed from "../../components/layout/Fixed.vue"; + + +interface Props { + title?: string; + description?: string; +} + +const props = Astro.props; + +const title = props.title ?? "Kestra, Open Source Declarative Data Orchestration"; +const description = props.description ?? "Documentation for Kestra, the open-source data orchestration and scheduling platform."; +--- + + + + + + + + + + ++ {title} + + + ++ + + + + + + + + + \ No newline at end of file diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 00000000000..e2b43adb113 --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,71 @@ +import { defineCollection, z } from 'astro:content'; +import { glob } from 'astro/loaders'; +import generateId from '../utils/generateId'; +import plugins from './loaders/plugins'; + +export const collections = { + plugins: defineCollection({ + loader: plugins + }), + docs: defineCollection({ + loader: glob({ + pattern: "./**/*.md{,x}", + base: "./src/content/docs", + generateId, + }), + schema: z.object({ + title: z.string(), + description: z.string().optional(), + icon: z.string().optional(), + release: z.string().optional(), + version: z.string().optional(), + editions: z.array(z.enum(["OSS", "EE", "Cloud"])).optional(), + topics: z.array(z.string()).optional(), + stage: z.string().optional(), + hideSubMenus: z.boolean().optional(), + deprecated: z.object({ + since: z.string(), + migrationGuide: z.string(), + }).optional(), + }) + }), + blogs: defineCollection({ + loader: glob({ + pattern: "./**/*.md{,x}", + base: "./src/content/blogs", + generateId, + }), + schema: ({ image }) => + z.object({ + title: z.string(), + description: z.string().optional(), + date: z.date(), + category: z.string(), + author: z.object({ + name: z.string(), + image: z.string(), + twitter: z.string().optional(), + role: z.string().nullable().optional(), + }).optional(), + authors: z.array(z.object({ + name: z.string(), + image: z.string(), + twitter: z.string().optional(), + role: z.string(), + })).optional(), + image: image(), + }) + }), + misc: defineCollection({ + loader: glob({ + pattern: "./*.md{,x}", + base: "./src/content", + generateId, + }), + schema: z.object({ + title: z.string(), + description: z.string().optional(), + icon: z.string().optional(), + }) + }) +}; \ No newline at end of file diff --git a/content/blogs/2022-02-01-kestra-opensource.md b/src/content/blogs/2022-02-01-kestra-opensource.md similarity index 98% rename from content/blogs/2022-02-01-kestra-opensource.md rename to src/content/blogs/2022-02-01-kestra-opensource.md index 94674d7aed7..0fdfeac0490 100644 --- a/content/blogs/2022-02-01-kestra-opensource.md +++ b/src/content/blogs/2022-02-01-kestra-opensource.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-02-01-kestra-opensource.jpg +image: "@assets/blogs/2022-02-01-kestra-opensource.jpg" --- Today, our team is proud to announce a first public release of [Kestra](https://github.com/kestra-io/kestra), an open-source platform to orchestrate & schedule any kinds of workflow at scale. @@ -28,7 +28,7 @@ As you can see, Kestra will handle **all your pipelines** ! ## The History of Kestra! Kestra started in 2019 with this [initial commit](https://github.com/kestra-io/kestra/commit/d57e30c0c0d450590a1eaac5df0e82e1ea94e562). At this time, Kestra was at the proof-of-concept stage. - + To provide a bit of a background: I was working for Leroy Merlin as a consultant. We needed to build a new cloud-based data platform from scratch (destination: mostly Google Cloud Platform). We tried a [lot of things](/blogs/2022-02-22-leroy-merlin-usage-kestra) and failed with some of our attempts. The **biggest setback was the orchestration** software that we tried to deliver with Apache Airflow: a lot of instability (tasks that failed simply due to the Airflow scheduler), performance issues (unable to handle a light workload), and a lack of features (scaling, data processing). After many tests (Google Composer, Open source Airflow on Kubernetes), the decision was final: **Airflow was rejected by Leroy Merlin**. diff --git a/content/blogs/2022-02-22-leroy-merlin-usage-kestra.md b/src/content/blogs/2022-02-22-leroy-merlin-usage-kestra.md similarity index 96% rename from content/blogs/2022-02-22-leroy-merlin-usage-kestra.md rename to src/content/blogs/2022-02-22-leroy-merlin-usage-kestra.md index d8f4d40f0f2..4f7be0e0add 100644 --- a/content/blogs/2022-02-22-leroy-merlin-usage-kestra.md +++ b/src/content/blogs/2022-02-22-leroy-merlin-usage-kestra.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-02-22-leroy-merlin-usage-kestra.jpg +image: "@assets/blogs/2022-02-22-leroy-merlin-usage-kestra.jpg" --- [Adeo](https://www.adeo.com) is the leading French company in the international DIY and home improvement market; it is also one of the world’s top three companies in the industry, and is moving from strength to strength. @@ -75,7 +75,7 @@ By this time, Terraform and BigQuery had demonstrated their strengths and, Airfl ::: ## Kestra to the Rescue - + In the meantime, the Kestra team had started working on the Kestra platform and presented the first version to Leroy Merlin. The LM team leaders were very interested and decided to test the solution for a few months. Since some features were missing at this point, they also decided to contribute to the open-source project and some new plugins. @@ -147,7 +147,7 @@ Thanks to Kestra, they moved **to full autonomy** and **reduced the time to mark ::: ### Go Production - + After a few months, **Kestra was confirmed** and was deployed to a production environment in May of 2020. They also decided to move to the Enterprise Edition of Kestra in August 2020 as they needed to have fine-grained security, role-based access control and single sign-on. @@ -161,9 +161,9 @@ Here are some numbers that show the current usage for January 2022 ( for product - **3,000,000+ tasks** every month - **Equivalent of 2,300 days of task processing time** every month (yep, that’s the equivalent of seventy-five days of task processing every single day) - - - + + + ### Some Testimonials Leroy Merlin has strongly supported the development of Kestra. As with any software, its young age could be a source of frustration for users. They needed to handle missing features, report some bugs, suffer some time loss from instability. But what was astounding was the realization that the **pain was far less than the gain**, and we obtained many good reports on software internal notation tools. It proved to be a solution that users really love and uphold. diff --git a/content/blogs/2022-03-14-kestra-0.4.0-jdbc-batch-vertexai-flow-dependencies.md b/src/content/blogs/2022-03-14-kestra-0.4.0-jdbc-batch-vertexai-flow-dependencies.md similarity index 94% rename from content/blogs/2022-03-14-kestra-0.4.0-jdbc-batch-vertexai-flow-dependencies.md rename to src/content/blogs/2022-03-14-kestra-0.4.0-jdbc-batch-vertexai-flow-dependencies.md index da94f7abf0a..90e8dc8070c 100644 --- a/content/blogs/2022-03-14-kestra-0.4.0-jdbc-batch-vertexai-flow-dependencies.md +++ b/src/content/blogs/2022-03-14-kestra-0.4.0-jdbc-batch-vertexai-flow-dependencies.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-03-14-kestra-0.4.0.jpg +image: "@assets/blogs/2022-03-14-kestra-0-4-0.jpg" --- Since our [public launch](2022-02-01-kestra-opensource), we've done a lot of work to give you the best possible experience, something we hope you will come to expect from [Kestra](https://github.com/kestra-io/kestra). This latest release brings performance improvements to provide a smooth experience with large clusters, as well as some other great features. @@ -23,10 +23,10 @@ As you can see, the same workload previously used 3 executors (we used autoscali After, only **0.5 cores** were necessary through most of the runtime, with a peak of only 1.5 cores for 1 hour, the whole workload was managed by only 2 executors (minimum autoscaling). - + Before
- +After
@@ -34,29 +34,29 @@ On the Kafka side, we also see **improved latency**. The system had a lot of [flow triggers](../docs/04.workflow-components/07.triggers/flow-trigger.md), which needed to be analyzed for each completed execution. When you have a high volume of execution, a lot of messages are sent by Kafka and if your consumer is too slow, the queue fills up and increases latency. Previously, we had a large message lag that led to a late start of flow executions (a few minutes). The optimization allowed us to keep the start of the flow to within a few seconds. - +Before
- +After
The last graph shows the delay between the creation of the task and the task launched by the worker. Since we have optimized Kafka processing globally, we avoid queuing messages on Kafka and reduce the delay between task creation and worker processing. - +Before
- +After
All of these improvements also provide a **significant reduction in total execution time**. As all messages are consumed quickly, the time between each task is reduced and the total runtime is reduced. - +Before
- +After
Keep in mind that Leroy Merlin's workflow is unbalanced, and all executions take place at the same time, more than 3000 executions and more than 35,000 tasks in a short period of time, making up 50% of the entire day's workload. We have to provide the same requirement for night processing, even if we are all asleep. @@ -224,7 +224,7 @@ For the Enterprise Edition, we delivered the most requested features: the abilit We also added a confirmation when deleting a flow that has dependencies, which warns the user that deleting it might break the whole production plan. - + This is a valuable feature that provides a complete view of your entire data pipeline across teams. With many teams consuming data from other teams, no one can be sure whether if this flow is changed, another flow will be impacted. Impact analysis is greatly simplified with this powerful user interface. diff --git a/content/blogs/2022-04-05-debezium-without-kafka-connect.md b/src/content/blogs/2022-04-05-debezium-without-kafka-connect.md similarity index 97% rename from content/blogs/2022-04-05-debezium-without-kafka-connect.md rename to src/content/blogs/2022-04-05-debezium-without-kafka-connect.md index 146e2f24aeb..855b765e210 100644 --- a/content/blogs/2022-04-05-debezium-without-kafka-connect.md +++ b/src/content/blogs/2022-04-05-debezium-without-kafka-connect.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-04-05-debezium-without-kafka-connect.jpg +image: "@assets/blogs/2022-04-05-debezium-without-kafka-connect.jpg" --- ## An In-depth Look at Data Pipeline Management Solutions ## @@ -16,7 +16,7 @@ The importance of data pipeline management and orchestration in today's data lan ### Breaking Down Debezium's Architecture ### - + Debezium is an open-source platform developed by Red Hat that stands out in the [Change Data Capture (CDC)](https://en.wikipedia.org/wiki/Change_data_capture) field. It tracks and records row-level changes in your databases, enabling connected applications to respond in real time. Debezium's strength lies in ensuring exactly-once delivery of all changes in the precise order they were made. Furthermore, Debezium's ability to monitor changes in data from multiple sources and various types of databases makes it a highly adaptable tool in data pipeline management. @@ -38,7 +38,7 @@ For example, from [Amazon MSK connect](https://docs.aws.amazon.com/msk/latest/de > Each MCU represents 1 vCPU of compute and 4 GiB of memory. - + This lead to $160 for 1 source and 1 destination per month. diff --git a/content/blogs/2022-04-27-etl-vs-elt.md b/src/content/blogs/2022-04-27-etl-vs-elt.md similarity index 99% rename from content/blogs/2022-04-27-etl-vs-elt.md rename to src/content/blogs/2022-04-27-etl-vs-elt.md index 1890f2e5603..e84aeede430 100644 --- a/content/blogs/2022-04-27-etl-vs-elt.md +++ b/src/content/blogs/2022-04-27-etl-vs-elt.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-04-27-etl-vs-elt.jpg +image: "@assets/blogs/2022-04-27-etl-vs-elt.jpg" --- A conversation about data pipelines is never complete without discussing ingestion practices: ETL (Extract, Transform, Load) and ELT (Extract, Load, Transform). While they appear similar, the difference lies in the order and location of the Transform phase. Choosing between ETL and ELT involves considerations of data complexity, data warehousing technologies, and the requirements of data projects. But, what if you didn't have to choose and could leverage both using Kestra? @@ -24,7 +24,7 @@ ETL and ELT share the same stages but follow a different sequence: - **Load**: Inserting data into a data storage system. In ELT scenarios, raw/unstructured data is loaded, then transformed within the target system. In ETL, the raw data is transformed into structured data prior to reaching the target. ## The Evolution of ETL ## - + ### The Genesis of ETL ### **ETL** surfaced in the 1970s. Born in an era of expensive storage, ETL transformed raw data into a usable format before delivery to the analytical system. @@ -50,7 +50,7 @@ Implementing ETL today offers several compelling advantages: ## The Rise of ELT ## - + ### The Arrival of ELT ### The advent of cheaper storage and cloud advances led to the emergence of **ELT** in the past decade. ELT eliminates the need for data staging and can handle any data type, unstructured, structured, semi-structured, or even raw data. This flexibility is key to its strong adoption in modern solutions, particularly when large datasets and streaming are involved. diff --git a/content/blogs/2022-06-21-light-architecture.md b/src/content/blogs/2022-06-21-light-architecture.md similarity index 96% rename from content/blogs/2022-06-21-light-architecture.md rename to src/content/blogs/2022-06-21-light-architecture.md index ac4b2b030ee..a6589113b78 100644 --- a/content/blogs/2022-06-21-light-architecture.md +++ b/src/content/blogs/2022-06-21-light-architecture.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-06-21-kestra-light.jpg +image: "@assets/blogs/2022-06-21-kestra-light.jpg" --- When we have launch [Kestra](https://github.com/kestra-io/kestra) [officially](../blogs/2022-02-01-kestra-opensource.md) few month ago, we wanted to have the most **complete, reliable, scalable** product to show you. We are really proud to have the **first cloud native orchestration & scheduling platform** running only with technologies like Kafka and ElasticSearch. Theses bring an architecture with no single point of failure and high throughput in order to scale to millions of executions without the pain. @@ -20,7 +20,7 @@ We have interview many people on our slack community, twitter, ... also that **c For now, we continue to think a high-availability solution is a **must-have**, a solution that can ensure you that if your needs increase, you will have a solution to scale without having to do without the features. So we decide to create a new version of Kestra (in Beta for now) that will work for a Medium-sized environment. - + The solution is to **remove the dependencies of Kafka & ElasticSearch** and to allow to replace them with a **simple MySQL of Postgres** database for the both of them. @@ -31,7 +31,7 @@ The new version is possible since Kestra thought since its inception as **plugga ## Tradeoff using a Database - + We have worked harder to be able to have the **more fluent change** using a database, but we have made some tradeoffs for now (maybe you can go deeper depending on your feedback for a certain point). diff --git a/content/blogs/2022-10-05-kestra-snowflake.md b/src/content/blogs/2022-10-05-kestra-snowflake.md similarity index 98% rename from content/blogs/2022-10-05-kestra-snowflake.md rename to src/content/blogs/2022-10-05-kestra-snowflake.md index 08b77da8036..b46fe7cb12c 100644 --- a/content/blogs/2022-10-05-kestra-snowflake.md +++ b/src/content/blogs/2022-10-05-kestra-snowflake.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-10-05-kestra-snowflake.jpg +image: "@assets/blogs/2022-10-05-kestra-snowflake.jpg" --- Snowflake is one of the most popular cloud data warehouse technologies. This post demonstrates [Kestra](https://github.com/kestra-io/kestra) plugins for Snowflake data management, including event-driven triggers based on changes in your Snowflake data, file management, and queries. @@ -22,7 +22,7 @@ The platform enables organizations to avoid large-scale licensing costs commonly ## Enhancing Snowflake with Kestra ## - + Data warehouse workloads are typically part of a larger technological stack. To streamline operations, orchestration, and scheduling of data pipelines are crucial. This is where Kestra comes into play. diff --git a/content/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.md b/src/content/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.md similarity index 98% rename from content/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.md rename to src/content/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.md index e1d9a0b7c66..dabaeabaee8 100644 --- a/content/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.md +++ b/src/content/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.png +image: "@assets/blogs/2022-11-19-create-data-pipeline-bigquery-google-cloud.png" --- This blog post dives into [Kestra](https://github.com/kestra-io/kestra)'s integrations for Google Cloud Platform (GCP), focusing on BigQuery operations. It demonstrates how to automate repetitive processes and create resilient workflows within the GCP environment using Kestra's orchestration capabilities. @@ -251,7 +251,7 @@ With Kestra, the process of analyzing your flow (DAG) executions becomes intuiti A key aspect of data lineage visualization is the Gantt chart, which provides a clear overview of the time taken for each task's data processing within the flow. In parallel, the Topology feature enables the user to identify and debug the sequence of tasks along with their dependencies. - + Accessing specific information about the flow is simple, requiring only the unique execution ID. This enables efficient data lineage tracking of the flow. You can leverage Kestra's null variable to add any execution identifier to separate different executions in the flow. Furthermore, you can inject a null variable into SQL queries for enhanced data tracking. diff --git a/content/blogs/2023-02-23-techniques-kafka-streams-developer.md b/src/content/blogs/2023-02-23-techniques-kafka-streams-developer.md similarity index 98% rename from content/blogs/2023-02-23-techniques-kafka-streams-developer.md rename to src/content/blogs/2023-02-23-techniques-kafka-streams-developer.md index 8611ac37852..f271f2bb416 100644 --- a/content/blogs/2023-02-23-techniques-kafka-streams-developer.md +++ b/src/content/blogs/2023-02-23-techniques-kafka-streams-developer.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2023-02-23-techniques-kafka-streams-developer.jpg +image: "@assets/blogs/2023-02-23-techniques-kafka-streams-developer.jpg" --- @@ -155,7 +155,7 @@ Remember that all store operations (like get) will lead to deserialization that At first, we designed Kestra to have only one **huge** stream for all the processing of the executor. At first, it seemed cool, but this led to some drawbacks. Here is the last version of our main and only Kafka Stream with many topics 🙉: - + Yes, this is a huge Kafka Stream. It was working well despite its complexity. But the major drawbacks were: - **Monitoring**: All the metrics are under the same consumer group. - **Debugging**: Each topic is consumed independently during a crash. When a message fails, the whole process crashes. diff --git a/content/blogs/2023-03-02-welcome-kestra-0-7-0.md b/src/content/blogs/2023-03-02-welcome-kestra-0-7-0.md similarity index 94% rename from content/blogs/2023-03-02-welcome-kestra-0-7-0.md rename to src/content/blogs/2023-03-02-welcome-kestra-0-7-0.md index 1eb034ccac6..cea3a265b6d 100644 --- a/content/blogs/2023-03-02-welcome-kestra-0-7-0.md +++ b/src/content/blogs/2023-03-02-welcome-kestra-0-7-0.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" twitter: "@tchiotludo" -image: /blogs/2023-03-02-welcome-kestra-0-7-0.jpg +image: "@assets/blogs/2023-03-02-welcome-kestra-0-7-0.jpg" --- We’ve been super busy at [Kestra](https://github.com/kestra-io/kestra) over the last few months, making working with data much more delightful for you. We’ve done much work to elevate the developer experience and introduce powerful features to make Kestra the best data orchestration platform. @@ -24,7 +24,7 @@ Read the full post 😉 We added a Kestra guided tour in the UI. When there is no flow already created, a guided tour will introduce you to Kestra and flow’s main concepts. - + This guided tour can be re-run with the `?` button as shown above. @@ -42,7 +42,7 @@ On the flow editor, you can now use _CTRL + Enter_ to get a suggestion of task t This works thanks to our validation based on a JSON Schema computed for each task. It will also underline errors like missing mandatory properties when you save your flows. - + ### Improved Flow validation @@ -64,13 +64,13 @@ A flow can have one or multiple dependencies, a dependency is another flow that We had a flow page tab on the Enterprise Edition displaying these dependencies (and the dependencies of the dependencies, recursively). **We now moved this tab from the Enterprise Edition to the Open Source Edition**, making it available for everyone! - + ## Mass actions everywhere You can have a lot of flows and executions in your Kestra instances. Until now, actions on flows or executions could only be done one by one. That made it challenging to manage a large number of resources. - + We added support for mass actions for flows, templates, and executions. You can now mass delete all your flows if you want! @@ -84,12 +84,12 @@ You can also select any flows or templates thanks to the new mass action button Flow imports and exports can be very handy when switching between Kestra instances or initiating a CI/CD pipeline. If you need to export everything we added new buttons for this in the Settings page. - + ## Dashboard on OSS On the Enterprise Edition, we had a dashboard on the homepage with many charts, giving some indicators about success, errors, number of executions,… - + **We now moved this dashboard from the Enterprise Edition to the Open Source Edition**, making them available for everyone! diff --git a/content/blogs/2023-04-13-welcome-kestra-0-8-0.md b/src/content/blogs/2023-04-13-welcome-kestra-0-8-0.md similarity index 95% rename from content/blogs/2023-04-13-welcome-kestra-0-8-0.md rename to src/content/blogs/2023-04-13-welcome-kestra-0-8-0.md index 52812ac5859..2224d46d1a3 100644 --- a/content/blogs/2023-04-13-welcome-kestra-0-8-0.md +++ b/src/content/blogs/2023-04-13-welcome-kestra-0-8-0.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: "lmathieu" twitter: "@loicmathieu" -image: /blogs/2023-04-13-welcome-kestra-0-8-0.png +image: "@assets/blogs/2023-04-13-welcome-kestra-0-8-0.png" --- [Kestra](https://github.com/kestra-io/kestra) is back with version 0.8.0, and this time, we're putting the spotlight on enhancing the flow creation experience. We've introduced powerful new features and developer tools that make Kestra the go-to data orchestration platform for data engineers like you. @@ -18,7 +18,7 @@ image: /blogs/2023-04-13-welcome-kestra-0-8-0.png This new release feature the first iteration of our low-code editor. The previous **Source** tab of the **Flow** page has been replaced with a new **Editor** page that allows editing the flow YAML, modifying the flow structure using drag-and-drop, and editing a task easily thanks to a form. This should greatly facilitate flow creation and modification. We’ll appreciate any feedback on it as we plan to improve it in the next release. - + ### Task documentation in the editor @@ -26,7 +26,7 @@ Each task has exhaustive documentation in the [plugin documentation](/plugins/) To limit context switching, we added a contextual panel in the flow editor displaying the current task documentation. So now you can keep your flow at hand while developing and still be close to the documentation. - + ### Improved EachSequential and EachParallel value definition @@ -38,7 +38,7 @@ Tasks can emit metrics, those metrics are accessible as Micrometer metrics along We now moved the storage of task metrics in a dedicated place out of the task attempt and added a new **Metrics** tab on the **Execution** page to access all the metrics of a flow execution. - + ## New core tasks diff --git a/content/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.md b/src/content/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.md similarity index 86% rename from content/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.md rename to src/content/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.md index 915b3e5f90d..e9b96cb3dfb 100644 --- a/content/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.md +++ b/src/content/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.md @@ -6,20 +6,20 @@ category: Company News author: name: Nicolas Callens image: "ncallens" -image: /blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.png +image: "@assets/blogs/2023-04-21-unveiling-kestra-s-new-visual-identity.png" --- As we unveil our new branding, we aim to showcase the sophistication and innovation behind our product, while maintaining a visual identity that is both intuitive and captivating. In this blog post, we will explore the story behind [Kestra](https://github.com/kestra-io/kestra)'s logo, typography, and design elements, delving into the meaning and message they convey. Join us on this journey as we reveal the essence of our brand and how it reflects our dedication to providing the best data orchestration solution for all of our users. ## The Story Behind Kestra's Logo and the Message It Conveys - + When we created Kestra, our ambition was to design a simple yet powerful and fast data orchestration platform. We wanted to enable our clients to manage complex data flows with the same ease as a conductor who leads a complex symphony. This is how our logo was born, which embodies our tool and its ability to orchestrate multiple tasks simultaneously. ## The Logo and Its Components - + The Electric Pink dot located in the pictogram represents Kestra, our data orchestrator. The six diamonds facing it symbolize the different tasks of the workflow and the data software plugins that Kestra manages with ease, just like a conductor who directs each musician with precision. Together, they execute a complex musical score, orchestrated with skill. @@ -27,31 +27,31 @@ The Electric Pink dot and the triangle formed by the six diamonds represent an u ## Typography and Typeface - + The name "Kestra" is written in lowercase and stylized in the Alliance Typeface font to reflect technological innovation, open-source, and scalable technologies. We added a new Electric Pink dot at the end of our product name, reminiscent of the Kestra orchestrator in the pictogram, but also to subtly evoke the expression "Kestra, period!", symbolizing the uniqueness of Kestra and its guarantee to be the best orchestration solution for all our users' needs. ## The Message Behind the Logo - + Our logo is a symbol of Kestra's expertise and efficiency in data orchestration. It suggests to our clients our commitment to providing the best solution on the market. The goal of the Kestra logo is to captivate attention, affirm our modernity and ambition, while subtly suggesting our pride, talent, reliability, and performance. ## Evoking a Sense of Harmony and Precision - + Just as a conductor brings harmony and precision to a symphony, Kestra's visual identity seeks to convey the same sense of balance and control. The combination of colors, shapes, and typography in our logo and branding materials reflects our dedication to creating a user-friendly, intuitive platform that empowers data professionals to orchestrate their workflows with ease and precision. ## A Modern and Ambitious Design - + Kestra's new visual identity showcases our dedication to staying at the forefront of technology and innovation. Our modern and ambitious design reflects our commitment to continuous improvement, ensuring that our platform remains the best-in-class solution for data orchestration. By incorporating a sleek and contemporary aesthetic, we aim to communicate our unwavering dedication to providing the most efficient and powerful data orchestration platform on the market. ## A Visual Identity That Resonates - + In conclusion, our new visual identity not only captures the essence of Kestra's mission but also resonates with our clients, partners, and the data community at large. The combination of our logo, typography, and design elements creates a cohesive and impactful visual identity that communicates our core values and solidifies them. diff --git a/content/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.md b/src/content/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.md similarity index 92% rename from content/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.md rename to src/content/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.md index d49ca19842f..3a53026ce05 100644 --- a/content/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.md +++ b/src/content/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.md @@ -1,12 +1,12 @@ --- title: "Automate Data Analysis With Kestra and DuckDB" -description: Use Kestra and DuckDB to extract, process, and organize tech job salary data for better insights. +description: Use Kestra and DuckDB to extract, process, and organize tech job salary data for better insights. date: 2023-04-25T18:00:00 category: Solutions author: name: Martin Pierre Roset image: "mproset" -image: /blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.jpg +image: "@assets/blogs/2023-04-25-automate-data-analysis-with-kestra-and-duckdb.jpg" --- [Kestra](https://github.com/kestra-io/kestra), in collaboration with [DuckDB](https://motherduck.com/), offers a highly efficient way to analyze CSV files. In this blog post, we will focus on how these two platforms can be employed to automate data analysis. @@ -29,7 +29,7 @@ tasks: inputFiles: data.csv: "{{ outputs.download_csv.uri }}" sql: | - SELECT + SELECT job_title, ROUND(AVG(salary),2) AS avg_salary FROM read_csv_auto('{{workingDir}}/data.csv', header=True) @@ -55,7 +55,7 @@ Creating a flow in Kestra to execute this task becomes a straightforward process inputFiles: data.csv: "{{ outputs.download_csv.uri }}" sql: | - SELECT + SELECT job_title, ROUND(AVG(salary),2) AS avg_salary FROM read_csv_auto('{{workingDir}}/data.csv', header=True) @@ -77,13 +77,13 @@ id: export_result The final task, export_result, uses Kestra's CsvWriter plugin to convert the result of the DuckDB query, which is stored as an ION file, into a CSV file. ION (short for Interchange Object Notation) is a data serialization format similar to JSON but designed to be more efficient in terms of storage and transmission, and it's strongly typed, ensuring data integrity. The use of ION allows for compact storage of query results while maintaining the flexibility to easily convert the data into other formats like CSV. In the end, you can download the CSV output directly to your computer for further analysis and sharing. - + ## Exploring Further with Kestra and DuckDB For those who are interested in exploring more about the capabilities and use cases of Kestra and DuckDB, the [Blueprints](/blueprints?q=duck) provides valuable resources and pre-built workflows that you can use as a starting point for your own tasks. - + If you are particularly interested in learning more about DuckDB and its various applications, you can check out this blog post: [DuckDB vs MotherDuck](https://kestra.io/blogs/2023-07-28-duckdb-vs-motherduck). It provides a comprehensive comparison between DuckDB and its in-memory, shareable version, MotherDuck, and will give you further insights into how to use these tools effectively in your own data workflows. diff --git a/content/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.md b/src/content/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.md similarity index 94% rename from content/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.md rename to src/content/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.md index f1ba88d8eef..ab54f0cfb62 100644 --- a/content/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.md +++ b/src/content/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.md @@ -1,12 +1,12 @@ --- title: "Analyzing and Processing Log Files with Azure Blob Storage, Azure Batch, and Kestra" -description: Use Kestra and Azure to process and analyze log files in the cloud. +description: Use Kestra and Azure to process and analyze log files in the cloud. date: 2023-05-09T12:00:00 category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-05-09-analyzing-processing-logs-azure-kestra.jpg +image: "@assets/blogs/2023-05-09-analyzing-processing-logs-azure-kestra.jpg" --- Check out how those three cloud-based technologies are working together to efficiently manage, store, and process large-scale log files. @@ -21,7 +21,7 @@ Azure Batch is a cloud-based job scheduling service that simplifies running larg Let's say you want to collect millions of log files daily from various sources, such as web servers, IoT devices, and mobile applications. You will need to process and analyze these logs to gain insights, detect anomalies, and optimize the performance of your systems. To accomplish this, you can utilize Azure Blob Storage, Azure Batch, and an orchestrator such as [Kestra](https://github.com/kestra-io/kestra). - + ## Storing Log Files with Azure Blob Storage @@ -100,7 +100,7 @@ Kestra can be used to manage the process of transferring logs from your sources You can create a Kestra workflow that gets triggered whenever a new log can be consumed from Kafka. The workflow can perform tasks such as validating the log file's format, uploading it to Azure Blob Storage, and initiating the Azure Batch application to process the logs. Kestra can also monitor the progress of the Azure Batch application, send notifications in case of any issues, and store the results in a designated location. - + Here are some resources if you want to reproduce such a use case: diff --git a/content/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.md b/src/content/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.md similarity index 93% rename from content/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.md rename to src/content/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.md index e4b9b99fcbd..97678fbd4aa 100644 --- a/content/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.md +++ b/src/content/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin Pierre Roset image: "mproset" -image: /blogs/2023-05-22-data-orchestration-choosing-the-right-tool.jpg +image: "@assets/blogs/2023-05-22-data-orchestration-choosing-the-right-tool.jpg" --- The world of data engineering is constantly evolving, especially in the face of the progress introduced by AI. This article outlines how [Kestra](https://github.com/kestra-io/kestra) addresses the requirements of organizations in search of a proficient data orchestrator. @@ -28,12 +28,12 @@ Managing dependencies can be a challenge as workflows grow in complexity. Kestra Kestra's intuitive and user-friendly interface makes the tool accessible to both data engineers and business stakeholders. Despite dealing with complex workflows, Kestra ensures the user interface remains simple and understandable. With an embedded code editor, auto-completion, and clear visualization of workflow dependencies, Kestra simplifies data orchestration management. ### 5-Integration & Extension capabilities ### - + Kestra's flexibility and versatility, underlined by its extensive [range of plugins](/plugins/), makes it an ideal tool for creating complex workflows with deep integrations with multiple systems. For systems without existing plugins, Kestra's compatibility with containers such as **Docker** and **Kubernetes** makes integration straightforward. ### 6-Monitoring ### - + Troubleshooting any issue occurring on your workflow is a very important step of your orchestration. Kestra offers real-time visibility into your workflows, enabling you to identify and address issues quickly. You can track task execution, dependencies, failures, and more, which provides you with the granular detail necessary to effectively manage your data orchestration. @@ -41,7 +41,7 @@ Troubleshooting any issue occurring on your workflow is a very important step of Ensuring workflows are tested before they are pushed into production can save a lot of trouble down the line. With Kestra, workflows can be thoroughly tested before they go live, providing an essential safety net for your data project. ### 8-Documentation ### - + Good documentation supports a smoother learning process and encourages team collaboration. We have a strong focus on our integrated documentation, reducing the learning curve and making it easier for teams to work together effectively. diff --git a/content/blogs/2023-05-25-welcome-kestra-0-9-0.md b/src/content/blogs/2023-05-25-welcome-kestra-0-9-0.md similarity index 93% rename from content/blogs/2023-05-25-welcome-kestra-0-9-0.md rename to src/content/blogs/2023-05-25-welcome-kestra-0-9-0.md index 48663d41167..f344533e5d4 100644 --- a/content/blogs/2023-05-25-welcome-kestra-0-9-0.md +++ b/src/content/blogs/2023-05-25-welcome-kestra-0-9-0.md @@ -7,7 +7,7 @@ author: name: Benoit Pimpaud image: "bpimpaud" twitter: "@Ben8t" -image: /blogs/2023-05-25-welcome-kestra-0-9-0.jpg +image: "@assets/blogs/2023-05-25-welcome-kestra-0-9-0.jpg" --- We're excited to announce the release of Kestra 0.9. This latest update brings a range of user experience improvements to make data orchestration a more enjoyable experience. Let's dive into the key features and enhancements. @@ -20,9 +20,9 @@ With Kestra 0.9.0, we've introduced a new Metrics tab at the flow-execution leve There are two types of metrics that you can track: counter and timer. [This documentation page](https://kestra.io/docs/plugin-developer-guide/outputs#use-cases-for-metrics) includes an example showing how you can leverage these two metric types to track how many rows get processed in each partition and how long this process took. - + - + ## Save Flows as Drafts @@ -39,7 +39,7 @@ We've focused on enhancing the user experience with the following improvements: * **Task-required properties listed first**: In documentation pages, required properties of any task are now prioritized and listed first, making it clearer which properties are required and which are optional. * **Additional improvements and fixes**: We've implemented several enhancements and fixes, including improved flow and inputs validation, enhanced page redirects, fixed Gantt display issues, improved error messaging, resolved theme discrepancies, and more. These refinements ensure a smoother user experience and enhance the overall stability of Kestra. - + ## Introducing New Plugins With Kestra 0.9.0, we're thrilled to introduce new plugins that extend the capabilities of the platform: @@ -93,7 +93,7 @@ Finally, we also move update Java from version 11 to 17. If you have custom plug To take the new features for a spin, you can start Kestra using Docker Compose. - + Kestra is continuously improving. While the [Git plugin](/plugins/plugin-git) simplifies working with custom scripts, we are working on further improving the user experience in orchestrating custom business logic built in Python. Follow us on [Twitter](https://twitter.com/kestra_io) or [LinkedIn](https://fr.linkedin.com/company/kestra) to stay up to date with the new releases and updates. diff --git a/content/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.md b/src/content/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.md similarity index 93% rename from content/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.md rename to src/content/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.md index f57f81f332d..737477c3d33 100644 --- a/content/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.md +++ b/src/content/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.md @@ -1,15 +1,15 @@ --- title: "Track Resource Usage from BigQuery with Kestra's Metric Dashboard" -description: Get insight on the bytes processed by your queries on BigQuery to manage your costs. +description: Get insight on the bytes processed by your queries on BigQuery to manage your costs. date: 2023-05-30T12:00:00 category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.jpg +image: "@assets/blogs/2023-05-30-track-resource-usage-from-bigquery-with-kestra-metric-dashboard.jpg" --- -Data Warehouse solutions can sometimes become costly, especially with an uptick in data processing demand. Cloud-based data warehouses like Google BigQuery offer significant advantages in terms of scalability and performance. Yet, with great scalability comes great responsibility, managing your resources usage effectively. +Data Warehouse solutions can sometimes become costly, especially with an uptick in data processing demand. Cloud-based data warehouses like Google BigQuery offer significant advantages in terms of scalability and performance. Yet, with great scalability comes great responsibility, managing your resources usage effectively. ## Track BigQuery usage ## @@ -26,8 +26,8 @@ tasks: - id: query type: io.kestra.plugin.gcp.bigquery.Query sql: | - SELECT - SUM(price) as sum_price + SELECT + SUM(price) as sum_price FROM sales.event_partitioned WHERE date = '{{ trigger.date }}' @@ -51,7 +51,7 @@ So, Kestra will execute this task every hour, running the specified SQL query on ### UI Results ### - + The Metric dashboard provides a seamless way to look at metrics for every Flow execution. In our example we can see that at some point our query processed more bytes than before - growing our BigQuery bill. @@ -70,5 +70,5 @@ In future releases we will add [proper SLA capabilities](https://github.com/kest For a deeper exploration of the potential applications of the Metric Dashboard you can learn more with our [documentation](https://kestra.io/docs/developer-guide/outputs). Join the Slack [community](https://kestra.io/slack) if you have any questions or need assistance. -Follow us on [Twitter](https://twitter.com/kestra_io) for the latest news. +Follow us on [Twitter](https://twitter.com/kestra_io) for the latest news. Check the code in our [GitHub repository](https://github.com/kestra-io/kestra) and give us a star if you like the project. diff --git a/content/blogs/2023-05-31-beginner-guide-kestra.md b/src/content/blogs/2023-05-31-beginner-guide-kestra.md similarity index 93% rename from content/blogs/2023-05-31-beginner-guide-kestra.md rename to src/content/blogs/2023-05-31-beginner-guide-kestra.md index 024559e544a..b17c6c6cc9b 100644 --- a/content/blogs/2023-05-31-beginner-guide-kestra.md +++ b/src/content/blogs/2023-05-31-beginner-guide-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Quentin Sinig image: "qsinig" -image: /blogs/2023-05-31-beginner-guide-kestra.jpg +image: "@assets/blogs/2023-05-31-beginner-guide-kestra.jpg" --- This guide was written by a non-technical user **for** non-technical users. Being familiar with a terminal is a plus and not mandatory. @@ -36,14 +36,14 @@ As a person without an engineering background, manipulating the Command Line Int ### 1-Download Docker Extension for VSC ### After installing Visual Studio Code, download [Docker Extension for VSC](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) and directly click right on `the docker-compose.yaml` file to access the `Compose Up` command. If any dependency is missing on your local machine, leveraging this plugin will overcome the issue. - + ### 2-Use and re-use the Docker Desktop UI ### Thanks to the UI, you can directly search the `Kestra installer` (a.k.a the Docker image) via the Search Bar. You can also decide which version you want to pick up. Once it’s done, you can keep using it to stop/start your server and directly open Kestra in Visual Studio Code. - + - + You can also download [Docker Extension for VSC](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker) and directly click right on the docker-compose.yaml file to access the `Compose Up` command. @@ -51,7 +51,7 @@ You can also download [Docker Extension for VSC](https://marketplace.visualstudi Once you're in, the easiest thing to do is the follow the [Guided Tour](https://kestra.io/docs/flow-examples/example-guided-tour.html) automatically suggested by Kestra. Step by step, several code snippets will appear in a dialog box. The good news is: they're written in YAML, a human-readable file format. - + Personally, I like to pause between each step. Indeed, **to understand**, I need to: @@ -141,7 +141,7 @@ tasks: from: "{{ outputs.downloadCsv.uri }}" ``` - + Yaiiii! Congrats! You just wrote your first flow to download a CSV and transform it into a JSON file! diff --git a/content/blogs/2023-06-26-end-to-end-data-orchestration.md b/src/content/blogs/2023-06-26-end-to-end-data-orchestration.md similarity index 96% rename from content/blogs/2023-06-26-end-to-end-data-orchestration.md rename to src/content/blogs/2023-06-26-end-to-end-data-orchestration.md index c469b1aaf2b..c40dcec24d9 100644 --- a/content/blogs/2023-06-26-end-to-end-data-orchestration.md +++ b/src/content/blogs/2023-06-26-end-to-end-data-orchestration.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-06-26-end-to-end-data-orchestration.png +image: "@assets/blogs/2023-06-26-end-to-end-data-orchestration.png" --- @@ -36,7 +36,7 @@ Then, you can begin creating your sources, destinations, and connections: - The **destination** is typically your data warehouse or a data lake platform (*such as BigQuery, Snowflake, Redshift, Databricks, Dremio, Starburst, Azure Synapse, and more*). - Finally, **connections** tie sources and destinations together by specifying how and when to load data from a specific source to a specific destination. - + ## dbt @@ -68,7 +68,7 @@ Then, run `docker compose up -d` and navigate to the UI under `http://localhost: The UI ships with Blueprints, which provide ready-to-use flow examples. For instance, you can use [the following Blueprint](/blueprints/airbyte-sync-parallel-with-dbt) that combines all steps needed to orchestrate Airbyte, dbt, and Kestra: - + Here is a copy of that Blueprint. Make sure that you copy the ID of each connection from the Airbyte UI and paste those into the Airbyte task: @@ -132,7 +132,7 @@ pluginDefaults: When you execute that workflow, you should see a similar output: - + The flow runs four Airbyte data ingestion processes in parallel. Once raw data is successfully ingested, the flow clones a Git repository and runs dbt CLI commands that build models committed to that Git repository. diff --git a/content/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.md b/src/content/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.md similarity index 96% rename from content/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.md rename to src/content/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.md index 198dae6510a..8bd91b0447d 100644 --- a/content/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.md +++ b/src/content/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: "ageller" -image: /blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.png +image: "@assets/blogs/2023-07-10-release-0-10-blueprints-worker-groups-scripts.png" --- @@ -16,7 +16,7 @@ We're thrilled to announce Kestra 0.10.0, which introduces Blueprints and a new ## Blueprints - + Blueprints provide a curated, organized, and searchable catalog of ready-to-use examples designed to help you kick-start your workflow. Each Blueprint combines code and documentation and can be assigned several tags for easier discoverability. @@ -26,7 +26,7 @@ Blueprints are accessible from two places in the UI: 1. The left navigation **sidebar** 2. A dedicated **tab in the code editor** named "Source and Blueprints", showing your source code and blueprints side by side. - + The current blueprint catalog encompasses a wide range of use cases and integrations, e.g., Snowflake, BigQuery, DuckDB, Slack, ETL, ELT, Pandas, GPU, Git, Python, Docker, Redis, MongoDB, dbt, Airbyte, Fivetran, etc. @@ -39,7 +39,7 @@ The Enterprise Edition allows the creation of **internal** Blueprints, helping y Here is what Custom Blueprints look like in the UI: - + ## Improved Support for Scripts and Docker @@ -155,7 +155,7 @@ So far, modifying existing labels or introducing new ones was only possible by a The labels configured within workflow code are automatically propagated to Execution labels. For instance, if you override the `owner` label at runtime, the result will be tracked as follows: - + ## DAG task @@ -168,7 +168,7 @@ The workflow below demonstrates a simple use case where there are: - several tasks that extract raw data (*here: orders, customers, and payments tasks*) - one task that takes that raw data as input and transforms it (*here, using `dbt`*). - + Here is a workflow example that uses the [new DAG task](/plugins/core/tasks/flows/io.kestra.plugin.core.flow.Dag): diff --git a/content/blogs/2023-07-12-your-private-app-store-for-data-pipelines.md b/src/content/blogs/2023-07-12-your-private-app-store-for-data-pipelines.md similarity index 95% rename from content/blogs/2023-07-12-your-private-app-store-for-data-pipelines.md rename to src/content/blogs/2023-07-12-your-private-app-store-for-data-pipelines.md index 95e6825c436..22a6d5d9673 100644 --- a/content/blogs/2023-07-12-your-private-app-store-for-data-pipelines.md +++ b/src/content/blogs/2023-07-12-your-private-app-store-for-data-pipelines.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-07-12-your-private-app-store-for-data-pipelines.png +image: "@assets/blogs/2023-07-12-your-private-app-store-for-data-pipelines.png" --- @@ -32,7 +32,7 @@ Blueprints is a curated, organized, and searchable catalog of ready-to-use examp All blueprints are validated and documented so that they *just work*. You can easily customize and integrate them into your new or existing flows with a single click on the “Use” button. - + ## Getting Started with Blueprints @@ -44,7 +44,7 @@ Blueprints are accessible from two places in the UI: 1. The left navigation **sidebar** 2. A dedicated **tab** in the code editor named *“Source and blueprints”,* showing your source code and Blueprints side by side. - + Once you are on the Blueprints page, you can: diff --git a/content/blogs/2023-07-28-duckdb-vs-motherduck.md b/src/content/blogs/2023-07-28-duckdb-vs-motherduck.md similarity index 98% rename from content/blogs/2023-07-28-duckdb-vs-motherduck.md rename to src/content/blogs/2023-07-28-duckdb-vs-motherduck.md index 1034831059c..01e1d08d16b 100644 --- a/content/blogs/2023-07-28-duckdb-vs-motherduck.md +++ b/src/content/blogs/2023-07-28-duckdb-vs-motherduck.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-07-28-duckdb-vs-motherduck.png +image: "@assets/blogs/2023-07-28-duckdb-vs-motherduck.png" --- @@ -203,7 +203,7 @@ D show databases; -- verify that orders database got ingested The local `orders` database is now in the cloud, and you can run queries from a friendly, lightweight notebook interface. - + Our local orders database is now in the cloud — image by the author @@ -238,11 +238,11 @@ So far, we’ve executed standalone queries. Let’s now cover some end-to-end u To get started with Kestra, you can download the [Docker Compose file](https://github.com/kestra-io/kestra/blob/develop/docker-compose.yml), run `docker compose up -d` and launch the UI from http://localhost:8080. From here, you can find several built-in DuckDB examples available in the UI as [Blueprints](https://kestra.io/docs/user-interface-guide/blueprints). - + I found the blueprint “[Extract data, mask sensitive columns using DuckDB and load it to BigQuery](/blueprints/sensitive-data)” particularly useful. Source systems often contain sensitive data that requires pseudonymization before you are allowed to load that data to a data warehouse and use it for analytics. DuckDB provides utility functions such as `hash()` and `md5()` that can mask sensitive columns between the extract and load steps in a data pipeline. The example shown in the image below illustrates how DuckDB helps solve fairly complex problems in a simple SQL query. - + Here is a brief summary of other data pipeline blueprints using DuckDB: diff --git a/content/blogs/2023-08-05-iceberg-for-aws-users.md b/src/content/blogs/2023-08-05-iceberg-for-aws-users.md similarity index 89% rename from content/blogs/2023-08-05-iceberg-for-aws-users.md rename to src/content/blogs/2023-08-05-iceberg-for-aws-users.md index 2becb0c460f..d9335692104 100644 --- a/content/blogs/2023-08-05-iceberg-for-aws-users.md +++ b/src/content/blogs/2023-08-05-iceberg-for-aws-users.md @@ -6,10 +6,10 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-08-05-iceberg-for-aws-users.png +image: "@assets/blogs/2023-08-05-iceberg-for-aws-users.png" --- -This crash course will guide you on how to get started with [Apache Iceberg](https://iceberg.apache.org/) on AWS. By the end of this tutorial, you'll be able to create Iceberg tables, insert and modify data stored in S3 in Parquet format, query data and table metadata in plain SQL, and declaratively manage the data ingestion process. Let's get started. +This crash course will guide you on how to get started with [Apache Iceberg](https://iceberg.apache.org/) on AWS. By the end of this tutorial, you'll be able to create Iceberg tables, insert and modify data stored in S3 in Parquet format, query data and table metadata in plain SQL, and declaratively manage the data ingestion process. Let's get started. ## What is Iceberg @@ -20,15 +20,15 @@ It still may sound too abstract, so let’s see it in action. ## Iceberg demo with Amazon Athena and S3 from the AWS console -To follow along with this demo, you need an AWS account. We'll be using Amazon Athena, Amazon S3, and the AWS Glue catalog. +To follow along with this demo, you need an AWS account. We'll be using Amazon Athena, Amazon S3, and the AWS Glue catalog. If you don't have an S3 bucket yet, you can create one following [this AWS documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html). -Then, go to the Athena console and click "Edit Settings" to configure your query result location. This is required by Athena to e.g. cache query results. You can use the same bucket you created earlier as a location for query results. +Then, go to the Athena console and click "Edit Settings" to configure your query result location. This is required by Athena to e.g. cache query results. You can use the same bucket you created earlier as a location for query results. To keep things simple, choose the same AWS region for both Athena and your S3 bucket. - + ### Create an Iceberg table @@ -47,7 +47,7 @@ LOCATION 's3://kestraio/fruits/' -- adjust to your S3 bucket name TBLPROPERTIES ('table_type'='ICEBERG'); ``` -Let's explain what the query does. First, we define the columns and their data types. The `berry` column is a `boolean` property that we'll use for partitioning. It will divide the data into two partitions: `berry=true` and `berry=false`. +Let's explain what the query does. First, we define the columns and their data types. The `berry` column is a `boolean` property that we'll use for partitioning. It will divide the data into two partitions: `berry=true` and `berry=false`. The `LOCATION` keyword determines where Iceberg will store `data` and `metadata` files: - **Data** files contain the actual data stored in a `parquet` format @@ -57,7 +57,7 @@ The `TBLPROPERTIES` keyword tells Athena that we want to use the Iceberg format After executing this query, you should see a new Iceberg table called `fruits` in the Athena table list on the left. - + ### Insert new rows using `INSERT INTO` @@ -65,12 +65,12 @@ After executing this query, you should see a new Iceberg table called `fruits` i So far, we've created an empty table. Let's insert some data into it. ```sql -INSERT INTO fruits (id, fruit, berry) - VALUES (1,'Apple', false), - (2, 'Banana', false), - (3, 'Orange', false), - (4, 'Blueberry', true), - (5, 'Raspberry', true), +INSERT INTO fruits (id, fruit, berry) + VALUES (1,'Apple', false), + (2, 'Banana', false), + (3, 'Orange', false), + (4, 'Blueberry', true), + (5, 'Raspberry', true), (6, 'Pear', false); ``` @@ -79,78 +79,78 @@ INSERT INTO fruits (id, fruit, berry) Let's add a couple of new rows in a separate SQL statement to demonstrate later how Iceberg handles transactions and file partitioning. ```sql -INSERT INTO fruits (id, fruit, berry) - VALUES (7,'Mango', false), - (8, 'Strawberry', true), - (9, 'Kiwi', false), +INSERT INTO fruits (id, fruit, berry) + VALUES (7,'Mango', false), + (8, 'Strawberry', true), + (9, 'Kiwi', false), (10, 'Cranberry', true); ``` Finally, let's inspect the data we've just inserted. ```sql -SELECT * -FROM fruits +SELECT * +FROM fruits ORDER BY berry; ``` You should see the following results: - + Marvellous! We were able to _just_ insert rows to files in a data lake as if we were using a regular relational database. This is the power of Iceberg — it brings transactions to the data lake. -### Modify rows using ``UPDATE`` and ``DELETE`` +### Modify rows using ``UPDATE`` and ``DELETE`` Similarly to how Iceberg allowed us to perform row-level inserts, we can also modify data in the table using `UPDATE` and `DELETE` SQL statements. -Let's imagine that, [as Erik](https://twitter.com/bernhardsson/status/1685636090365968384?t=kcOfZyJ1XPhfKBRVbuXfpg&s=19), you grew up eating Bilberries, thinking that those are just regular Blueberries. +Let's imagine that, [as Erik](https://twitter.com/bernhardsson/status/1685636090365968384?t=kcOfZyJ1XPhfKBRVbuXfpg&s=19), you grew up eating Bilberries, thinking that those are just regular Blueberries. - + Let's correct that in our data: ```sql -UPDATE fruits -SET fruit = 'Bilberry' +UPDATE fruits +SET fruit = 'Bilberry' WHERE fruit = 'Blueberry'; ``` Let’s also remove the banana to avoid debates about whether a banana is actually a berry or not. ```sql -DELETE FROM fruits +DELETE FROM fruits WHERE fruit = 'Banana'; ``` Let's validate what we have so far in the table: ```sql -SELECT * -FROM fruits +SELECT * +FROM fruits ORDER BY berry; ``` - + Excellent! We've just updated and deleted rows in our data lake as if it were a relational data store. Let's now inspect the table metadata to see how Iceberg handles these operations under the hood. ### Iceberg metadata -First, let's look at files that are stored in our S3 bucket. You can explore them in the AWS console or using the AWS CLI. +First, let's look at files that are stored in our S3 bucket. You can explore them in the AWS console or using the AWS CLI. ```bash aws s3 ls s3://yourbucket/fruits/ --recursive --summarize --human-readable -``` +``` You should see 28 files structured in the following way: - + The `data` folder contains `parquet` files with the actual data, and the `metadata` folder contains Iceberg-internal metadata information. -Note that as an end-user, you shouldn't have to worry about the storage layer. Those files are managed by Iceberg. Instead, you can use dedicated metadata properties that Iceberg exposes on each table, as shown in the code block below. This allows you to inspect the table's history, partitions, snapshots, files on S3, and more — you can query all that metadata in plain SQL. +Note that as an end-user, you shouldn't have to worry about the storage layer. Those files are managed by Iceberg. Instead, you can use dedicated metadata properties that Iceberg exposes on each table, as shown in the code block below. This allows you to inspect the table's history, partitions, snapshots, files on S3, and more — you can query all that metadata in plain SQL. ```sql SELECT * FROM "fruits$files"; @@ -164,30 +164,30 @@ SELECT * FROM "fruits$refs"; Let's look at the table history: ```sql -SELECT * +SELECT * FROM "fruits$history"; ``` You should see four rows, which reflect two INSERTS, one UPDATE and one DELETE operations that we have executed so far. The ``fruits$snapshots`` provides a summary of each operation (*showing which files or partitions have been added, modified or deleted*), as you can see in the image below: ```sql -SELECT snapshot_id, summary +SELECT snapshot_id, summary FROM "fruits$snapshots"; ``` - + Let's copy that snapshot ID and inspect the table as of the time when that snapshot was taken: ```sql -SELECT * -FROM fruits +SELECT * +FROM fruits FOR VERSION AS OF 4739764842480661991; ``` You can see that back then, Banana was still in our data: - + ### Time travel @@ -197,21 +197,21 @@ Apart from inspecting a specific table's snapshot version, you can also query th Let’s see what berries existed in our data 5 minutes ago: ```sql -SELECT * -FROM fruits -FOR TIMESTAMP AS OF (current_timestamp - interval '5' minute) +SELECT * +FROM fruits +FOR TIMESTAMP AS OF (current_timestamp - interval '5' minute) WHERE berry = true; ``` Back then, we were still under the illusion that we grew up eating Blueberries, while these were actually Bilberries: - + ### Bulk data ingestion -So far, we've been inserting data into our table row by row. However, data lakes are typically used for big data processed via batch or streaming jobs. +So far, we've been inserting data into our table row by row. However, data lakes are typically used for big data processed via batch or streaming jobs. -There are two common patterns of ingesting data to existing Iceberg tables: inserts and upserts. Both of them require loading data into a different (temporary) table before being ingested to the final destination via a separate query. +There are two common patterns of ingesting data to existing Iceberg tables: inserts and upserts. Both of them require loading data into a different (temporary) table before being ingested to the final destination via a separate query. Let's ingest new rows from a file into a temporary table. We'll use `pandas` and ``awswrangler`` libraries to read data from a CSV file into a dataframe. Then, we'll insert that dataframe into a temporary table called `raw_fruits`: @@ -250,13 +250,13 @@ pip install awswrangler We can validate that the table was successfully created by running the following query: ```sql -SELECT * +SELECT * FROM raw_fruits; ``` - + -The data looks good. Alas, the banana strikes back! 🥊🍌 We'll take care of that when building an end-to-end data pipeline in the final section. +The data looks good. Alas, the banana strikes back! 🥊🍌 We'll take care of that when building an end-to-end data pipeline in the final section. ### Inserts and upserts in Iceberg @@ -281,30 +281,30 @@ MERGE INTO fruits f USING raw_fruits r Let's inspect all fruits that start with B (to check on our beloved Bilberry, Blueberry and Banana): ```sql -SELECT * -FROM fruits +SELECT * +FROM fruits WHERE fruit LIKE 'B%'; ``` This looks great! We inserted new data and ensured that no Blueberries or Bananas made it to the final dataset. - + Let's look at the files generated so far by Iceberg: ```sql -SELECT * +SELECT * FROM "fruits$files"; ``` - + That's quite a lot of files for such a small dataset. Luckily, Iceberg provides a simple SQL statement to help with that issue. ### Time for some Iceberg magic: ``OPTIMIZE`` 🪄 -The common challenge in managing data lakes is the ["Small Files Problem"](https://www.acceldata.io/blog/managing-small-files-in-data-lake), where a large number of small files leads to wasted storage, slower reads and longer processing times. Iceberg provides a simple solution to that problem — the `OPTIMIZE` operation. +The common challenge in managing data lakes is the ["Small Files Problem"](https://www.acceldata.io/blog/managing-small-files-in-data-lake), where a large number of small files leads to wasted storage, slower reads and longer processing times. Iceberg provides a simple solution to that problem — the `OPTIMIZE` operation. The `OPTIMIZE table REWRITE DATA` is a SQL statement in Amazon Athena that, under the hood, uses Iceberg stored procedures to consolidate small files into bigger files optimized for analytics. The command shown below will automatically rewrite data stored in S3 based on their size, partitioning schema and the number of associated delete files. Magic! 🪄 @@ -315,18 +315,18 @@ OPTIMIZE fruits REWRITE DATA USING BIN_PACK; Let's look at the files again: ```sql -SELECT record_count, file_path +SELECT record_count, file_path FROM "fruits$files"; ``` - + -Iceberg automatically clustered all ``berries`` and ``non-berries`` together into separate files based on the partitioning scheme we provided when creating the table. +Iceberg automatically clustered all ``berries`` and ``non-berries`` together into separate files based on the partitioning scheme we provided when creating the table. -### Iceberg magic part 2: ``VACUUM`` 🪄 +### Iceberg magic part 2: ``VACUUM`` 🪄 -Iceberg provides even more useful operations for data management. The `VACUUM` statement will do the following: -- [expire snapshots](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots) i.e. the files that exceeded the retention period specified for the table +Iceberg provides even more useful operations for data management. The `VACUUM` statement will do the following: +- [expire snapshots](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots) i.e. the files that exceeded the retention period specified for the table - [remove orphan files](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files) i.e. files no longer referenced in any metadata files. @@ -443,7 +443,7 @@ tasks: secretKeyId: "{{ secret('AWS_SECRET_ACCESS_KEY') }}" region: "{{ secret('AWS_DEFAULT_REGION') }}" bucket: "{{vars.bucket}}" - + - id: check type: io.kestra.plugin.core.flow.If condition: "{{outputs.listObjects.objects}}" @@ -528,7 +528,7 @@ tasks: secretKeyId: "{{ secret('AWS_SECRET_ACCESS_KEY') }}" region: "{{ secret('AWS_DEFAULT_REGION') }}" commands: - - aws s3 mv s3://{{vars.bucket}}/{{vars.prefix}}/ s3://{{vars.bucket}}/archive/{{vars.prefix}}/ --recursive + - aws s3 mv s3://{{vars.bucket}}/{{vars.prefix}}/ s3://{{vars.bucket}}/archive/{{vars.prefix}}/ --recursive triggers: - id: hourlySchedule @@ -539,7 +539,7 @@ triggers: When you execute the flow, you should see the following output in the logs: - + Once you push [your script to Git](https://github.com/kestra-io/scripts/blob/main/etl/aws_iceberg_fruit.py), your pipeline can be simplified as follows: @@ -618,7 +618,7 @@ tasks: secretKeyId: "{{ secret('AWS_SECRET_ACCESS_KEY') }}" region: "{{ secret('AWS_DEFAULT_REGION') }}" commands: - - aws s3 mv s3://{{vars.bucket}}/{{vars.prefix}}/ s3://{{vars.bucket}}/archive/{{vars.prefix}}/ --recursive + - aws s3 mv s3://{{vars.bucket}}/{{vars.prefix}}/ s3://{{vars.bucket}}/archive/{{vars.prefix}}/ --recursive triggers: - id: hourlySchedule @@ -630,16 +630,16 @@ The [kestra-io/scripts](https://github.com/kestra-io/scripts) is a public reposi Executing this workflow should give you the following output: - + -This scheduled workflow is simple to understand and easy to run locally. However, in certain circumstances, it might be inefficient. External systems are often unpredictable, making it difficult to figure out the optimal batch pipeline frequency. The flow shown above will run every hour, even if there are no new files in S3 for days or weeks. In such scenarios, event triggers and a decoupled approach to pipelines become incredibly useful. +This scheduled workflow is simple to understand and easy to run locally. However, in certain circumstances, it might be inefficient. External systems are often unpredictable, making it difficult to figure out the optimal batch pipeline frequency. The flow shown above will run every hour, even if there are no new files in S3 for days or weeks. In such scenarios, event triggers and a decoupled approach to pipelines become incredibly useful. ### Event-driven data pipeline -Kestra makes it easy to switch between scheduled and event-driven workflows simply by adjusting the trigger configuration. +Kestra makes it easy to switch between scheduled and event-driven workflows simply by adjusting the trigger configuration. -The flow code below uses [the same Python script](https://github.com/kestra-io/scripts/blob/main/etl/aws_iceberg_fruit.py) we used for a scheduled workflow. The only difference is that, when calling the script, we now pass the detected S3 object key from the trigger as an input argument. Then, the script transforms and loads data to the S3 data lake exactly the same way as before. +The flow code below uses [the same Python script](https://github.com/kestra-io/scripts/blob/main/etl/aws_iceberg_fruit.py) we used for a scheduled workflow. The only difference is that, when calling the script, we now pass the detected S3 object key from the trigger as an input argument. Then, the script transforms and loads data to the S3 data lake exactly the same way as before. You can see here a significant advantage of Kestra: a separation of concerns between orchestration and business logic. You don't have to modify your code in any way - Kestra can orchestrate your custom code written in any language with no modifications. @@ -698,7 +698,7 @@ tasks: database: "{{vars.database}}" outputLocation: "s3://{{vars.bucket}}/query_results/" query: | - OPTIMIZE fruits REWRITE DATA USING BIN_PACK; + OPTIMIZE fruits REWRITE DATA USING BIN_PACK; triggers: - id: waitForNewS3objects @@ -716,26 +716,26 @@ triggers: secretKeyId: "{{ secret('AWS_SECRET_ACCESS_KEY') }}" ``` -The trigger polls the S3 location, indicated by `prefix`, for new files every second. The flow gets executed as soon as a new S3 key is detected. +The trigger polls the S3 location, indicated by `prefix`, for new files every second. The flow gets executed as soon as a new S3 key is detected. - + -The processed file is moved to the `archive` directory to avoid the flow being triggered multiple times for the same file. The `maxKeys` property is particularly helpful in our use case as it allows us to process each incoming file sequentially as if you were using [a FIFO queue](https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics)). +The processed file is moved to the `archive` directory to avoid the flow being triggered multiple times for the same file. The `maxKeys` property is particularly helpful in our use case as it allows us to process each incoming file sequentially as if you were using [a FIFO queue](https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics)). See the screenshots below which demonstrate how the flow was triggered for each new S3 object with the `inbox` prefix. - - + + ### Iceberg Blueprints All Kestra workflows covered in this post are available as [Blueprints](../docs/04.user-interface-guide/blueprints.md) directly from the Kestra UI. Start Kestra using Docker Compose, as explained in the [Getting Started](../docs/01.getting-started.md) guide, and select the Iceberg tag from the Blueprints section: - + ## Next steps -This tutorial demonstrated how to use Apache Iceberg with Amazon Athena, AWS Glue and Amazon S3, and how to manage a scheduled and event-driven data ingestion process with Kestra. +This tutorial demonstrated how to use Apache Iceberg with Amazon Athena, AWS Glue and Amazon S3, and how to manage a scheduled and event-driven data ingestion process with Kestra. -If you have any questions about what we've covered in this post, reach out via [our community Slack](https://kestra.io/slack). Lastly, if you like the project, give us a [star on GitHub](https://github.com/kestra-io/kestra). +If you have any questions about what we've covered in this post, reach out via [our community Slack](https://kestra.io/slack). Lastly, if you like the project, give us a [star on GitHub](https://github.com/kestra-io/kestra). diff --git a/content/blogs/2023-08-11-dataframes.md b/src/content/blogs/2023-08-11-dataframes.md similarity index 99% rename from content/blogs/2023-08-11-dataframes.md rename to src/content/blogs/2023-08-11-dataframes.md index cf31539546c..948904d7950 100644 --- a/content/blogs/2023-08-11-dataframes.md +++ b/src/content/blogs/2023-08-11-dataframes.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-08-11-dataframes.jpg +image: "@assets/blogs/2023-08-11-dataframes.jpg" --- Tabular format with rows and columns, popularized by relational databases and Microsoft Excel, is an intuitive way of organizing and manipulating data for analytics. @@ -214,7 +214,7 @@ As mentioned in the introduction, I believe that, over time, the differences her It's also worth mentioning that DuckDB integrates exceptionally well with Polars — just add ``.pl()`` to convert your DuckDB table to a Polars DataFrame. You can switch between Polars and DuckDB with zero copy thanks to Apache Arrow. I see using both Polars and DuckDB as complementary, not competitive. Just look at this example from [DuckDB docs](https://duckdb.org/docs/guides/python/polars.html): - + **What about distributed compute?** DuckDB is an in-process single-node database. MotherDuck is a SaaS service that scales DuckDB to the cloud. Check our [DuckDB vs. MotherDuck](https://kestra.io/blogs/2023-07-28-duckdb-vs-motherduck) guide and our [blueprints](/blueprints?q=duckdb) to learn more about various DuckDB use cases for scheduled ETL and event-driven workflows. @@ -319,7 +319,7 @@ top.to_json("bestsellers_ponder.json", orient="records") ``` It took some time but eventually Ponder was able to finish the task. However, it also created 14 intermediate tables in my BigQuery dataset (yes, 14!) to perform that simple task. See the screenshot below for reference. - + My overall impression is that Ponder seems like an interesting product for big data as it executes everything in a cloud data warehouse such as BigQuery. However, for our use case, Ponder felt a bit too *heavy*. @@ -499,7 +499,7 @@ If maturity is important to you, it's still worth considering Spark. Even though The [following blueprint](/blueprints/postgres-to-pandas-dataframes) shows how you can easily orchestrate your SQL and Pandas data transformations. - + --- diff --git a/content/blogs/2023-08-16-datamesh.md b/src/content/blogs/2023-08-16-datamesh.md similarity index 96% rename from content/blogs/2023-08-16-datamesh.md rename to src/content/blogs/2023-08-16-datamesh.md index 217cd15eb20..c70112b4ed6 100644 --- a/content/blogs/2023-08-16-datamesh.md +++ b/src/content/blogs/2023-08-16-datamesh.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-08-16-datamesh.jpg +image: "@assets/blogs/2023-08-16-datamesh.jpg" --- In its transformation journey towards a cloud-based data infrastructure, Leroy Merlin France (LMFR) a global retail company employing more than 24,000 people encountered significant challenges. At the time, they relied on a traditional on-premises data platform, using Teradata as its database, Talend for data integration, and then relied on global operations teams through service requests for scheduling using tools such as Dollar U and Automic Workload Automation. The team of 30 data engineers, organized by business domains, faced three major bottlenecks: @@ -19,7 +19,7 @@ In its transformation journey towards a cloud-based data infrastructure, Leroy M Initially, LMFR turned to Apache Airflow, but a pilot project exposed several limitations. Looking for a better solution, they discovered [Kestra](https://github.com/kestra-io/kestra), a tool that not only fulfilled the initial requirements but also unlocked the potential for a Data Mesh Architecture, enabling several hundred data practitioners to collaboratively and securely produce high-quality data analytics. -Leroy Merlin France has experienced a 900% increase in data production over the past two years. After adopting Kestra, they experienced significant improvements in scalability, speed, reliability, data processing efficiency, and reduced cost. +Leroy Merlin France has experienced a 900% increase in data production over the past two years. After adopting Kestra, they experienced significant improvements in scalability, speed, reliability, data processing efficiency, and reduced cost. ## Selecting the Right Data Orchestration Solution ## @@ -48,13 +48,13 @@ Kestra, with its unique architecture, addressed the issues that they faced with 4. **Cost Savings**: Kestra's lightweight, event-driven architecture minimized CPU and memory resource consumption, allowing the organization to handle even complex workloads without incurring high infrastructure costs or performance bottlenecks. ->"In less than a month, with no previous experience in continuous deployment and data orchestration, I felt autonomous with my data flows and could collaborate with my teammates. Kestra had become a total necessity for me." *Data engineer* +>"In less than a month, with no previous experience in continuous deployment and data orchestration, I felt autonomous with my data flows and could collaborate with my teammates. Kestra had become a total necessity for me." *Data engineer* --- ## Orchestrate a Data Mesh Architecture - + After adopting Kestra, the team has gained enough confidence and trust in its data infrastructure to implement [data mesh](https://www.datamesh-architecture.com/). @@ -74,12 +74,12 @@ The adoption of a simple yet scalable data mesh structure empowered business tea --- -## Use cases +## Use cases The following section provides concrete use cases enabled by adopting Kestra and data mesh. ### Scale Data Analysis & Data Science -Data analysts and scientists often spend more time on data wrangling than on core business problems. To scale practices and help data practitioners work on real problems, they use Kestra to automate SQL pipeline creation through the tight integration of Terraform with Kestra. This workflow allows to express SQL queries and table schema in Git and build Kestra flows automatically. It greatly simplifies their daily work as they only have to focus on SQL. +Data analysts and scientists often spend more time on data wrangling than on core business problems. To scale practices and help data practitioners work on real problems, they use Kestra to automate SQL pipeline creation through the tight integration of Terraform with Kestra. This workflow allows to express SQL queries and table schema in Git and build Kestra flows automatically. It greatly simplifies their daily work as they only have to focus on SQL. #### Simplified and Automated Architecture #### The team adopted a simple yet robust architecture: @@ -96,15 +96,15 @@ The team adopted a simple yet robust architecture: ### Collect Customer Feedback into the Data Warehouse ### - + -Due to their extensive product range, collecting and ingesting customer feedback into a centralized system was crucial. +Due to their extensive product range, collecting and ingesting customer feedback into a centralized system was crucial. -To do so, they implemented a robust data flow within Kestra. This flow involves four REST APIs provided by Qualtrics (customer feedback tool) for data collection. +To do so, they implemented a robust data flow within Kestra. This flow involves four REST APIs provided by Qualtrics (customer feedback tool) for data collection. To optimize performances and avoid resource overutilization, the data collection process is performed in batches of five, with parallelization using Kestra's workflow capabilities. -To handle large volumes of collected data efficiently, the flow includes segmentation of API calls and transformation operations on historical data. This approach helps manage the large data volume and improves performance. +To handle large volumes of collected data efficiently, the flow includes segmentation of API calls and transformation operations on historical data. This approach helps manage the large data volume and improves performance. The received JSON data from Qualtrics is unzipped within a Docker environment. Python scripts are then used to transform the JSON, applying recursive functions for standardization, field transposition/renaming, and pivoting surveys into a generic key/value format for storage in BigQuery. @@ -142,9 +142,9 @@ Despite the intricacies of handling large volumes of data and coordinating perso --- -## Sustaining Growth at Scale +## Sustaining Growth at Scale - + Before Kestra integration, domain teams executed less than half a million tasks monthly. Leroy Merlin France used tools such as Talend, scheduled by DollarU or AWA, but moving toward cloud and scale processes was a significant bottleneck. @@ -163,6 +163,6 @@ Kestra effectively addressed Leroy Merlin France's initial needs and exceeded ex By implementing a data mesh, Kestra has empowered teams throughout the organization to independently manage and produce their own data pipelines. This not only promotes efficiency and reduces bottlenecks but also encourages ownership. Over a span of 18 months, the cumulative user base expanded by more than **900%**, totaling over **500 users**. These users transitioned from legacy tools, which supported only a limited set of executions and faltered at scale, to executing millions of tasks per month with Kestra, thereby generating significant value for their business. -If you have any questions, reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). +If you have any questions, reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). If you like the project, give us [a GitHub star](https://github.com/kestra-io/kestra) and join [the open-source community](https://kestra.io/slack). diff --git a/content/blogs/2023-08-22-generating-fake-data.md b/src/content/blogs/2023-08-22-generating-fake-data.md similarity index 98% rename from content/blogs/2023-08-22-generating-fake-data.md rename to src/content/blogs/2023-08-22-generating-fake-data.md index 1a77deb447b..61f69ff6b3a 100644 --- a/content/blogs/2023-08-22-generating-fake-data.md +++ b/src/content/blogs/2023-08-22-generating-fake-data.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-08-22-generating-fake-data.jpg +image: "@assets/blogs/2023-08-22-generating-fake-data.jpg" --- Welcome to the world of [Shiny Rocks](https://github.com/kestra-io/shiny_rocks)! Although this company might not exist outside [Kestra](https://github.com/kestra-io/kestra) it has its own purpose. @@ -15,9 +15,9 @@ We often face the challenge of presenting concepts without real data, due to pri Shiny Rocks is a fictional company creating smartphones. "Those shiny rocks in our pockets". It provides a means to showcase various data use cases in a realistic manner. In this post, we are not just introducing this mock company, but also offering datasets it "produces" for your hands-on experience. Plus, in the future, anticipate more of Shiny Rocks; it's going to be our gimmick to bring plausible data scenarios, especially when we dive deep into use cases with Kestra. - + - + You can find the whole use case in our [live demo in the shiny_rocks namespace](https://github.com/kestra-io/shiny_rocks). @@ -27,7 +27,7 @@ Unlike static files that don't change, Shiny Rocks comes with custom scripts tha Here is for example the mathematical function used to generate orders volume over a year. - + To create those fake data, we lean on the Faker python library, supplemented by our custom provider. diff --git a/content/blogs/2023-08-24-using-google-bard-ai-with-kestra.md b/src/content/blogs/2023-08-24-using-google-bard-ai-with-kestra.md similarity index 94% rename from content/blogs/2023-08-24-using-google-bard-ai-with-kestra.md rename to src/content/blogs/2023-08-24-using-google-bard-ai-with-kestra.md index 384f1853c8d..987d70b3a70 100644 --- a/content/blogs/2023-08-24-using-google-bard-ai-with-kestra.md +++ b/src/content/blogs/2023-08-24-using-google-bard-ai-with-kestra.md @@ -6,14 +6,14 @@ category: Solutions author: name: Loïc Mathieu image: "lmathieu" -image: /blogs/2023-08-24-using-google-bard-ai-with-kestra.jpg +image: "@assets/blogs/2023-08-24-using-google-bard-ai-with-kestra.jpg" --- Maybe you’ve already heard about [Bard](https://bard.google.com/?hl=en), an AI experiment by Google. Bard is generative AI, it can respond to questions posed in natural language. I love jokes, so I asked Bard to tell me a joke, and I love sarcasm, so I asked it to tell me a sarcastic joke. - + Behind Bard, there is a generative AI based on [Google's PaLM 2](https://ai.google/discover/palm2/) large language models (LLMs) that you can use via the [Google Vertex AI API](https://cloud.google.com/vertex-ai). @@ -41,7 +41,7 @@ tasks: This task will output Bard's response in the form of predictions. - + You can see that the joke is in the content property. @@ -84,7 +84,7 @@ htmlTextContent: "{{outputs['ask-for-jokes'].predictions[0].candidates[0].conten The expression `{{outputs['ask-for-jokes'].predictions[0].candidates[0].content}}` will refer to the content of the first candidate of the first prediction. Predictions are the output of the ask-for-job task. -If you want to test this example, you can use this Docker command to start a GreenMail test mail server: +If you want to test this example, you can use this Docker command to start a GreenMail test mail server: ```shell docker run -t -i -p 3025:3025 -p 3110:3110 -p 3143:3143 \ -p 3465:3465 -p 3993:3993 -p 3995:3995 -p 8888:8080 \ @@ -157,11 +157,11 @@ tasks: ## Conclusion ## -For more information, you can have a look at the [Google Quickstarts for Generative AI](https://cloud.google.com/vertex-ai/docs/generative-ai/start/quickstarts/api-quickstart) and the documentation of the TestCompletion and ChatCompletion tasks. +For more information, you can have a look at the [Google Quickstarts for Generative AI](https://cloud.google.com/vertex-ai/docs/generative-ai/start/quickstarts/api-quickstart) and the documentation of the TestCompletion and ChatCompletion tasks. Integrating humor with technology, as demonstrated in this guide with Bard's generative AI and Kestra, is an example of the interesting things that can be achieved. This is just a glimpse into the potential applications. Experiment with daily jokes is a fun exploration of what's possible. It's an invitation to think creatively and see how technology can be leveraged for different purposes, including brightening your day. -If you have any questions, reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). +If you have any questions, reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). If you like the project, give us [a GitHub star](https://github.com/kestra-io/kestra) and join [the open-source community](https://kestra.io/slack). diff --git a/content/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.md b/src/content/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.md similarity index 93% rename from content/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.md rename to src/content/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.md index d419ec4c8bc..790dbdb1b15 100644 --- a/content/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.md +++ b/src/content/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: "ageller" -image: /blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.png +image: "@assets/blogs/2023-08-30-release-0-11-topology-preview-vscode-and-more.png" --- @@ -32,11 +32,11 @@ The flagship feature of this release is the fully redesigned Topology view. Your Here is what the new topology view looks like: - + And here is the same flow when you expand the `Parallel` task group: - + --- @@ -49,16 +49,16 @@ When you navigate complex workflows that produce specific outputs, it's useful t Here is an example of a Query task returning output results, serialized in Amazon ION format, which Kestra renders as a table: - + - + And here is a preview of a CSV file `products.csv`, returned by a Python task: - + - + Finally, here is a simple flow example rendering a markdown file: @@ -81,7 +81,7 @@ tasks: - "*.md" ``` - + --- @@ -92,7 +92,7 @@ While Kestra allows you to use namespaces to separate environments, most of our [Inspired](https://github.com/kestra-io/kestra/issues/1483) by [Gunnar Morling's](https://twitter.com/gunnarmorling) excellent blog post ["Oh... This is Prod?!"](https://www.morling.dev/blog/oh_this_is_prod/), you can now optionally set a custom environment name and color in the top bar in the UI. Simply go to Settings and from there, set the desired environment name and color. - + Big thanks to the community member, [yuri](https://github.com/yuri1969), for [contributing this feature](https://github.com/kestra-io/kestra/pull/1875)! @@ -112,30 +112,30 @@ The [VS Code extension](https://github.com/kestra-io/vscode-kestra) provides **a First, install the extension by searching for "Kestra" in the VS Code extensions marketplace or using the following [marketplace link](https://marketplace.visualstudio.com/items?itemName=kestra-io.kestra). - + After installing the extension, press `Command/Ctrl + Shift + P` in VS Code to navigate to the Command Palette. Start typing the command called **"Download Kestra schema"** and paste the endpoint of your Kestra's instance. - + If you use the open-source version running locally, type: ``http://localhost:8080/`` and hit Enter. - + If your instance is secured with some authentication mechanism (e.g. basic auth), you'll be prompted to enter credentials. You should then see a notification that the schema has been downloaded, requesting you to save your work and reload the VS Code window. - + After reloading the window, you can open a Kestra flow file (or create a new YAML file) and use the `Control + Space` command to get **autocompletion**. - + Note how flows that don't pass the **syntax validation** are marked red. As soon as we fix the syntax error, the red underlines disappear. - + The VS Code extension can make CI/CD and infrastructure build pipelines easier: @@ -229,16 +229,16 @@ As Werner Vogels, Amazon's CTO, once said: "Everything fails all the time". Exte The triggers page gives an overview of all triggers, grouped by a namespace. You can see the last time a given trigger was modified and whether there are some executions currently in progress that have been executed as a result of that trigger. For instance, the image below shows that the trigger named `everyMinute` is currently locked due to an Execution in progress. - + You can either troubleshoot why this execution is still in progress (e.g., a process stuck due to infrastructure issues) or manually unlock this trigger. Note that manually unlocking triggers may result in multiple concurrent (potentially duplicated) executions. - + In the Enterprise Editon, the Administration section also includes user management (Users, Groups, Roles) as well as the recently introduced Workers to help you monitor the health of the remote infrastructure. - + --- @@ -508,7 +508,7 @@ Several tables in Kestra allow you to perform bulk operations, such as exporting In the example below, you can select all elements in just one click and easily perform any bulk operation. - + --- diff --git a/content/blogs/2023-09-04-reverse-etl-vs-cdp.md b/src/content/blogs/2023-09-04-reverse-etl-vs-cdp.md similarity index 99% rename from content/blogs/2023-09-04-reverse-etl-vs-cdp.md rename to src/content/blogs/2023-09-04-reverse-etl-vs-cdp.md index b085da697b6..7f3847551c4 100644 --- a/content/blogs/2023-09-04-reverse-etl-vs-cdp.md +++ b/src/content/blogs/2023-09-04-reverse-etl-vs-cdp.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-09-04-reverse-etl-vs-cdp.jpg +image: "@assets/blogs/2023-09-04-reverse-etl-vs-cdp.jpg" --- In this deep dive, we'll unravel the mechanics of leading Customer Data Platforms (CDPs), dissecting how they handle data ingestion, analytics, and real-time processing. We'll also spotlight how some of these platforms are merging with Reverse ETL functionalities. By the end, you'll have a robust understanding of their architecture and capabilities. diff --git a/content/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.md b/src/content/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.md similarity index 94% rename from content/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.md rename to src/content/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.md index bd0dfa80042..84adb2bde19 100644 --- a/content/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.md +++ b/src/content/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.jpg +image: "@assets/blogs/2023-09-05-2023-kestra-airbyte-technology-partnership.jpg" --- We are pleased to announce a technology partnership with [Airbyte](https://airbyte.com/). [Kestra](https://github.com/kestra-io/kestra) and Airbyte share a common vision for the future of the Modern Data Stack. This technical partnership ensures seamless data transfer, task execution, and process automation between Kestra and Airbyte. @@ -41,11 +41,11 @@ The collaborative efforts offer a unified platform for end-to-end data orchestra - **Dynamic Data Workflows**: You can use Kestra's Airbyte plugin to trigger various operations, such as parallel syncs, scheduled ingestion, and complex data processing jobs. - + - **Robust Orchestration Capabilities**: From triggering multiple Airbyte Cloud syncs to running complex dbt jobs, Kestra's flexibility empowers users to control and automate their data processes. - + - **Efficient Data Management**: Learn how this collaboration supports an end-to-end data orchestration approach in [this blog post](https://kestra.io/blogs/2023-06-26-end-to-end-data-orchestration). diff --git a/content/blogs/2023-09-07-locxia-kestra.md b/src/content/blogs/2023-09-07-locxia-kestra.md similarity index 95% rename from content/blogs/2023-09-07-locxia-kestra.md rename to src/content/blogs/2023-09-07-locxia-kestra.md index 082d87cd872..362edecb19f 100644 --- a/content/blogs/2023-09-07-locxia-kestra.md +++ b/src/content/blogs/2023-09-07-locxia-kestra.md @@ -6,19 +6,19 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-09-07-locxia-kestra.jpg +image: "@assets/blogs/2023-09-07-locxia-kestra.jpg" --- -Ntico has designed [Locxia](https://www.locxia.com/), a powerful platform that gives businesses and local authorities a deeper understanding of their territories and residents thanks to satellite imagery. At the core of their solution lies [Kestra](https://github.com/kestra-io/kestra), used for ingesting, processing, and visualizing vast datasets. +Ntico has designed [Locxia](https://www.locxia.com/), a powerful platform that gives businesses and local authorities a deeper understanding of their territories and residents thanks to satellite imagery. At the core of their solution lies [Kestra](https://github.com/kestra-io/kestra), used for ingesting, processing, and visualizing vast datasets. This post dives into how Ntico uses Kestra to create and manage data pipelines for its digital solution. ## About Ntico -[Ntico is a French consulting and software company](https://www.ntico.com/), specializing in developing data-driven applications and managing intricate projects. +[Ntico is a French consulting and software company](https://www.ntico.com/), specializing in developing data-driven applications and managing intricate projects. -They provide consulting, data analysis, and software development services tailored to enhance operational efficiency. +They provide consulting, data analysis, and software development services tailored to enhance operational efficiency. Additionally, Ntico offers operational services encompassing production, network infrastructure, cloud, and security solutions. Their expertise extends to advanced logistics solutions that maximize productivity and streamline supply chains. @@ -27,7 +27,7 @@ Ntico's unique offerings include Locxia, a data platform designed to develop com ## About Locxia - + Locxia is a data platform focused on housing data. Developed by Ntico's data experts, it empowers businesses and local authorities to better understand their customers and territories. The platform provides access to over 250 value-added data sourced from satellite images and public data; all consolidated and accessible on a dedicated platform. @@ -50,7 +50,7 @@ Kestra is used in the process of coordinating data ingestion processes for Locxi > “Kestra is really good because it can be used by a beginner as well as an expert!” Thomas Depierre - NTICO Engineer. - + Right from the onset, the team at Ntico knew they would be dealing with an enormous amount of data - terabytes worth of valuable, detailed geospatial data. The challenge was to create a platform that could effectively handle this vast volume of information, not just in terms of storage, but in data processing and cost management as well. diff --git a/content/blogs/2023-09-13-choreography.md b/src/content/blogs/2023-09-13-choreography.md similarity index 96% rename from content/blogs/2023-09-13-choreography.md rename to src/content/blogs/2023-09-13-choreography.md index 7a1b775d2e6..c2a27042813 100644 --- a/content/blogs/2023-09-13-choreography.md +++ b/src/content/blogs/2023-09-13-choreography.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-09-13-choreography.jpg +image: "@assets/blogs/2023-09-13-choreography.jpg" --- Most of the best practices we apply in the data ecosystem are coming from software culture. CI/CD, tests, versioning, atomic code or package management all have been introduced because of their success in transforming software development practices. @@ -54,8 +54,8 @@ What new data technologies such as DuckDB, Iceberg table format, SQLmesh or Mall What’s new is the developer experience. Back then we were dealing with hardly maintainable Python code, very long SQL queries, and complex infrastructure management. New tools try to carry off the burden of complexity by providing better abstractions, interfaces and onboarding. Long story short: they provide a better experience. - -Our ultimate goal is to model reality thanks to data; and take action on it. + +Our ultimate goal is to model reality thanks to data; and take action on it. A good product is a good user experience. A good user experience is what makes us achieve what we want to do as we planned. To do so our data experience should enable a choreography of different assets and requirements: @@ -63,7 +63,7 @@ A good product is a good user experience. A good user experience is what makes u * **Role Focus**: we should design an experience where everyone can do their job rather than asking them to be a data-engineer, devops wizard and an analyst at the same time. While acknowledging that data teams are melting pots of talents and skill sets, everyone should find its space for work. Not to learn another language or abstraction everytime there is a new need. You don't ask the violinist to play the trumpet. -* **Data Trust**: we should have trust in our data: this comes from good observability and explicit status. Does my data land correctly this morning? Is my dashboard up to date? Where can I find the logs for this specific task? +* **Data Trust**: we should have trust in our data: this comes from good observability and explicit status. Does my data land correctly this morning? Is my dashboard up to date? Where can I find the logs for this specific task? These are typical questions that shouldn't demand hours of searching for answers. That should be as smooth as possible, like checking the weather on your phone. * **Logic Separation**: the experience of writing business logic should be decoupled from orchestration logic. While it’s mostly a human policy matter, our tools should make this as clear as possible and give us good guidelines. @@ -77,13 +77,13 @@ Choreography here isn't a buzz-word. It's about having an ecosystem where tools Reaching real data choreography will be a long journey and it wouldn't be only about tools. Still we can foresee a future where the data stack lands in a space where experience and simplicity make working with data something pleasant and seamlessly integrated within business and product processes. -We think Kestra helps to achieve this vision. +We think Kestra helps to achieve this vision. -[Kestra](https://github.com/kestra-io/kestra) is a declarative orchestration tool. Bringing declarative to the party isn’t just a trend: it's the realization that consistency and efficiency can't be done without a proper domain system language. +[Kestra](https://github.com/kestra-io/kestra) is a declarative orchestration tool. Bringing declarative to the party isn’t just a trend: it's the realization that consistency and efficiency can't be done without a proper domain system language. -That’s why we created a rich user interface. In Kestra, every click, every drag, is translated to code at some point. It allows speed and great user experience. +That’s why we created a rich user interface. In Kestra, every click, every drag, is translated to code at some point. It allows speed and great user experience. -Still it sometimes fails in automation and consistency. That’s why we integrate with CI/CD solutions and provide space for developers who like to craft their own way. Kestra is an API by design. +Still it sometimes fails in automation and consistency. That’s why we integrate with CI/CD solutions and provide space for developers who like to craft their own way. Kestra is an API by design. Our goal is not to create another tool to replace old ones. It’s to create a product that suits different needs of data practitioners and that can blend everywhere. Data is not software and the data experience needs evolution. We always have this consideration in mind when designing new features and improving Kestra. How will users put their flow in production? How will they build them locally? How will they test them? etc. @@ -91,7 +91,7 @@ Data is not software and the data experience needs evolution. We always have thi We think this vision is the good starting point for reaching a real data experience. For achieving real data choreography. -Feel free to share your vision of the perfect data experience! Reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). +Feel free to share your vision of the perfect data experience! Reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). If you like the project, give us [a GitHub star](https://github.com/kestra-io/kestra) and join [the open-source community](https://kestra.io/slack). diff --git a/content/blogs/2023-09-15-football-malloy-kestra.md b/src/content/blogs/2023-09-15-football-malloy-kestra.md similarity index 87% rename from content/blogs/2023-09-15-football-malloy-kestra.md rename to src/content/blogs/2023-09-15-football-malloy-kestra.md index 2c337e23f0d..e251a3593ec 100644 --- a/content/blogs/2023-09-15-football-malloy-kestra.md +++ b/src/content/blogs/2023-09-15-football-malloy-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-09-15-football-malloy-kestra.jpg +image: "@assets/blogs/2023-09-15-football-malloy-kestra.jpg" --- Accessing football data has never been more convenient than it is today. With [public websites](https://fbref.com/) featuring user-friendly bot policies and [private companies opening up their datasets](https://github.com/statsbomb/open-data), getting started with football analytics is [a far smoother journey than it was just a few years ago](https://medium.pimpaudben.fr/part-2-a-career-in-football-analytics-the-how-ae8b5eca38ce). @@ -30,7 +30,7 @@ You could find a [specific scraper project in this repository](https://github.co It’s quite straightforward, as we only need to retrieve table tags and write them as proper CSV files. Here is an example of how we parse the table for the competition fixtures pages: - + If you’re willing to explore the whole parsing strategies and dedicated CLI, [check out the project on GitHub](https://github.com/Ben8t/fbref_scraper). @@ -49,7 +49,7 @@ Malloy provides a smart semantic to deal with hyper-dimensional data, nested que Let’s start with a simple example on our freshly scraped data: - + This query allows us to compute the average attendance of Arsenal team depending on the game venue (home or away). @@ -63,28 +63,28 @@ They are many interesting things to notice in this simple example: Malloy can be run directly in your VS Code editor, from Python, Node or with a dedicated CLI. It also comes with a notebook-like component, which is great to create complex reports. - + This first example is very straightforward and doesn’t bring new things compared to SQL. Things get very interesting when we look at complex queries: - + - + See how we neatly [nest](https://malloydata.github.io/documentation/language/nesting) results here? Doing this in SQL would be much trickier. Looking at Malloy’s compiled SQL gives us a hint about the complexity in regular SQL. - + Furthermore Malloy supports some plotting features with simple tags such as below example. Just add # bar_chart will draw a bar chart for each nested result. - + Same, with # dashboard tag a query is rendered as a dashboard, dimensions aligned at the top, and aggregates and nested queries float within the dashboard. You can check [all rendering tags in the documentation](https://malloydata.github.io/documentation/visualizations/overview). - + I encourage you to look at the whole documentation, especially [the common pattern section](https://malloydata.github.io/documentation/patterns/yoy) showcasing the power of Malloy. @@ -97,9 +97,9 @@ That’s where Kestra makes the glue ! Let’s create a first flow to scrape matches results every day. - + - + This Kestra Flow does several things: @@ -112,9 +112,9 @@ Now that we have a process to get data everyday, we can move on to analysis auto In a separate flow we use the Malloy CLI Kestra plugin to run Malloy commands on our data: - + - + In this flow we have the following tasks: @@ -125,7 +125,7 @@ In this flow we have the following tasks: Here we export Malloy results to a JSON file, but we could have saved those to BigQuery tables for example, enabling us to connect dashboard tools such as [Looker](https://cloud.google.com/looker-studio), [Metabase](https://www.metabase.com/) or [Superset](https://superset.apache.org/). - + If you want to know more about Kestra and its wide range of possibilities, I encourage you to look at the documentation and join the community on Slack. @@ -143,7 +143,7 @@ With Malloy for high dimension modelling and Kestra for declarative orchestratio Indeed, a data stack with a proper user experience. -Feel free to share your vision of the perfect data experience! Reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). +Feel free to share your vision of the perfect data experience! Reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). If you like the project, give us [a GitHub star](https://github.com/kestra-io/kestra) and join [the open-source community](https://kestra.io/slack). diff --git a/content/blogs/2023-09-18-kestra-partner-program.md b/src/content/blogs/2023-09-18-kestra-partner-program.md similarity index 95% rename from content/blogs/2023-09-18-kestra-partner-program.md rename to src/content/blogs/2023-09-18-kestra-partner-program.md index e3018346065..67b5cf2dafe 100644 --- a/content/blogs/2023-09-18-kestra-partner-program.md +++ b/src/content/blogs/2023-09-18-kestra-partner-program.md @@ -6,14 +6,14 @@ category: Company News author: name: Quentin Sinig image: "qsinig" -image: /blogs/2023-09-18-kestra-partner-program.jpg +image: "@assets/blogs/2023-09-18-kestra-partner-program.jpg" --- We are thrilled to announce the launch of our partner program, a significant milestone for [Kestra](https://github.com/kestra-io/kestra) as we continue to expand our presence in orchestrating applications and mission-critical operations. This program aims to build strong partnerships with organizations that share our vision and expertise, empowering us to offer extensive support to businesses navigating the complexities of workflow automation. As the demand for Kestra continues to grow, we recognize the need for hands-on assistance in various aspects of orchestration. Whether it's a from-scratch implementation, a re-platforming initiative, a migration project, or an extension through custom development, organizations often require expert guidance and support to ensure successful outcomes. This is where our **Consulting Partners** step in and we couldn't be more excited to welcome [Converteo](https://converteo.com/en/) and [NTICO](https://www.ntico.com/) as our inaugural partners. - + > “Kestra offers an elegant solution to the pain points we face in the data transformation projects of our customers: monitoring, management, and maintenance of large-scale data flow. What sets Kestra apart is not only its open-source community but also its seamless integration with modern data stack tools like Airbyte. We are genuinely thrilled to engage with Kestra.” diff --git a/content/blogs/2023-09-19-kestra-terraform-partnership.md b/src/content/blogs/2023-09-19-kestra-terraform-partnership.md similarity index 96% rename from content/blogs/2023-09-19-kestra-terraform-partnership.md rename to src/content/blogs/2023-09-19-kestra-terraform-partnership.md index 413f8fb3ad8..14ae9b83aa9 100644 --- a/content/blogs/2023-09-19-kestra-terraform-partnership.md +++ b/src/content/blogs/2023-09-19-kestra-terraform-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-09-19-kestra-terraform-partnership.jpg +image: "@assets/blogs/2023-09-19-kestra-terraform-partnership.jpg" --- We're thrilled to announce a technology partnership with [Terraform](https://www.terraform.io/) by HashiCorp. We share a common vision of simplifying deployment patterns by relying on Infrastructure as Code. We are excited to further extend the Everything-as-Code paradigm to your mission-critical operational and analytical workflows. @@ -25,7 +25,7 @@ Our partnership with Terraform extends beyond technical integration. We both sha ## Elevating Your Workflows With Kestra's Terraform Provider - + Our Terraform provider is a significant step in aligning workflow orchestration with infrastructure-as-code best practices. With this integration, you can seamlessly manage your entire [Kestra](https://github.com/kestra-io/kestra) environment in code, including flows, triggers, tasks, input variables, secrets, users, and namespaces. Software engineers manage their entire Kestra infrastructure along with their other applications with Terraform to ensure a robust software delivery process. diff --git a/content/blogs/2023-09-25-kestra-snowflake-partnership.md b/src/content/blogs/2023-09-25-kestra-snowflake-partnership.md similarity index 95% rename from content/blogs/2023-09-25-kestra-snowflake-partnership.md rename to src/content/blogs/2023-09-25-kestra-snowflake-partnership.md index 737ff437f9c..1bb1ed954da 100644 --- a/content/blogs/2023-09-25-kestra-snowflake-partnership.md +++ b/src/content/blogs/2023-09-25-kestra-snowflake-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-09-25-kestra-snowflake-partnership.jpg +image: "@assets/blogs/2023-09-25-kestra-snowflake-partnership.jpg" --- We're excited to announce that we are now registered partners with Snowflake, one of the most trusted names in cloud data warehousing. This strategic alliance between [Kestra](https://github.com/kestra-io/kestra) and [Snowflake](https://www.snowflake.com/en/) aims to empower organizations to seamlessly manage, orchestrate, and optimize their workflows. @@ -29,7 +29,7 @@ Kestra's [Snowflake plugin](/plugins/plugin-jdbc-snowflake) allows you to perfor ## Build Snowflake Data Pipelines with Kestra - + Kestra's Snowflake plugin makes data warehousing simple even for non-developers thanks to YAML. Your Snowflake storage pipeline can accommodate raw data from multiple sources and transform it using ETL operations. Additionally, you can skip the transformation and directly load data into the warehouse using the ELT pipeline. Kestra can manage both workflows simultaneously. In any case, Kestra ensures that the data is readily available to perform analysis and learn valuable patterns. Discover how you can [build a Snowflake Data pipeline with Kestra](https://kestra.io/blogs/2022-10-05-kestra-snowflake). diff --git a/content/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.md b/src/content/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.md similarity index 97% rename from content/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.md rename to src/content/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.md index 13036df51cf..c692c7463cb 100644 --- a/content/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.md +++ b/src/content/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: "ageller" -image: /blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.png +image: "@assets/blogs/2023-09-28-release-0-12-subflow-logs-docker-builds-aws-lambda.png" --- We’re happy to announce Kestra 0.12.0. This release significantly improves **subflow** topology and logs, making navigating complex workflows a breeze. We've also added [Docker](/plugins/plugin-docker) and [SurrealDB](/plugins/plugin-surrealdb) plugins, and **new AWS integrations**, including [AWS Lambda](/plugins/plugin-aws/lambda/io.kestra.plugin.aws.lambda.invoke), [Amazon EventBridge](/plugins/plugin-aws/eventbridge/io.kestra.plugin.aws.eventbridge.putevents), and [Amazon Kinesis Data Streams](/plugins/plugin-aws/kinesis/io.kestra.plugin.aws.kinesis.putrecords). @@ -39,7 +39,7 @@ Kestra's subflows are modular components helping to build reusable and maintaina 🔹 **Subflow topology:** you can now see the topology of a subflow from the parent flow. [This enhancement](https://github.com/kestra-io/kestra/pull/2007) makes it easier to understand the structure of the subflow and how it fits into the bigger picture. - + 🔹 **Zoom in and out:** expand the subflow to see more details and collapse it to get a bird's eye view of the complete workflow comprised of multiple modular components. With [this change](https://github.com/kestra-io/kestra/pull/2171), you can decompose large workflows into smaller parts. @@ -49,7 +49,7 @@ Kestra's subflows are modular components helping to build reusable and maintaina 🔹 **Subflow logs:** you can view subflow logs directly from the parent flow, and they are beautifully formatted. [The integration of logs](https://github.com/kestra-io/kestra/pull/2140) gives you maximum visibility into the execution of complex workflows while maintaining the modularity and composability of the underlying business logic. - + --- @@ -82,7 +82,7 @@ This integration allows you to: 🔹 (optionally) pass the results of the Lambda function execution to the next task(s) in the workflow. - + With this integration, you can seamlessly incorporate serverless functions as part of an end-to-end workflow and orchestrate microservices running on AWS along with on-prem and cloud-native applications and data pipelines. diff --git a/content/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.md b/src/content/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.md similarity index 82% rename from content/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.md rename to src/content/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.md index c40cb22cdd6..c81c12c58d6 100644 --- a/content/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.md +++ b/src/content/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.md @@ -6,10 +6,10 @@ category: News & Product Updates author: name: Emmanuel Darras image: "edarras" -image: /blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.jpg +image: "@assets/blogs/2023-10-05-announcing-Kestra-funding-to-build-the-universal-open-source-orchestrator.jpg" --- -We are thrilled to announce that Kestra has raised **$3 million of funding** to make orchestration more accessible, collaborative, and scalable. +We are thrilled to announce that Kestra has raised **$3 million of funding** to make orchestration more accessible, collaborative, and scalable. We aim to empower a wide range of users, from software engineers to data professionals, by simplifying and unifying their automation and orchestration needs. We envision Kestra as the go-to solution for organizations seeking **simple** and **versatile** orchestration. @@ -27,7 +27,7 @@ To address this, Kestra offers a versatile and language-agnostic developer platf ## The Orchestration Platform for Business-Critical Operations - + Our initial mission was to build the most efficient open-source workflow platform targeting the data engineering space. Since then, we’ve experienced tremendous growth well beyond that domain. Our users leverage Kestra not only to orchestrate data pipelines but also to power their **business-critical applications**. They use our platform to orchestrate microservices and applications feeding data to their end products, and then they use Kestra for analytical workflows to understand how their products are performing. This way, Kestra serves as a **universal orchestration** solution for their business. @@ -39,7 +39,7 @@ Software engineers appreciate the **API-first** design and **robust**, **scalabl ## Run Anywhere, Code in Any Language - + In terms of language compatibility, Kestra supports tasks written in a wide array of programming languages, including **Python**, **R**, **Node.js**, **Julia**, **Rust**, **Bash**, **PowerShell**, and anything that can run as a containerized process. Kestra's flows can run anywhere — from your laptop or on-prem VM to a Kubernetes cluster in a public cloud. Thanks to the extensible integrations ecosystem, including features such as custom plugins, triggers, tasks, blueprints, and fully customizable scripts and microservices, the product keeps evolving along with the business requirements of our users. @@ -64,30 +64,30 @@ If you want to support us in our journey, give us a [GitHub star](https://github ## Trusted by Leading Tech Investors This funding was co-led by [ISAI](http://www.isai.vc/), [Axeleo Capital](https://www.axc.vc/), alongside several SaaS and open-source experts angel investors, including:
->Olivier Pomel (CEO & Co-founder at Datadog), -Stijn Christiaens (Co-founder & CDC at Collibra), -Olivier Bonnet (CTO at Blablacar), -Pierre Burgy (Co-founder & CEO at Strapi), -Luc Delsalle (VP Engineering at Tenable), -Gabriel-James Safar (Director of Product Management at Datadog), -Fabrice Bernhard (Co-founder & CTO at Theodo Group), -Vincent Pineau (Tech Entrepreneur), -Yacine Terki (Co-founder & CEO at Data Impact by NielsenIQ), -Ludovic Gallen (Co-founder at Data Impact by NielsenIQ), -Emmanuel Martin-Chave (VP Data at Blablacar), -Nicolas Fonrose (Founder & CEO at Teevity), -Amirhossein Malekzadeh (Entrepreneur & Investor), -Philippe Besnard (Entrepreneur & Investor), -Yann Fleureau (Tech Entrepreneur & Investor), -Baptiste Hamel (Entrepreneur & Investor), -Romain Hervé (Entrepreneur & Investor), -Eric Mahe (Entrepreneur & Investor), -Denis Lafont-Trevisan (Entrepreneur & Investor), -Abdelillah Hassam (Software Engineer & Investor), -Arnaud Ladrière (Entrepreneur & Investor), -Marc Chancerel (Investor at Blueprint Partners), -Romain Dardour (Head of Product at L’Oréal Beauty Tech), -Jia Li (Co-founder & CSO/CTO at CardioLogs), +>Olivier Pomel (CEO & Co-founder at Datadog), +Stijn Christiaens (Co-founder & CDC at Collibra), +Olivier Bonnet (CTO at Blablacar), +Pierre Burgy (Co-founder & CEO at Strapi), +Luc Delsalle (VP Engineering at Tenable), +Gabriel-James Safar (Director of Product Management at Datadog), +Fabrice Bernhard (Co-founder & CTO at Theodo Group), +Vincent Pineau (Tech Entrepreneur), +Yacine Terki (Co-founder & CEO at Data Impact by NielsenIQ), +Ludovic Gallen (Co-founder at Data Impact by NielsenIQ), +Emmanuel Martin-Chave (VP Data at Blablacar), +Nicolas Fonrose (Founder & CEO at Teevity), +Amirhossein Malekzadeh (Entrepreneur & Investor), +Philippe Besnard (Entrepreneur & Investor), +Yann Fleureau (Tech Entrepreneur & Investor), +Baptiste Hamel (Entrepreneur & Investor), +Romain Hervé (Entrepreneur & Investor), +Eric Mahe (Entrepreneur & Investor), +Denis Lafont-Trevisan (Entrepreneur & Investor), +Abdelillah Hassam (Software Engineer & Investor), +Arnaud Ladrière (Entrepreneur & Investor), +Marc Chancerel (Investor at Blueprint Partners), +Romain Dardour (Head of Product at L’Oréal Beauty Tech), +Jia Li (Co-founder & CSO/CTO at CardioLogs), Noé Gersanois (Co-Head at Raise Sherpas & Angel Investor). diff --git a/content/blogs/2023-10-09-kestra-surrealdb.md b/src/content/blogs/2023-10-09-kestra-surrealdb.md similarity index 90% rename from content/blogs/2023-10-09-kestra-surrealdb.md rename to src/content/blogs/2023-10-09-kestra-surrealdb.md index 427d528ffc1..67a1c601d31 100644 --- a/content/blogs/2023-10-09-kestra-surrealdb.md +++ b/src/content/blogs/2023-10-09-kestra-surrealdb.md @@ -6,7 +6,7 @@ category: Solutions author: name: Dario Radecic image: "dradecic" -image: /blogs/2023-10-09-kestra-surrealdb.jpg +image: "@assets/blogs/2023-10-09-kestra-surrealdb.jpg" --- If you're entering the world of data engineering and data orchestration in 2023, boy do you have options. So many actually that it's overwhelming at times, especially when looking for a database vendor. @@ -28,7 +28,7 @@ The database packs a wide array of disruptive features, such as an SQL-style que **Some find it to be the next generation of a serverless database.** -Further, SurrealDB is a multi-model database, which means you can store your data in tables, documents, and graphs. You don't have to choose the method in advance. It allows you to add inter-document record links which results in completely avoiding traditional SQL JOINs. +Further, SurrealDB is a multi-model database, which means you can store your data in tables, documents, and graphs. You don't have to choose the method in advance. It allows you to add inter-document record links which results in completely avoiding traditional SQL JOINs. This database also has machine learning and real-time functionalities built in, but that's out of the scope of today's article. @@ -47,7 +47,7 @@ curl --proto '=https' --tlsv1.2 -sSf https://install.surrealdb.com | sh Yup, that's all you need to do - SurrealDB is now installed: - + It's a good idea to add it to PATH while you're here - the output shown in the previous image lists the command you have to run. Here's the one generated for me - but remember that yours will be different: @@ -63,7 +63,7 @@ surreal version Provided you don't get an error (surreal not found), you're good to go: - + The database is now installed, but isn't running yet. @@ -77,7 +77,7 @@ surreal start memory -A --auth --user root --pass root You'll see the following output in the Terminal: - + SurrealDB is now running locally, which means we should be able to connect to it. @@ -94,11 +94,11 @@ A [dedicated desktop application](https://github.com/StarlaneStudios/Surrealist/ Here's what you should see on the screen: - + Once you enter the connection parameters, hit the "Save details" button. You'll be redirected to the following screen: - + As soon as you see the pink "Send query" button, and not the gray "Connect" button, it means the database connection was established, and you're ready to proceed to the following section. @@ -135,7 +135,7 @@ This will give an arbitrary ID to each record. If you want to control the ID val Anyway, run the `CREATE` statements individually, and here's what you will see: - + The records should now be inserted into the database, but how can we know for sure? Let's query it next. @@ -148,7 +148,7 @@ SELECT * FROM employee; You can see both records listed in JSON format: - + You now know the bare minimum of SurrealDB, but just enough to explore how it works with Kestra. We'll go over two simple data flows next, and only then will we go over a more advanced example. @@ -187,23 +187,23 @@ Long story short, we're running a simple `SELECT` statement and storing all of t Note how we're using host: `host.docker.internal` instead of the local database address. That's because we're running Kestra in a Docker container, and this is a workaround to allow it access to your computer's local host: - + Once your flow looks like ours, hit the "Save" button followed by "New execution". You'll be redirected to a flow run Gantt chart in which you'll hopefully see the single bar colored green (which means success): - + Remember how we specified `fetchType: STORE` in the flow code? What this means is that the records fetched from the SurrealDB will be accessible to you as a downloadable artifact. Head over to the "Outputs" section of the execution log, and you'll be able to both preview and download the file: - + This is what it contains: - + And that's your first Kestra and SurrealDB flow. Let's also see how to insert data. @@ -245,15 +245,15 @@ pluginDefaults: Here's what your flow code should look like: - + Run it once again - this time, you'll see two bars, each representing an individual task: - + The output artifact now has three records, since we've inserted a new one and fetched all of them: - + Up next, let's work with a couple of "advanced" SurrealDB features to show you exactly what this database is capable of. @@ -274,7 +274,7 @@ We'll modify the flow in a way that it uses three tasks of type `io.kestra.plugi **Task 1 - createEmployee** - Creates a new type of record called `employee` and insert a new record with the ID of `dario` (my first name) -- Uses the dot notation in attribute names to leverage a nested JSON structure (e.g., `name.first` will equal to `"name": {"first": "value"}` +- Uses the dot notation in attribute names to leverage a nested JSON structure (e.g., `name.first` will equal to `"name": {"first": "value"}` - Creates a derived attribute of full name by combining the existing attributes for first and last name. This is done with the built-in `string::join()` function - Creates a derived attribute for email that concatenates the lowercased values of first and last names, alongside the dot in between and a domain name after (more SurrealDB string functions) - Creates a field named `year_of_birth` which is derived from an existing attribute age @@ -333,8 +333,8 @@ tasks: - id: getData type: io.kestra.plugin.surrealdb.Query query: | - SELECT * FROM employee, laptop - WHERE employee.year_of_birth >= 1995 + SELECT * FROM employee, laptop + WHERE employee.year_of_birth >= 1995 FETCH employee, laptop ; fetchType: STORE @@ -351,11 +351,11 @@ pluginDefaults: Let's run the flow to see what happens. We don't get any errors, indicated with the individual green bars: - + The downloadable file contains entries from both `employee` and `laptop`, as you can see from the following image: - + And that's how Kestra integrates with SurrealDB - let's wrap things up next. diff --git a/content/blogs/2023-10-11-why-ingestion-will-never-be-solved.md b/src/content/blogs/2023-10-11-why-ingestion-will-never-be-solved.md similarity index 99% rename from content/blogs/2023-10-11-why-ingestion-will-never-be-solved.md rename to src/content/blogs/2023-10-11-why-ingestion-will-never-be-solved.md index 04f34509607..e0a6b481800 100644 --- a/content/blogs/2023-10-11-why-ingestion-will-never-be-solved.md +++ b/src/content/blogs/2023-10-11-why-ingestion-will-never-be-solved.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-10-11-why-ingestion-will-never-be-solved.png +image: "@assets/blogs/2023-10-11-why-ingestion-will-never-be-solved.png" --- If you ask a data engineer what is the most frustrating and error-prone part of their job, chances are they'll say _data ingestion_. Moving data from A to B is one of the most mundane and time-consuming tasks of any platform team. diff --git a/content/blogs/2023-10-13-kestra-mls.md b/src/content/blogs/2023-10-13-kestra-mls.md similarity index 97% rename from content/blogs/2023-10-13-kestra-mls.md rename to src/content/blogs/2023-10-13-kestra-mls.md index 245de611f30..a000fc9f0bc 100644 --- a/content/blogs/2023-10-13-kestra-mls.md +++ b/src/content/blogs/2023-10-13-kestra-mls.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-10-13-kestra-mls.jpg +image: "@assets/blogs/2023-10-13-kestra-mls.jpg" --- In this blog post we will show how [Kestra](https://github.com/kestra-io/kestra) is used by professional football club to find the best talents and optimize game strategy. @@ -15,7 +15,7 @@ Indeed, taking data-driven decisions in sport is now a keystone to improve athle ## Football Analytics: What, Why & How? Football analytics emerged from the established analytical practices in sports like baseball and basketball. -Clubs, players, competition stakeholders, and betting companies are leaning on data to drive their decisions. +Clubs, players, competition stakeholders, and betting companies are leaning on data to drive their decisions. The first objective of this transformation is to analyze and model the game in the most objective way. To improve sports performances. Understand players' choices, forecast team performance trends, study tactics and rules evolution, forecast injuries, optimize transfer decisions, find valuable — underrated — players, etc… @@ -27,7 +27,7 @@ To make this a reality, clubs and sport institutions had to invest in new types Like more classic businesses, it involves many tools and practices. Unlike the way it came through in traditional B2B or B2C businesses, sports ventures move fast as they are quite small and pressured by weekly sport performances. Hence, they need efficient and scalable tools, enabling them to develop insight at pace while keeping cost low. -Football clubs can rely on different type of data to improve performances and drive decisions: +Football clubs can rely on different type of data to improve performances and drive decisions: * **Contextual data**: main events like goals, replacement, yellow cards, etc… It’s characterized by the minute of the event, so it's quite basic. Still useful for common statistics and general view. * **Event data**: much detailed, they track every ball action: passes, tackles, crosses, dribbles, shoots, etc… They are characterized by coordinate data (sometimes in three dimensions), so very useful for any person looking to analyze and create models of the game. Used by football clubs, they are gathered by hand and algorithms and often exposed through provider APIs. @@ -52,7 +52,7 @@ Thanks to Kestra, they can orchestrate several critical pipelines such as: For deployment, they choose a straightforward AWS EC2 instance with PostgreSQL server, Shiny proxy to serve apps and private R or Python packages for everyday tasks. - + ## Next Steps diff --git a/content/blogs/2023-10-17-schedulers-landscape.md b/src/content/blogs/2023-10-17-schedulers-landscape.md similarity index 99% rename from content/blogs/2023-10-17-schedulers-landscape.md rename to src/content/blogs/2023-10-17-schedulers-landscape.md index fc522202bc7..98ad05c8fa2 100644 --- a/content/blogs/2023-10-17-schedulers-landscape.md +++ b/src/content/blogs/2023-10-17-schedulers-landscape.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-10-17-schedulers-landscape.jpg +image: "@assets/blogs/2023-10-17-schedulers-landscape.jpg" --- Gone are the days of rudimentary cron jobs. With the rise of microservices, big data, and cloud-native distributed technologies, job scheduling has evolved to meet the needs of modern engineering workflows. diff --git a/content/blogs/2023-10-30-top-data-orchestration-platforms.md b/src/content/blogs/2023-10-30-top-data-orchestration-platforms.md similarity index 97% rename from content/blogs/2023-10-30-top-data-orchestration-platforms.md rename to src/content/blogs/2023-10-30-top-data-orchestration-platforms.md index 5d613d14df6..681862efaf0 100644 --- a/content/blogs/2023-10-30-top-data-orchestration-platforms.md +++ b/src/content/blogs/2023-10-30-top-data-orchestration-platforms.md @@ -6,7 +6,7 @@ category: Solutions author: name: Dario Radecic image: "dradecic" -image: /blogs/2023-10-30-top-data-orchestration-platforms-2023.png +image: "@assets/blogs/2023-10-30-top-data-orchestration-platforms-2023.png" --- Handling data in 2023 is... tough, to say at least. It's become normal for companies to collect huge volumes of data from dozens of sources, which means orchestrating these workflows was never more important (and complex) than today. After all, it's what will allow you to make smart, data-driven decisions. @@ -51,7 +51,7 @@ This section walks you through the 5 most popular orchestration tools and discus ### 1. Apache Airflow [Airflow](https://airflow.apache.org/) is a Python-based open-source orchestration tool adopted by many in the industry. It allows you to create DAGs (Directed Acyclic Graphs) that are responsible for implementing data pipelines. Airflow is primarily intended for scheduling batch ETL pipelines for data lake and data warehousing use cases. - + Airflow belongs to the FOSS category (free and open-source software). Of course, you'll need to manage the expense of running Airflow with its compute environment, and you'll need someone to set it up and manage it for you. The other option is to use a pay-as-you-go cloud-managed Airflow instance. You can find it on all major cloud providers (AWS, Azure, GCP), but the price will depend on so many factors, as it typically does with cloud environments. @@ -75,7 +75,7 @@ That being said, Airflow isn't without its flaws. Here are some you might find a ### 2. Kestra [Kestra](https://github.com/kestra-io/kestra) is an open-source universal orchestration platform with a declarative interface for workflow definition. It's primarily built for software engineers but it's simple enough to be used by anyone in your organization. For more information about Kestra, check our [Documentation](../docs/index.md). - + The open-source version of Kestra is **completely free** and recommended for a single-player experience. If you want to adopt Kestra in your team, we recommend the [Enterprise edition](https://kestra.io/enterprise), which offers Enterprise-grade features such as SSO, RBAC, namespace level secrets and variable management, plugin defaults, worker groups, custom blueprints, high availability with no single point of failure architecture, and so much more. @@ -92,7 +92,7 @@ This is the list of areas in which Kestra easily beats the competition: ### 3. Azure Data Factory [Azure Data Factory](https://azure.microsoft.com/en-us/products/data-factory) is a cloud-based ETL tool owned by Microsoft Azure. Unlike the two orchestration tools listed earlier, this one works only in the cloud and is a good option to consider if your organization already uses a lot of Azure services. ADF offers around 90 connectors for building data pipelines which sounds like a lot, but is on the low side when compared with other tools on this list. - + It's often difficult to figure out how much a cloud tool will cost you on a monthly basis, and Azure Data Factory is no exception. ADF pricing depends on the integration server at runtime and specific operations performed. You're charged separately for organization, data movement, pipeline activities, and multiple other actions. **Price can vary so much between users, so we won't even try to estimate it**. You can take a look at their [pricing options](https://azure.microsoft.com/en-us/pricing/details/data-factory/data-pipeline/) and potentially come up with an estimated monthly figure. @@ -111,7 +111,7 @@ However, there are more than a few cons you need to be aware of: ### 4. Prefect [Prefect](https://www.prefect.io/) is another Python-centric open-source orchestration tool. It's known for its flexibility and adaptability. Sure, it's not widely recognized or used as Airflow, but it has gained traction in the last couple of years. In addition to what's already obvious, Prefect makes it easy to add logging, retries, dynamic mapping, caching, and failure notifications to Python-based workflows. - + **Prefect is open-source**, but offers two [pricing tiers](https://www.prefect.io/pricing). You can use the free forever version that has limited features, or step up to the paid Prefect Cloud version that will set you back almost $500 per month. @@ -131,7 +131,7 @@ Of course, there are some disadvantages of using Prefect you need to know about: ### 5. AWS Step Functions Similar to Azure Data Factory, AWS Step Functions provide a visual orchestration tool that allows you to orchestrate services within the AWS cloud ecosystem. It's a serverless offering that is scalable in nature and makes a lot of sense for companies that are already invested in the AWS ecosystem since it has direct integration with over 220 AWS services. - + Just like with Azure Data Factory, **pricing is almost impossible to ballpark**. It's a cloud environment after all, so the estimated monthly cost depends on various factors, such as the compute region, workflow type, number of workflow requests, number of transitions per workflow, and so on. You get the point - there's a lot of moving parts. The good news is that AWS provides a [cost calculator](https://calculator.aws/#/addService/StepFunctions) you can use to estimate your monthly costs. The bad news is that you need to somehow estimate your requirements before ever using a tool, which is easier said than done. diff --git a/content/blogs/2023-10-31-kestra-weaviate.md b/src/content/blogs/2023-10-31-kestra-weaviate.md similarity index 92% rename from content/blogs/2023-10-31-kestra-weaviate.md rename to src/content/blogs/2023-10-31-kestra-weaviate.md index d4b7f1d167b..5283337045f 100644 --- a/content/blogs/2023-10-31-kestra-weaviate.md +++ b/src/content/blogs/2023-10-31-kestra-weaviate.md @@ -6,7 +6,7 @@ category: Solutions author: name: Dario Radecic image: "dradecic" -image: /blogs/2023-10-31-kestra-weaviate.jpg +image: "@assets/blogs/2023-10-31-kestra-weaviate.jpg" --- It's been a year since ChatGPT, an advanced form of a large language model, has been released. And by the looks of it, AI is going only one way - forward. Many wonder how models like these can handle and process such huge volumes of data efficiently, and the answer is simple - **vector databases**. Well, among other things. @@ -39,7 +39,7 @@ If you want to learn more about the basics of vector databases, here are some re ## What is Weaviate Vector Database Think of Weaviate as of vector database vendor, similar to MongoDB in the world of NoSQL databases. Weaviate offers an open-source vector database that allows you to store common data objects and vector embeddings from machine learning models: - + Weaviate offers client libraries for Python, JavaScript, TypeScript, Go, and Java. There's also an online editor you'll learn about later. @@ -100,23 +100,23 @@ tasks: This is what your Kestra UI code editor should look like: - + Once you're satisfied with your schema definition, you can click on the "Save" button to save the flow code, and then click on the "Execute" button to run it. You'll immediately see the following window: - + The Cluster URL and API key have default values just for convenience of not having to enter them every time, but allowing you to change them if necessary. You can now once again click on the "Execute" button to start the flow: - + If you've entered Weaviate credentials correctly, you'll see a success message. To validate the outcome, go to the Weaviate console and run the following query to get all data from the `Movie` schema: - + The output validates that the schema has been created successfully. Next, let's insert some data. @@ -163,15 +163,15 @@ tasks: Here's what your editor should look like: - + As in the previous section, save the flow and execute it - you'll see a success message right after: - + We haven't yet shown you how to query Weaviate from Kestra, so you'll have to turn back to WCS and run a query manually. It will be the same query you used in the previous section, but this time it will return some data: - + It would be nice to query a Weaviate vector database straight from Kestra, so let's show you how to do that next. @@ -211,19 +211,19 @@ tasks: This is what your flow code should look like: - + You can now save the flow and execute it. This is the output you'll see in the Gantt view: - + The results of the query are available in the *Outputs* tab. In there, you can either preview or download the results: - + Here's what you'll see after clicking on the *Preview* button: - + And that's how easy it is to query a Weaviate vector database from Kestra. Next, let's do a brief recap. diff --git a/content/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.md b/src/content/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.md similarity index 98% rename from content/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.md rename to src/content/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.md index 73830bc630b..2d292f8a482 100644 --- a/content/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.md +++ b/src/content/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-11-08-when-use-kestra-airbyte-fivetran.jpg +image: "@assets/blogs/2023-11-08-when-use-kestra-airbyte-fivetran.jpg" --- As the data stack is maturing, it’s good to ask ourselves what are the overlaps of the tools we have at hand. diff --git a/content/blogs/2023-11-16-release-0-13.md b/src/content/blogs/2023-11-16-release-0-13.md similarity index 98% rename from content/blogs/2023-11-16-release-0-13.md rename to src/content/blogs/2023-11-16-release-0-13.md index b28edf4350e..b58512829d1 100644 --- a/content/blogs/2023-11-16-release-0-13.md +++ b/src/content/blogs/2023-11-16-release-0-13.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: "ageller" -image: /blogs/2023-11-16-release-0-13.png +image: "@assets/blogs/2023-11-16-release-0-13.png" --- We are excited to announce the release of Kestra 0.13.0, featuring two major additions: **multi-tenancy** and a full **Visual Studio Code editor** integrated into the Kestra UI. This new Editor allows you to write and manage custom scripts without having to worry about dependency management and deployments. The multi-tenancy feature helps isolate data and code across different environments, teams, projects, or customers, building upon the existing namespace-level isolation. @@ -53,7 +53,7 @@ Imagine working on orchestration pipelines would be as effortless as editing loc This feature not only makes your work more efficient but also brings your YAML definitions together with your scripts, microservices, custom queries, and other project files (called [Namespace Files](https://kestra.io/docs/developer-guide/namespace-files)) into a single, streamlined interface. - + --- @@ -114,7 +114,7 @@ This use case is fairly easy to manage with a small number of items, but it beco This task can also help to improve the **scalability** of your data pipelines. You can split large files that don't fit in memory into micro-batches and process them in parallel across multiple workers or containers. - + --- @@ -281,7 +281,7 @@ The `logLevel` property, with its **default** setting to **store all logs**, can The UI header has been revamped to include a global search bar and a new navigation menu. Soon, the search bar will allow you to search for flows, tasks, and namespaces. For now, it serves as an omnipresent navigation tool, allowing you to quickly access the main UI pages from anywhere in the UI. - + --- @@ -291,7 +291,7 @@ By default, the Executions table displays the execution ID, execution's start an The UI now allows you to fully **customize** this view by adding or removing columns, including **new dedicated properties** for inputs, flow's revision used in that execution, the final task of the flow, and more. - + --- @@ -299,7 +299,7 @@ The UI now allows you to fully **customize** this view by adding or removing col This release introduces multi-tenancy in Kestra's Enterprise Edition. This feature allows a single Kestra instance to support multiple tenants independently. For developers and platform administrators, this offers better resource isolation and management. End-users benefit from a more streamlined experience across various environments. - + --- diff --git a/content/blogs/2023-11-20-advanced-python-scripts.md b/src/content/blogs/2023-11-20-advanced-python-scripts.md similarity index 89% rename from content/blogs/2023-11-20-advanced-python-scripts.md rename to src/content/blogs/2023-11-20-advanced-python-scripts.md index 1e692294177..18c3315b78a 100644 --- a/content/blogs/2023-11-20-advanced-python-scripts.md +++ b/src/content/blogs/2023-11-20-advanced-python-scripts.md @@ -6,7 +6,7 @@ category: Solutions author: name: Dario Radecic image: "dradecic" -image: /blogs/2023-11-20-advanced-python-scripts.jpg +image: "@assets/blogs/2023-11-20-advanced-python-scripts.jpg" --- [Kestra](https://github.com/kestra-io/kestra) is, by design, language-agnostic, offering the flexibility to write scripts in your preferred language. @@ -23,17 +23,17 @@ Today, we'll explore both methods in detail. But first, let's develop a large Py ## Writing a Long Python Script for Web Scraping -So, what will our "complex" Python script do? +So, what will our "complex" Python script do? In a nutshell, it will scrape a website and organize the results in a Pandas DataFrame. We'll leverage a website that was designed for beginners to learn web scraping - [Books to Scrape](http://books.toscrape.com/). It has books organized into categories, as you can see from the following image: - + Clicking on an individual book opens up a whole new world of things to scrape: - + And that's just what we'll do. Since this isn't a web scraping article, we'll only provide a high-level overview of the scraping logic. We have a file named `scraper.py` which implements the following functions: - `get_books()` - It accepts a list of topics and then iterates over them, constructs n URL, and uses the `BeautifulSoup` Python package to scrape the website. Once scraped, it extracts properties such as book title, link, thumbnail link, rating, price, and availability. Some of the properties might be missing, and we've taken that into account. Finally, books are organized into a Pandas DataFrame and returned to the user. @@ -148,13 +148,13 @@ You can run the `scraper.py` file from CMD/Terminal, depending on the operating Here's what we got printed to the console: - + The script has scraped 81 books in 3 seconds, and supposedly saved the results into a CSV file. You'll see this file in the same place where your Python script is located: - + It looks like everything worked, so let's bring this logic to Kestra next. @@ -177,7 +177,7 @@ lxml==4.9.3 Now create a new GitHub repository and copy both files to it. You should end up with something like this: - + And that's it! You're now ready to create a new Kestra flow. @@ -214,28 +214,28 @@ tasks: And here's what your editor's content should look like: - + You can run it, and this time you'll see three green bars. The additional bar in the middle represents the task of cloning the GitHub repo: - + You can further inspect the contents of the `Logs` tab. It will show you the same success message seen in the previous section, while we were testing the script locally: - + The biggest benefit of running Python script this way is that you or anyone else from your team can **modify the Python code** on the fly, without the need to do any modification on Kestra's end. Let's see that in action next. ### What Happens If You Change the Python Code? To demonstrate, we've decided to add a couple more book categories to the Python file. Nothing fancy or groundbreaking, but you should end up with a couple of more scraped books: - + The best part is that you can now simply re-run the Kestra flow and leave the flow YAML file identical to what it was. As you can see, the Python script has now **scraped a total of 141 books instead of 81**, which means Kestra was able to detect the change on a Python script stored on GitHub: - + If you ask us, that's the true power of separating code logic from data flows - scalability. @@ -246,11 +246,11 @@ Up next, you'll learn how to run Python scripts using our new code editor. To start using it, click on the `Editor` tab in the sidebar navigation, and choose your namespace from the dropdown menu: - + After a couple of seconds of initializations, you'll be presented with a familiar-looking interface: - + The contents of the `_flows` folder are a topic to discuss some other time, so leave it untouched. Everything you do Python-wise will have to be stored in a new folder named, let's say `scripts`. @@ -262,7 +262,7 @@ To start, create a new folder `scripts` in the root directory, and create a Pyth Once the Python file is opened, paste the contents of our web scraping script. Here's what it should look like: - + And that's it! Just make sure the Python file is saved, and you're ready to use it in your workflows. @@ -293,15 +293,15 @@ tasks: Your YAML flow file now looks extra tidy: - + As before, save the flow and run it by clicking on the purple "Execute" button. You'll see the following in the `Gantt` view: - + **So, why are the bars orange?** The answer is simple - we got a warning message while installing Python libraries saying pip commands shouldn't be run by the root user: - + It's a warning you can safely ignore. It doesn't affect the runtime in any way. diff --git a/content/blogs/2023-11-21-clever-connect-hr-tech.md b/src/content/blogs/2023-11-21-clever-connect-hr-tech.md similarity index 97% rename from content/blogs/2023-11-21-clever-connect-hr-tech.md rename to src/content/blogs/2023-11-21-clever-connect-hr-tech.md index 10c8e2f6295..1cf3cd938d2 100644 --- a/content/blogs/2023-11-21-clever-connect-hr-tech.md +++ b/src/content/blogs/2023-11-21-clever-connect-hr-tech.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-11-21-clever-connect-hr-tech.jpg +image: "@assets/blogs/2023-11-21-clever-connect-hr-tech.jpg" --- This case study delves into how [CleverConnect](https://cleverconnect.com/), a human resources tech company, leverages Kestra's capabilities to create an integration platform. With a database of over 10 million candidates and partnerships with 2,500 companies across Europe, CleverConnect has developed an AI-driven, integrated solution for job boards, career sites, CRMs, and other HR tools. Using [Kestra](https://github.com/kestra-io/kestra), they've constructed a platform specifically tailored for automating the creation of connectors, streamlining the recruitment process, and enhancing the overall experience. @@ -36,7 +36,7 @@ This platform allows to generate Kestra flows through a low code interface that * Outbound Connectors: to map data to external providers and deal with corresponding destination authentication and credentials. - + The more sources and destinations CleverConnect has, the more difficult it gets. Thanks to Kestra, the company has successfully uncoupled the sources and destinations, allowing ease of maintenance and development. The business logic of parsing API and make the codebase flexible has been possible thanks to the following features of Kestra: diff --git a/content/blogs/2023-11-27-yaml-crashcourse.md b/src/content/blogs/2023-11-27-yaml-crashcourse.md similarity index 99% rename from content/blogs/2023-11-27-yaml-crashcourse.md rename to src/content/blogs/2023-11-27-yaml-crashcourse.md index c7f441c07e9..8138c26f0ef 100644 --- a/content/blogs/2023-11-27-yaml-crashcourse.md +++ b/src/content/blogs/2023-11-27-yaml-crashcourse.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-11-27-yaml-crashcourse.png +image: "@assets/blogs/2023-11-27-yaml-crashcourse.png" --- @@ -224,7 +224,7 @@ tasks: The image below shows how you can overwrite various input values before starting an Execution. This is extremely useful for experimenting with different values. - + --- diff --git a/content/blogs/2023-12-01-yaml-pitfalls.md b/src/content/blogs/2023-12-01-yaml-pitfalls.md similarity index 98% rename from content/blogs/2023-12-01-yaml-pitfalls.md rename to src/content/blogs/2023-12-01-yaml-pitfalls.md index 93bb5c22473..59ba437cf27 100644 --- a/content/blogs/2023-12-01-yaml-pitfalls.md +++ b/src/content/blogs/2023-12-01-yaml-pitfalls.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-12-01-yaml-pitfalls.png +image: "@assets/blogs/2023-12-01-yaml-pitfalls.png" --- ## Understanding where the YAML criticism comes from @@ -54,13 +54,13 @@ The most common complaints about YAML are related to **indentation**. Similarly As long as your workflow syntax passes validation made by Kestra's API, the indentation doesn't matter. The image below demonstrates how the flow passes validation even though the list elements are over-indented. - + The validation passes because indentation is consistent. That's enough for Kestra to understand the structure of the flow, even if it's not properly formatted. However, in another example shown below, you can see that the indentation is inconsistent - the first and the second tasks have different indentation levels. As a result, the flow fails validation and can't be saved. - + Thanks to the built-in syntax validation, **Kestra's API doesn't allow you to save an invalid flow**. There are no surprises at runtime because the flow is validated during its creation, i.e. at build time. This constrained (yet robust) approach offers an advantage over more flexible (yet more fragile) Python scripts, where indentation errors can lead to unexpected behavior at runtime. diff --git a/content/blogs/2023-12-04-dlt-kestra-usage.md b/src/content/blogs/2023-12-04-dlt-kestra-usage.md similarity index 96% rename from content/blogs/2023-12-04-dlt-kestra-usage.md rename to src/content/blogs/2023-12-04-dlt-kestra-usage.md index 7182710b913..6adea1851fa 100644 --- a/content/blogs/2023-12-04-dlt-kestra-usage.md +++ b/src/content/blogs/2023-12-04-dlt-kestra-usage.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anuun Chinbat image: "achinbat" -image: /blogs/2023-12-04-dlt-kestra-usage.jpg +image: "@assets/blogs/2023-12-04-dlt-kestra-usage.jpg" --- @@ -50,7 +50,7 @@ Wanna jump to the [GitHub repo](https://github.com/dlt-hub/dlt-kestra-demo)? To lay it all out clearly: Everything's automated in **`Kestra`**, with hassle-free data loading thanks to **`dlt`**, and the analytical thinking handled by OpenAI. Here's a diagram to help you understand the general outline of the entire process. - + Now, let's delve into specific parts of the implementation. @@ -59,7 +59,7 @@ Now, let's delve into specific parts of the implementation. >💡 The two flows in Kestra are set up in a very straightforward and intuitive manner. Simply follow the Prerequisites and Setup guidelines in the [repo](https://github.com/dlt-hub/dlt-kestra-demo). It should take no more than 15 minutes. Once you’ve opened http://localhost:8080/ in your browser, this is what you’ll see on your screen: - + Now, all you need to do is [create your flows](https://github.com/dlt-hub/dlt-kestra-demo/blob/main/README.md) and execute them. @@ -146,11 +146,11 @@ This configuration ensures that your flows are executed hourly on workdays from A Slack assistant that delivers crisp inbox insights right at your fingertips: - + And a well-organized table in BigQuery, ready for you to dive into a more complex analysis: - + In essence, using **`Kestra`** and **`dlt`** offers a trio of advantages for refining email analysis and data workflows: diff --git a/content/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.md b/src/content/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.md similarity index 96% rename from content/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.md rename to src/content/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.md index b45dfb48c3c..db484176872 100644 --- a/content/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.md +++ b/src/content/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.md @@ -6,7 +6,7 @@ category: Company News author: name: Emmanuel Darras image: "edarras" -image: /blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.jpg +image: "@assets/blogs/2023-12-05-Kestra-the-terrafrom-of-orchestration-and-automation.jpg" --- Many people have recently been comparing Kestra to Terraform, as both tools provide a declarative DSL to manage and automate workflows. @@ -19,7 +19,7 @@ This blog post will delve into how Kestra compares to Terraform in offering decl ## Declarative Language - + Like Terraform, which uses its HashiCorp Configuration Language (HCL) for declarative infrastructure management, Kestra employs a declarative YAML-based approach to define workflows. @@ -45,7 +45,7 @@ Kestra embodies the same philosophy for workflow orchestration. It transitions f ## Cloud-Agnostic and Language-Agnostic - + ### Terraform's Cloud-Agnostic Approach @@ -93,7 +93,7 @@ Kestra echoes this modular philosophy. With features like blueprints and subflow ## Scalability - + Both Kestra and Terraform are designed with scalability at their core, enabling organizations to expand their operations smoothly and efficiently. diff --git a/content/blogs/2023-12-07-dremio-kestra-integration.md b/src/content/blogs/2023-12-07-dremio-kestra-integration.md similarity index 97% rename from content/blogs/2023-12-07-dremio-kestra-integration.md rename to src/content/blogs/2023-12-07-dremio-kestra-integration.md index 7110857da75..2e5ce36ead9 100644 --- a/content/blogs/2023-12-07-dremio-kestra-integration.md +++ b/src/content/blogs/2023-12-07-dremio-kestra-integration.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-12-07-dremio-kestra-integration.png +image: "@assets/blogs/2023-12-07-dremio-kestra-integration.png" --- @@ -82,7 +82,7 @@ Let's look at a practical application of Kestra and Dremio for data lakehouse or - + --- @@ -157,7 +157,7 @@ This flow clones a Git repository with [dbt code](https://github.com/dbt-labs/ja - + --- diff --git a/content/blogs/2023-12-11-custom-plugin.md b/src/content/blogs/2023-12-11-custom-plugin.md similarity index 94% rename from content/blogs/2023-12-11-custom-plugin.md rename to src/content/blogs/2023-12-11-custom-plugin.md index 7eea1e0c60c..de42932ffa4 100644 --- a/content/blogs/2023-12-11-custom-plugin.md +++ b/src/content/blogs/2023-12-11-custom-plugin.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2023-12-11-custom-plugin.jpg +image: "@assets/blogs/2023-12-11-custom-plugin.jpg" --- Kestra is powerful in many ways: you can get started in a few minutes, build robust workflows, and manage everything as code and from the UI. @@ -35,7 +35,7 @@ Creating such a meta-plugin proves to be highly advantageous, especially when de The development team chose a stepwise approach to create this integrated plugin. Since Kestra already includes the necessary components, they initially developed a Kestra Flow. This Flow enabled them to execute Soda tests and send the resulting metrics to Kafka topics. The outcome was a Kestra flow composed of various tasks, with each task addressing a specific functionality. - + This initial version proved that YAML's simplicity accelerates development and shortens the feedback loop. @@ -45,7 +45,7 @@ They opted for the latter. The rationale was that handling custom logic, numerou Once the Flow was designed in YAML, converting it to Java was straightforward, as you can see in the image below. - + ## Building components @@ -58,7 +58,7 @@ Choosing one or the other depends on the situation and the developer's expertise Alternatively, you could build custom Python scripts (especially using the [embedded Code Editor](https://kestra.io/docs/developer-guide/namespace-files)) and use them to build parametrized workflows. By designing a subflow with a Python script task, the team can encapsulate the business logic and expose only a few YAML parameters to execute the underlying script. - + ## Conclusion diff --git a/content/blogs/2023-12-14-orchestration-problems-and-complexity.md b/src/content/blogs/2023-12-14-orchestration-problems-and-complexity.md similarity index 95% rename from content/blogs/2023-12-14-orchestration-problems-and-complexity.md rename to src/content/blogs/2023-12-14-orchestration-problems-and-complexity.md index 3e16ce3ea5e..3d5a018ff65 100644 --- a/content/blogs/2023-12-14-orchestration-problems-and-complexity.md +++ b/src/content/blogs/2023-12-14-orchestration-problems-and-complexity.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2023-12-14-orchestration-problems-and-complexity.png +image: "@assets/blogs/2023-12-14-orchestration-problems-and-complexity.png" --- Orchestration is critical for any organization that wants to automate and scale its operations. Many teams start with simple scripts deployed with serverless functions only to realize that such an approach doesn't scale as new use cases emerge. @@ -23,7 +23,7 @@ Orchestration typically starts with a simple objective: schedule data workflows, As more systems and services get integrated, your evolving use cases outgrow the capabilities of your initial orchestration solution. As a result, your organization adopts new specialized tools to meet these needs. These tools often have their own embedded orchestration capabilities. This leads to the formation of silos, as each tool, while effective in its domain, contributes to the growing complexity and fragmentation. Observability, dependency management and troubleshooting become increasingly difficult, making your system nearly impossible to maintain and understand. - + ## How to Solve Complexity Without Adding Complexity @@ -38,7 +38,7 @@ Kestra allows users to work in their preferred environment, whether coding from Kestra UI offers an embedded code editor allowing you to seamlessly orchestrate business logic written in any language without the pain of packaging and deploying code. The embedded editor helps you write workflow code that follows best practices thanks to autocompletion, code autoformatting, built-in documentation, verified blueprint examples and continuous syntax validation powered by Kestra's [open-source VS Code extension](https://marketplace.visualstudio.com/items?itemName=kestra-io.kestra). - + For business users, Kestra offers UI forms allowing to build workflows without requiring a programming experience. These UI-created pipelines generate human-readable YAML configuration files, organized into namespaces and automatically versioned, just as you would with Git. @@ -60,7 +60,7 @@ To meet users where they are and remove the need for new silos, Kestra integrate Thanks to the open-source contributions, the list of supported plugins keeps growing with every new release. You can check the [list of supported plugins](/plugins/) to see if your favorite tool is already supported. If not, you can [build your own](https://kestra.io/docs/plugin-developer-guide) in minutes. - + ## Next Steps diff --git a/content/blogs/2023-12-19-enabling-business-in-it.md b/src/content/blogs/2023-12-19-enabling-business-in-it.md similarity index 97% rename from content/blogs/2023-12-19-enabling-business-in-it.md rename to src/content/blogs/2023-12-19-enabling-business-in-it.md index 2c8f7e3b1b2..8a9a307baf3 100644 --- a/content/blogs/2023-12-19-enabling-business-in-it.md +++ b/src/content/blogs/2023-12-19-enabling-business-in-it.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2023-12-19-enabling-business-in-it.jpg +image: "@assets/blogs/2023-12-19-enabling-business-in-it.jpg" --- Platforms such as Zapier and Make have empowered a new wave of citizen developers—business users who can build applications and workflows to meet their immediate needs without writing a single line of code, helping businesses to innovate rapidly and respond to changing customer demands with minimal delay. @@ -17,9 +17,9 @@ This is what we are going to talk about in this blog post and how we need tools ## The Data Mesh Model: A Prelude to Unified Usage - + -The concept of a data mesh has made significant inroads into how we handle and disseminate information within organizations. It champions the idea of decentralized data ownership, where domain-specific teams manage their data as a product. However, it's not just the data that needs this democratization; the actual usage and operational workflows need to reflect this model too. +The concept of a data mesh has made significant inroads into how we handle and disseminate information within organizations. It champions the idea of decentralized data ownership, where domain-specific teams manage their data as a product. However, it's not just the data that needs this democratization; the actual usage and operational workflows need to reflect this model too. Business users must become the owners of their workflows—designers of their processes and architects of their outcomes. To realize this vision, the empowerment of business users through technology is critical. Some of those tools as mentioned in the introduction have, quite literally, put the power of automation into the hands of the marketer, the sales executive, or the HR manager. @@ -29,7 +29,7 @@ Business users must become the owners of their workflows—designers of their pr The heart of the matter lies in the balance between empowerment and control. Business users need the freedom to manipulate their tools and workflows, yet this needs to be under the umbrella of a centralized IT strategy to avoid the pitfalls of shadow IT. When business departments take tech matters into their own hands without IT oversight, the risks can escalate—data breaches, compliance issues, and inefficiencies are just the tip of the iceberg. -In the name of digital agility, businesses often encourage their teams to solve problems using the most immediate and accessible technological solutions. This trend has given rise to no-code and low-code platforms, empowering non-technical business users to create applications and automate processes independently. +In the name of digital agility, businesses often encourage their teams to solve problems using the most immediate and accessible technological solutions. This trend has given rise to no-code and low-code platforms, empowering non-technical business users to create applications and automate processes independently. ### Understanding the Implications of Empowerment and Shadow IT diff --git a/content/blogs/2024-01-08-sentry-plugin.md b/src/content/blogs/2024-01-08-sentry-plugin.md similarity index 95% rename from content/blogs/2024-01-08-sentry-plugin.md rename to src/content/blogs/2024-01-08-sentry-plugin.md index 68bcd4bd951..e89ef51ef8b 100644 --- a/content/blogs/2024-01-08-sentry-plugin.md +++ b/src/content/blogs/2024-01-08-sentry-plugin.md @@ -6,7 +6,7 @@ category: Solutions author: name: Kevin Fleming image: "kfleming" -image: /blogs/2024-01-08-sentry-plugin.jpg +image: "@assets/blogs/2024-01-08-sentry-plugin.jpg" --- The goal of observability is to provide answers to one question: is everything working as expected, and if not, why not? Everything from data quality to workflow bottlenecks to user experience to CICD pipelines can and should be observable by logs, metrics, and traces (the three pillars). And, as they say, absence of evidence is not evidence of absence, so success must be just as observable as failure. @@ -26,27 +26,27 @@ Each one of these tasks is described in detail below, and at the end of the arti Sentry has a [zero-dollar plan for devs](https://sentry.io/pricing/) (no credit card required) and that’s the plan I’ll be using in this article. - + When Sentry receives an issue, it appears in the Issues dashboard: - + and, with the default configuration, an email alert is sent to the account used during registration: - + ### Sentry Registration Registration is quick and easy - you don’t have to choose a plan at this time, Sentry automatically gives everyone a 14-day trial of the Business Plan. During registration, you will be asked to **create an initial project** and an SDK for your preferred tech. A particular SDK is not needed to use Kestra, but you do need one to move forward with Sentry. - + Choose one of the middleware technologies as these make it easy to find your **Sentry Client Keys**, aka Data Source Name or **DSN**. Your Kestra flows will need the DSN in order to POST issues to Sentry, Each project has its own DSN, which can be found by clicking on **Settings**, then **Project Settings**, then the **Client Keys** (DSN) link toward the bottom of the menu: - + That will take you to this screen, where you can copy the DSN. @@ -54,7 +54,7 @@ That will take you to this screen, where you can copy the DSN. **For more on working with secrets in Kestra, see our [Managing Secrets](https://kestra.io/docs/developer-guide/secrets) guide.** - + That’s it. You're all set with Sentry. @@ -141,7 +141,7 @@ The **message** JSON property will become the label or title of the issue. Sentry uses this value to group similar issues: - + The `culprit` JSON property is used to define the module or code section related to this issue: @@ -177,11 +177,11 @@ Sentry provides the **extra** property where you can add values as needed. That The **Link** key-value pair of the extras property in the example above is particularly useful. It will appear on the issue detail page and is conveniently clickable: - + In this example, the link URL has been composed so that it will take you right to the Kestra page for this execution, where you can view any of the relevant information: - + If your use case for Sentry is to actually capture failures, then this link can be composed like this, so that clicking it will take you straight to the logs tab of the executions details: @@ -193,7 +193,7 @@ http://localhost:8090/ui/executions/sentry_article/sentry_info_task/1TFBhMb71oc3 Finally, after you executed the flow, navigate to the logs from the Logs or Gantt tabs, and Kestra will show you the JSON that was sent to Sentry:** - + ### SentryAlert Example diff --git a/content/blogs/2024-01-16-gorgias.md b/src/content/blogs/2024-01-16-gorgias.md similarity index 91% rename from content/blogs/2024-01-16-gorgias.md rename to src/content/blogs/2024-01-16-gorgias.md index 17d7e701b7c..4f589b4744f 100644 --- a/content/blogs/2024-01-16-gorgias.md +++ b/src/content/blogs/2024-01-16-gorgias.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-01-16-gorgias.jpg +image: "@assets/blogs/2024-01-16-gorgias.jpg" --- Infrastructure as Code (IaC) has become the industry standard for cloud resources management and configuration. @@ -51,11 +51,11 @@ One of Kestra's strengths is its ability to scale effortlessly. It can handle mi For the Gorgias team, streamlining processes like initiating Airbyte synchronization followed by dbt transformations and setting up efficient retry policies for dbt jobs has been particularly valuable, as they have shifted to BigQuery's capacity-based pricing. Kestra also enables the Gorgias team to schedule Hightouch synchronization after dbt jobs to ensure data remains current, trigger ETL Python scripts with easy monitoring, centralize their log management, and use an integrated UI. This UI allows for the quick creation of flows with a user-friendly workflow editor and offers a wide range of blueprints for various needs. - + - + - + ## Modularity with Kestra and Terraform @@ -68,11 +68,11 @@ To provide modular development experience, the Gorgias team leverages Terraform - Subflows can depend on each other; this dependency should be materialized by the `depends_on` field in subflows/main.tf. *Can be used by modules to hide some non-necessary complexity and to dry redundant tasks (Running a SQL query on a given PostgresDB) - + Logs are fully streamed from Airbyte to Kestra to provide a centralized platform for monitoring and debugging : - + ## Applying configuration using Kestra as a CI/CD tool @@ -85,9 +85,9 @@ To be more efficient, Gorgias's team uses Kestra also as a CI/CD engine. As they With the [dedicated Kestra Terraform plugin](/plugins/plugin-terraform), they can apply changes to a local Kubernetes service endpoint using kube-DNS resolution. This way, their entire data infrastructure is managed using Kestra. - + - + ## Next steps diff --git a/content/blogs/2024-01-22-release-0-14.md b/src/content/blogs/2024-01-22-release-0-14.md similarity index 99% rename from content/blogs/2024-01-22-release-0-14.md rename to src/content/blogs/2024-01-22-release-0-14.md index 9c02d3c7200..32cdd066bcf 100644 --- a/content/blogs/2024-01-22-release-0-14.md +++ b/src/content/blogs/2024-01-22-release-0-14.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: "ageller" -image: /blogs/2024-01-22-release-0-14.png +image: "@assets/blogs/2024-01-22-release-0-14.png" --- We are thrilled to announce the release of Kestra 0.14.0, which continues building upon our embedded Code Editor by adding automated Git sync, new import and export functionality, and docs available right from the editor. We've also revamped the website search and added plugin's hopepage and blueprints to the website. @@ -33,7 +33,7 @@ Apart from syncing your code from Git to Kestra, you can also [push your code](/ Check the [Version Control with Git](https://kestra.io/docs/developer-guide/git) documentation for a deep dive into multiple ways to version control your code with Git and when to use them. - + ## VS Code Editor improvements diff --git a/content/blogs/2024-01-23-bouygues-immobilier-valorissimo.md b/src/content/blogs/2024-01-23-bouygues-immobilier-valorissimo.md similarity index 98% rename from content/blogs/2024-01-23-bouygues-immobilier-valorissimo.md rename to src/content/blogs/2024-01-23-bouygues-immobilier-valorissimo.md index 6d64e616f49..548240d1958 100644 --- a/content/blogs/2024-01-23-bouygues-immobilier-valorissimo.md +++ b/src/content/blogs/2024-01-23-bouygues-immobilier-valorissimo.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2024-01-23-bouygues-immobilier-valorissimo.jpg +image: "@assets/blogs/2024-01-23-bouygues-immobilier-valorissimo.jpg" --- Bouygues Immobilier platform, Valorissimo, with over two decades of experience in the real estate sector, stands out as a historic company in the industry. They have developed a unique methodology over the years to assist real estate professionals in selling their programs. This expertise encompasses a broad understanding of the market, which has been instrumental in their success. @@ -67,11 +67,11 @@ A critical aspect of Kestra’s functionality within Valorissimo’s data ecosys ## Going Further with Hanalytics -Hanalytics' expertise in building a modern data stack, complemented by Kestra's advanced workflow automation has been pivotal for Valorissimo. +Hanalytics' expertise in building a modern data stack, complemented by Kestra's advanced workflow automation has been pivotal for Valorissimo. This integration of technologies like Airbyte, dbt Core, and Hightouch, managed by Kestra, ensures that Bouygues Immobilier remains a leader in a competitive market, driven by innovation and a deep understanding of the real estate ecosystem. We are proud to have such partners has [Hanalytics](https://www.data-hanalytics.io/) and we are looking forward to further enhance our collaboration with their amazing team! ---- +--- Join the [Slack community](https://kestra.io/slack) if you have any questions or need assistance. Follow us on [Twitter](https://twitter.com/kestra_io) for the latest news. Check the code in our [GitHub repository](https://github.com/kestra-io/kestra) and give us a star if you like the project. \ No newline at end of file diff --git a/content/blogs/2024-01-24-2024-data-engineering-trends.md b/src/content/blogs/2024-01-24-2024-data-engineering-trends.md similarity index 99% rename from content/blogs/2024-01-24-2024-data-engineering-trends.md rename to src/content/blogs/2024-01-24-2024-data-engineering-trends.md index 516b4f1ce6c..1280f6cd5c9 100644 --- a/content/blogs/2024-01-24-2024-data-engineering-trends.md +++ b/src/content/blogs/2024-01-24-2024-data-engineering-trends.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2024-01-24-2024-data-engineering-trends.png +image: "@assets/blogs/2024-01-24-2024-data-engineering-trends.png" --- This blog post highlights the key trends we see in data engineering in 2024 and how those trends affect data teams. diff --git a/content/blogs/2024-02-01-gemini-multi-modal-completion.md b/src/content/blogs/2024-02-01-gemini-multi-modal-completion.md similarity index 92% rename from content/blogs/2024-02-01-gemini-multi-modal-completion.md rename to src/content/blogs/2024-02-01-gemini-multi-modal-completion.md index c77998c948f..9b88f18b11a 100644 --- a/content/blogs/2024-02-01-gemini-multi-modal-completion.md +++ b/src/content/blogs/2024-02-01-gemini-multi-modal-completion.md @@ -6,7 +6,7 @@ category: Solutions author: name: Loïc Mathieu image: "lmathieu" -image: /blogs/2024-02-01-gemini-multi-modal-completion.jpg +image: "@assets/blogs/2024-02-01-gemini-multi-modal-completion.jpg" --- A few weeks ago, [Google introduce Gemini](https://blog.google/technology/ai/google-gemini-ai), a new addition to Generative AI. What sets Gemini apart is its ability to handle multi-modal completions combining text, images, and other content types into a single response. This capability moves us closer to human-like analysis of diverse information sources simultaneously. @@ -32,7 +32,7 @@ tasks: This task will output Gemini's response in the form of a prediction. - + The task interacts with Gemini to generate responses across various modalities, outputting predictions that include both the generated content and safety ratings. While initially similar to what we've seen with previous AI models like Bard, Gemini take a step further with its multimodal completion capability. This function allows it to process and generate content that spans text, audio, and video within a single query. @@ -70,7 +70,7 @@ tasks: This is the generated text for the description of the image. - + The image was indeed a schema of the Java classloader system, the answer is pretty good, but we can see that it is truncated. @@ -96,7 +96,7 @@ With this configuration, the description of the image is no more truncated. This is the generated text for the description of the video, the video was a screencast of Kestra, the description is not very accurate except for the black color as I used Kestra's dark theme. - + ## Security Safety with Gemini Model @@ -104,7 +104,7 @@ Gemini has security safety included, and it works for all type of content. For example, if you ask Gemini to describe a photo of an identity card, the answer will be blocked for a safety reason and the task ends in WARNING. - + You can see in the outputs that the safety category `HARM_CATEGORY_DANGEROUS_CONTENT` was evaluated as `MEDIUM` and blocked the answer. diff --git a/content/blogs/2024-02-06-gitops.md b/src/content/blogs/2024-02-06-gitops.md similarity index 96% rename from content/blogs/2024-02-06-gitops.md rename to src/content/blogs/2024-02-06-gitops.md index b3fa7eaf51b..429a1245dfe 100644 --- a/content/blogs/2024-02-06-gitops.md +++ b/src/content/blogs/2024-02-06-gitops.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-02-06-gitops.png +image: "@assets/blogs/2024-02-06-gitops.png" --- Recent trends all mention Ops as a shiny suffix. Where did that come from? Is it pure marketing or is there something real behind it? @@ -45,12 +45,12 @@ The separation of concerns in your application and orchestration layer helps you - [Git Clone task](/plugins/plugin-git/io.kestra.plugin.git.clone): this task allows you to clone a Git repository at flow execution time. For example, you can clone a repository containing your business logic made in Python and run a following `Python.commands` task to execute your scripts. The orchestration logic is dead simple (few lines of YAML), uncoupled to your business logic that can evolve at its own pace. - + - [Namespace Files](https://kestra.io/docs/developer-guide/namespace-files): Kestra offers an embedded Code editor where you can store any kind of files. This is very useful when you want to inject custom scripts into your orchestration layer without the burden of having an unreadable YAML file. - + - [Custom Docker image](https://kestra.io/docs/developer-guide/scripts/custom-docker-image): one can build its own Docker image with business logic built in it. As script tasks in Kestra allow passing any docker image, it’s easy to build custom applications and orchestrate them in Kestra. @@ -87,7 +87,7 @@ The dilemma often lies in deciding between the convenience of a graphical interf - [Git Sync task](/plugins/plugin-git/io.kestra.plugin.git.sync) in Kestra ensures your development stays in sync with Git. Making Git the single source of truth. If you prefer developing in the UI but want Git to hold all changes, use the Git Sync task to align your Kestra instance with Git. This maintains a clean production environment by overwriting any UI changes. - + **Using IDE/Terminal (“As Code”):** @@ -97,7 +97,7 @@ Once your code is in Git you want to deploy it to the final production environme Kestra supports many CI/CD engines like GitHub Actions, GitLab CI/CD Pipeline, Azure DevOps Pipeline, and BitBucket pipes. It also offers a CLI to integrate into any system. Moreover, users already using Terraform will love to declare flows, secrets, and any Kestra asset as Terraform resources so they can be easily deployable across environments. - + ## Need For Git: No Drift diff --git a/content/blogs/2024-02-28-dbt-or-sqlmesh.md b/src/content/blogs/2024-02-28-dbt-or-sqlmesh.md similarity index 98% rename from content/blogs/2024-02-28-dbt-or-sqlmesh.md rename to src/content/blogs/2024-02-28-dbt-or-sqlmesh.md index c0b8c868c3d..29eac9a7ccd 100644 --- a/content/blogs/2024-02-28-dbt-or-sqlmesh.md +++ b/src/content/blogs/2024-02-28-dbt-or-sqlmesh.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-02-28-dbt-or-sqlmesh.png +image: "@assets/blogs/2024-02-28-dbt-or-sqlmesh.png" --- Conversations around the [Analytics Stack](https://twitter.com/mattturck/status/1761436014122332187) often revolve around the assumption that everyone is using the Extract, Load, Transform (ELT) approach, with the transformation (T) happening within a data warehouse using SQL. These discussions quickly shift towards the use of dbt as the go-to tool for this process. @@ -105,7 +105,7 @@ Here is a general feature comparison between dbt and SQLMesh: | Data audits | Yes | Yes | | Schema contracts | Yes | Yes | | Data contracts | No | Yes | -| **Deployment** | | | +| **Deployment** | | | | Virtual Data Environments | No | Yes | | Open-source CI/CD bot | No | Yes | | Data consistency enforcement | No | Yes | @@ -117,7 +117,7 @@ Here is a general feature comparison between dbt and SQLMesh: | Visualization | No | Yes | | Documentation generation | Yes | Yes | | Column-level lineage | Yes (Cloud) | Yes (OSS) | -| **Miscellaneous** | | | +| **Miscellaneous** | | | | Package manager | Yes | No | | Multi-repository support | No | Yes | | SQL transpilation | No | Yes | @@ -193,7 +193,7 @@ triggers: cron: "30 6 * * *" ``` - + ### Orchestrating dbt with Kestra diff --git a/content/blogs/2024-02-29-release-0-15.md b/src/content/blogs/2024-02-29-release-0-15.md similarity index 95% rename from content/blogs/2024-02-29-release-0-15.md rename to src/content/blogs/2024-02-29-release-0-15.md index 8f20b4b5394..5a3af85b3d1 100644 --- a/content/blogs/2024-02-29-release-0-15.md +++ b/src/content/blogs/2024-02-29-release-0-15.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: "ageller" -image: /blogs/2024-02-29-release-0-15.png +image: "@assets/blogs/2024-02-29-release-0-15.png" --- @@ -93,7 +93,7 @@ You can now disable and re-enable triggers directly from the UI without having t You can read more about this functionality in the [Trigger documentation](/docs/workflow-components/triggers). - + ### The `NONE` Action in File Detection Triggers We've added a new type of action to **file detection triggers**, offering more control over how you can process recently detected files. When setting the action to `NONE`, the trigger will not move nor delete the file, allowing you to manually manage the file after it has been processed within the execution. @@ -236,7 +236,7 @@ As a result of the new flow `outputs` feature, the `outputs` property of a `Subf We've also [enhanced](https://github.com/kestra-io/kestra/pull/2970) how subflow executions can be terminated. Specifically, terminating a parent flow will now also end all its associated subflows. However, you can also terminate both parent and child executions independently. - + --- @@ -244,7 +244,7 @@ We've also [enhanced](https://github.com/kestra-io/kestra/pull/2970) how subflow Secrets management has been further improved in this release, with the introduction of SECRET type inputs and [new functions](https://github.com/kestra-io/kestra/pull/2892) for encrypting and decrypting data. Additionally, the UI now allows for easy [deletion of logs](https://github.com/kestra-io/kestra/pull/3002) for specific task runs, helping quickly address any accidental exposure of sensitive data. - + [Some outputs](https://github.com/kestra-io/kestra/pull/3005) such as [GCP](https://github.com/kestra-io/plugin-gcp/pull/324) or [ECR](https://github.com/kestra-io/plugin-aws/pull/373) tokens are now automatically encrypted and decrypted. @@ -256,22 +256,22 @@ Secrets management has been further improved in this release, with the introduct The Kestra UI continues improving the user experience. A notable addition is the new [Stats page](../docs/01.getting-started/14.ui.md#stats), which provides a comprehensive overview of executions, flows, namespaces, and triggers at a glance. - + In the open-source edition, this page enables configuring basic authentication for the Kestra instance directly from the UI. - + ### New Design of UI Tabs and Pagination The UI tabs and pagination display have been redesigned for easier navigation. Additionally, you can now filter by `absolute` or `relative` time ranges. - + Lastly, the `Save` and `Actions` buttons have been moved to a dedicated UI menu for improved navigation: - + --- @@ -287,15 +287,15 @@ We've also added a new generic Singer plugin that simultaneously integrates with For Enterprise Edition users, we've added a new [Setup page](../docs/06.enterprise/01.overview/02.setup.md) in the UI, showing the most important configuration options and streamlining the setup process for a new Kestra instance. That setup wizard will guide you through the initial configuration of your instance, making it easier to get started. - + We've also revamped the RBAC system, with improved handling of Superadmin access. There is also a dedicated UI page called Access allowing you to configure tenant-level RBAC. - + The new **Service Accounts UI page** allows you to create and manage [service accounts](../docs/06.enterprise/03.auth/service-accounts.md), and we've introduced API tokens valid for a specific period of time, allowing you to grant programmatic access to Kestra for Users and Service Accounts. This feature is particularly useful for CI/CD with GitHub Actions and Terraform, as well as for using the API token in API calls. - + --- diff --git a/content/blogs/2024-03-01-kestra-davidson-partnership.md b/src/content/blogs/2024-03-01-kestra-davidson-partnership.md similarity index 91% rename from content/blogs/2024-03-01-kestra-davidson-partnership.md rename to src/content/blogs/2024-03-01-kestra-davidson-partnership.md index ae1568b3e21..7cc7c9a5905 100644 --- a/content/blogs/2024-03-01-kestra-davidson-partnership.md +++ b/src/content/blogs/2024-03-01-kestra-davidson-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Quentin Sinig image: "qsinig" -image: /blogs/2024-03-01-kestra-davidson-partnership.jpg +image: "@assets/blogs/2024-03-01-kestra-davidson-partnership.jpg" --- We are excited to announce our partnership with [Davidson](https://www.davidson.group/), a leader in the consulting industry known for its expertise in digital transformation and modern technologies. @@ -24,17 +24,17 @@ Davidson is a renowned management consulting and technology expertise firm estab ### Why This Partnership Matters We're thrilled to have Davidson on board as our partner! Davidson's approach is refreshingly different: by cultivating an environment where creativity and collective intelligence are the norm, they stand out as unique incubators of innovation. This collaborative spirit is exactly what we were looking for in a partner, and we're confident that together, we can achieve great things. - + ### Davidson's Commitment to Excellence Davidson’s expertise supercharges Kestra’s platform. In less than 60 days, we were impressed by their capacities to enable an entire department at full speed, leading to commercial discussions with multiple industry leaders and 18 certified consultants! And that’s only the beginning… - + ### A Synergistic Partnership Our Engineering teams collaborated for weeks on readily available solutions for advanced automation needs. Meanwhile, our Sales teams aligned on a comprehensive delivery approach covering everything from single technical assistance to structured Proof of Concepts. This combined effort, already battletested with a couple of customers, empowers companies to implement robust, collaborative orchestration solutions efficiently. - + ### Empowering Businesses with Advanced Orchestration Together, Kestra and Davidson are committed to empowering businesses to implement simple, powerful, and collaborative orchestration solutions more effectively. This partnership will provide businesses with the support they need to implement Kestra in their operations successfully, ensuring they get the full benefits of advanced workflow orchestration. diff --git a/content/blogs/2024-03-05-kestra-hanalytics-partnership.md b/src/content/blogs/2024-03-05-kestra-hanalytics-partnership.md similarity index 95% rename from content/blogs/2024-03-05-kestra-hanalytics-partnership.md rename to src/content/blogs/2024-03-05-kestra-hanalytics-partnership.md index c3397cc4e93..3c0172e790d 100644 --- a/content/blogs/2024-03-05-kestra-hanalytics-partnership.md +++ b/src/content/blogs/2024-03-05-kestra-hanalytics-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Quentin Sinig image: "qsinig" -image: /blogs/2024-03-05-kestra-hanalytics-partnership.jpg +image: "@assets/blogs/2024-03-05-kestra-hanalytics-partnership.jpg" --- We're thrilled to announce our partnership with [Hanalytics](https://www.data-hanalytics.io/), a leader in consulting service dedicated to empowering data-rich organizations to enhance their analytics capabilities. @@ -37,7 +37,7 @@ Their Kestra-certified team has already successfully implemented Kestra in multi - **Reduced complexities, improved performances:** Hanalytics' expertise helped Copines de Voyage transition from a legacy system to a modern data stack. This modernized infrastructure allows for better data organization, access, and utilization for valuable insights. - + ## Get Involved diff --git a/content/blogs/2024-03-06-guide-integration-ingestion.md b/src/content/blogs/2024-03-06-guide-integration-ingestion.md similarity index 98% rename from content/blogs/2024-03-06-guide-integration-ingestion.md rename to src/content/blogs/2024-03-06-guide-integration-ingestion.md index 32e1dc05dae..924d255ccae 100644 --- a/content/blogs/2024-03-06-guide-integration-ingestion.md +++ b/src/content/blogs/2024-03-06-guide-integration-ingestion.md @@ -6,7 +6,7 @@ category: Solution author: name: Kevin Fleming image: "kfleming" -image: /blogs/2024-03-06-guide-integration-ingestion.jpg +image: "@assets/blogs/2024-03-06-guide-integration-ingestion.jpg" --- This blog post serves as a practical guide to cloud data warehouse (CDW) ingestion and integration, focusing on BigQuery, Redshift, and Snowflake. We address the key challenges data teams face, such as manual pipeline maintenance, and offer solutions to streamline these processes. Dive in! @@ -316,7 +316,7 @@ Each integration is further categorized: A solution to the problems of the high cost and friction of creating, changing, and managing data pipeline is a few simple architectures based on your data, metadata and your chosen CDW. Depending on your source, either Redshift or BigQuery was the first cloud data warehouse as a service, and in the past 13 years, these products have become incredibly popular, capable, and mature. Have a look at the diagram below created by Google Machine Learning Solution Architect, Rajesh Thallam, for his blog, [How to load, import, or ingest data into BigQuery for analysis | Google Cloud Blog](https://cloud.google.com/blog/topics/developers-practitioners/bigquery-explained-data-ingestion). It’s an almost complete list of the ways you can load data into BigQuery (see the section above on integration and ingestion). - + There are 39 leaf nodes in the above diagram. 39 different data sources that BigQuery knows how to handle. Then there’s logging, monitoring, alerting, permissions, and security. @@ -329,17 +329,17 @@ Let’s take a look at the work that might be involved in going from a great ide So, we uploaded some CSV to cloud storage and then queried the data with BigQuery! Simple, straightforward, and easy to maintain. - + Then one day, some eager beaver says, “You know, we could capture some events from the mobile app, and make it available to BigQuery. The business would love it! Probably wouldn't be too hard…” - + Ok, that’s adding some complexity but there’s real business value. A few months later, another bright spark says, “You know, instead of uploading these events every day, we could stream these app events in real time. The business would love it! Probably wouldn't be too hard…” - + Did we really need to stream the event data in real time? Was the business value worth the cost in added complexity and dev hours? Or did the business team just say, “Yeah, that’d be cool.” @@ -420,7 +420,7 @@ If your organization is adopting a data mesh architecture, Kestra instances can You have the ability to quickly implement any of the best-in-class tools like [FiveTran](/plugins/plugin-fivetran), [dlt](https://github.com/dlt-hub/dlt-kestra-demo), [Airbyte](/plugins/plugin-airbyte) or [SQLMesh](/plugins/plugin-sqlmesh). - + ## Kestra Features diff --git a/content/blogs/2024-03-07-databricks-partnership.md b/src/content/blogs/2024-03-07-databricks-partnership.md similarity index 94% rename from content/blogs/2024-03-07-databricks-partnership.md rename to src/content/blogs/2024-03-07-databricks-partnership.md index 968a577228e..7ced0b3abd3 100644 --- a/content/blogs/2024-03-07-databricks-partnership.md +++ b/src/content/blogs/2024-03-07-databricks-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Emmanuel Darras image: "edarras" -image: /blogs/2024-03-07-databricks-partnership.jpg +image: "@assets/blogs/2024-03-07-databricks-partnership.jpg" --- **We're excited to announce a strategic partnership between [Kestra](https://github.com/kestra-io/kestra) and [Databricks](https://www.databricks.com/), uniting our strengths to enhance the data orchestration and analytics landscape. This collaboration is set to empower data teams by integrating Kestra's orchestration capabilities with Databricks' unified analytics platform, offering a comprehensive solution for managing complex data workflows.** @@ -23,7 +23,7 @@ Kestra leverages this advanced architecture to provide dynamic data workflow man Kestra's plugin for Databricks extends the platform's functionality, allowing for efficient data processing and transformation. This integration empowers data teams to leverage Databricks' compute and storage resources more effectively, optimizing data workflows and reducing operational costs. - + ### **Practical Applications of the Kestra-Databricks Integration** @@ -31,11 +31,11 @@ The integration between Kestra and Databricks leverages the strengths of both pl 1. **Dynamic Compute Cluster Management**: Automating compute cluster operations in Databricks with Kestra significantly streamlines resource management. Users can dynamically scale computational resources up or down based on the workflow's requirements, enhancing efficiency and optimizing costs. This is achieved through Kestra's **`CreateCluster`** and **`DeleteCluster`** tasks, which provide granular control over the lifecycle of compute clusters in Databricks. By specifying parameters such as cluster name, node type, number of workers, and Spark version, users ensure that each workflow has the exact computational resources it needs, when it needs them. - + 2. **Efficient Data Movement**: The **`Upload`** task in Kestra simplifies moving data to and from the Databricks File System (DBFS), eliminating the manual handling of files and streamlining the data workflow. This capability is particularly useful for workflows that involve preprocessing data in DBFS before analysis or moving results out of Databricks for further processing or visualization. By automating data uploads and downloads, Kestra ensures that the right data is available at the right stage of the workflow, facilitating seamless data pipelines. - + 3. **Streamlined Data Queries**: Executing SQL queries within Databricks using Kestra's task system brings a new level of efficiency to data processing. The **`Query`** task allows users to perform operations directly on data stored in Databricks, from data transformation to analytics. This integration is vital for workflows that require iterative data exploration, complex transformations, or aggregations before downstream processing. By embedding SQL execution within the orchestration workflow, Kestra enhances Databricks' data processing capabilities, enabling more sophisticated data analysis and decision-making based on real-time insights. @@ -47,7 +47,7 @@ Our collaboration with Databricks is the beginning of a strategic partnership de Stay tuned for updates on additional integrations and case studies showcasing how this partnership is facilitating more efficient, scalable, and effective data management strategies. For a closer look at how Kestra and Databricks are working together today, check out our [blueprints](/blueprints?page=1&size=24&q=databricks). These resources are designed to give you practical insights into leveraging our combined strengths for your data projects. - + If you have any questions, reach out via [Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). diff --git a/content/blogs/2024-03-08-building-multi-tenant-saas.md b/src/content/blogs/2024-03-08-building-multi-tenant-saas.md similarity index 97% rename from content/blogs/2024-03-08-building-multi-tenant-saas.md rename to src/content/blogs/2024-03-08-building-multi-tenant-saas.md index b8a6e93c03c..ef28689bb6f 100644 --- a/content/blogs/2024-03-08-building-multi-tenant-saas.md +++ b/src/content/blogs/2024-03-08-building-multi-tenant-saas.md @@ -6,14 +6,14 @@ category: Engineering author: name: Loïc Mathieu image: "lmathieu" -image: /blogs/2024-03-08-building-multi-tenant-saas.jpg +image: "@assets/blogs/2024-03-08-building-multi-tenant-saas.jpg" --- One of the recent Kestra evolutions I was responsible for was multitenancy support, a critical feature for providing scalable and secure data management solutions to a wide range of clients. This blog post delves into how we're implementing multi-tenancy at Kestra, guided by insights from a recent talk I gave on designing multi-tenant SaaS systems. ## What’s Multi-Tenancy -Multi-tenancy is a software architecture model that enable a single instance of software to serve multiple tenants or client organizations, It simulates several logical instances within a single physical instance. The goal is to maximize resource efficiency while ensuring data isolation and operational cost control. +Multi-tenancy is a software architecture model that enable a single instance of software to serve multiple tenants or client organizations, It simulates several logical instances within a single physical instance. The goal is to maximize resource efficiency while ensuring data isolation and operational cost control. ## Exploring Multi-Tenancy Models @@ -39,7 +39,7 @@ The most flexible yet complex model involves embedding a **`tenantId`** identifi Kestra’s architecture is built on a distributed system, where various components interact asynchronously, primarily through messaging queues. Below is an overview of the key components that make up Kestra’s architecture: - + ### Core Components of Kestra: @@ -88,7 +88,7 @@ As one of Kestra’s runners uses Kafka and Elasticsearch, which do not support Ultimately, we selected the **`tenantId`** model for its flexibility and alignment with Kestra's distributed architecture. This approach enables us to maintain the granular control needed for effective multi-tenancy, such as data isolation and tenant-specific configurations, without limiting user functionalities in the cloud or complicating the underlying system. -Using namespace would have been convenient, as we already had namespace-based flow isolation as well as role-based access management. But it would have greatly reduced the functionality of a user of our Cloud, as a namespace or basic namespace could not have been used by different users. +Using namespace would have been convenient, as we already had namespace-based flow isolation as well as role-based access management. But it would have greatly reduced the functionality of a user of our Cloud, as a namespace or basic namespace could not have been used by different users. ### Implementation Journey @@ -100,7 +100,7 @@ Incorporating a **`tenantId`** across Kestra required us to: You see it comming, it was not that simple! -Adding a property to a large number of classes / filters / queries / … brings a high risk of oversight, and therefore of bugs. And that’s exactly what happened. +Adding a property to a large number of classes / filters / queries / … brings a high risk of oversight, and therefore of bugs. And that’s exactly what happened. Despite great care during implementation, there were a few places where the tenant was not passed: diff --git a/content/blogs/2024-03-12-introduction-to-cloudquery.md b/src/content/blogs/2024-03-12-introduction-to-cloudquery.md similarity index 98% rename from content/blogs/2024-03-12-introduction-to-cloudquery.md rename to src/content/blogs/2024-03-12-introduction-to-cloudquery.md index 39edc5a5764..0528b057cde 100644 --- a/content/blogs/2024-03-12-introduction-to-cloudquery.md +++ b/src/content/blogs/2024-03-12-introduction-to-cloudquery.md @@ -6,7 +6,7 @@ category: Solutions author: name: Anna Geller image: "ageller" -image: /blogs/2024-03-12-introduction-to-cloudquery.png +image: "@assets/blogs/2024-03-12-introduction-to-cloudquery.png" --- In the [previous article](https://kestra.io/blogs/2023-10-11-why-ingestion-will-never-be-solved), we've discussed why data ingestion is a challenging problem and how various tools have approached it. In this post, we'll introduce CloudQuery, an open-source, high-performance ELT framework for developers. We'll briefly cover the product's history and its main strengths. We'll also look at a practical example of how to use CloudQuery to ingest data from Hacker News API to DuckDB, and how to put your CloudQuery syncs to production using Kestra. @@ -63,11 +63,11 @@ As an authenticated user, you get the following benefits: CloudQuery ingestion framework is open-source and free to use, but **premium plugins** require a paid subscription. The company behind CloudQuery offers a managed service called CloudQuery Cloud, allowing you to configure and schedule your CloudQuery syncs from a web interface. You can configure the desired amount of vCPU and vRAM for your syncs so that you don't have to worry about the infrastructure. - + The UI allows you to configure a new plugin by pointing to a Git repository containing your plugin code. - + ## CloudQuery in action diff --git a/content/blogs/2024-03-12-kestra-databricks.md b/src/content/blogs/2024-03-12-kestra-databricks.md similarity index 96% rename from content/blogs/2024-03-12-kestra-databricks.md rename to src/content/blogs/2024-03-12-kestra-databricks.md index 5e7be3c95f6..f2f4aa55910 100644 --- a/content/blogs/2024-03-12-kestra-databricks.md +++ b/src/content/blogs/2024-03-12-kestra-databricks.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: "smantri" -image: /blogs/2024-03-12-kestra-databricks.jpg +image: "@assets/blogs/2024-03-12-kestra-databricks.jpg" --- **Databricks provides a unified analytics platform for data scientists, engineers, and analysts to seamlessly collaborate on big data and machine learning projects. This post demonstrates how various data engineering activities can be performed on Databricks using [Kestra](https://github.com/kestra-io/kestra)'s plugin.** @@ -37,7 +37,7 @@ Kestra's Databricks plugin provides an efficient solution for creating intricate All the Kestra's Database plugin tasks will require you to provide the Databricks host name and authentication token to communicate with the Databricks cluster. In order to generate the authentication token for your cluster, you should go to the `Settings` and go to `Developer` tab. Here, you would have `Access tokens` section. Click on the “Manage” button in this section. Here you can generate a new token. You can put a comment on “What's this token for?” text box, and select the appropriate lifetime for the token. Click on the "Generate" button. This will generate the new token. - + Do ensure that you save the generated token with you before hitting "Done" on the popup, as you will not be able to access this token any time later. @@ -64,7 +64,7 @@ tasks: Post running this flow, you can check that the newly created compute cluster should now appear under the Compute section on the Databricks console. - + ### Upload file to Databricks File System ### @@ -130,7 +130,7 @@ tasks: Once you run this flow, take a look at the Outputs tab of this execution. The Outputs tab will provide the `size` indicating the number of records fetched by the query, and an `uri` to the Kestra’s internal storage file which contains the fetched records from the query. - + ### Delete Compute Cluster ### diff --git a/content/blogs/2024-03-14-dremio-partnership.md b/src/content/blogs/2024-03-14-dremio-partnership.md similarity index 96% rename from content/blogs/2024-03-14-dremio-partnership.md rename to src/content/blogs/2024-03-14-dremio-partnership.md index 42cac104469..cb4e495fa40 100644 --- a/content/blogs/2024-03-14-dremio-partnership.md +++ b/src/content/blogs/2024-03-14-dremio-partnership.md @@ -6,7 +6,7 @@ category: Company News author: name: Emmanuel Darras image: "edarras" -image: /blogs/2024-03-14-dremio-partnership.jpg +image: "@assets/blogs/2024-03-14-dremio-partnership.jpg" --- **Today, we’re thrilled to announce a strategic partnership between [Kestra](https://github.com/kestra-io/kestra) and [Dremio](https://www.dremio.com/) to simplify data workflows and accelerate time-to-delivery for data teams! This collaboration will empower data professionals to leverage the combined strengths of Kestra's declarative workflow engine and Dremio's Data lakehouse capabilities.** @@ -23,7 +23,7 @@ Kestra provides a declarative workflow engine that orchestrates Dremio's data ac Together, we reduce unnecessary coding overhead and eliminate the need for complex ETL pipelines. The intuitive interfaces focus on the user experience, and the rich plugin ecosystems of both tools further amplify their synergy, accelerating development cycles and empowering data professionals to deliver insights faster. - + ### Practical Application of the Kestra-Dremio Integration diff --git a/content/blogs/2024-03-14-duck-db.md b/src/content/blogs/2024-03-14-duck-db.md similarity index 97% rename from content/blogs/2024-03-14-duck-db.md rename to src/content/blogs/2024-03-14-duck-db.md index 5d3f27747bf..c5e4cfa56ed 100644 --- a/content/blogs/2024-03-14-duck-db.md +++ b/src/content/blogs/2024-03-14-duck-db.md @@ -6,10 +6,10 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-03-14-duck-db.jpg +image: "@assets/blogs/2024-03-14-duck-db.jpg" --- -**Combining Kestra and DuckDB to create a lakehouse architecture offers a modern approach to managing data by merging the strengths of data lakes and warehouses. This significantly reduces costs and complexities.** +**Combining Kestra and DuckDB to create a lakehouse architecture offers a modern approach to managing data by merging the strengths of data lakes and warehouses. This significantly reduces costs and complexities.** **This blog summarizes a talk I gave at the first DuckDB Meetup in Paris where I explored how DuckDB's in-memory columnar database integrates well with the orchestration capabilities of Kestra. It also covers the transition from traditional data storage methods to the more efficient and flexible lakehouse model, and discusses the use of DuckDB within Kestra environments through best practices for building scalable, cost-effective data ecosystems.** @@ -18,7 +18,7 @@ image: /blogs/2024-03-14-duck-db.jpg A data lake is a storage repository that holds a vast amount of raw data in its native format until it is needed. Meanwhile, a data warehouse is a system used for structuring data and support use cases such as reporting and data analysis. It is considered a core component of business intelligence. Data warehouses are central repositories of integrated data from one or more disparate sources. They store current and historical data in one single place that are used for creating analytical reports for workers throughout the enterprise. -The lakehouse architecture merges the flexibility of data lakes with the structured query capabilities of data warehouses. It consists of three layers: a query engine, a transaction layer, and a storage layer. +The lakehouse architecture merges the flexibility of data lakes with the structured query capabilities of data warehouses. It consists of three layers: a query engine, a transaction layer, and a storage layer. The transaction layer introduces an abstraction over raw storage, enabling direct table-like access to raw data, facilitated by Open Table Formats such as [Apache Iceberg](https://iceberg.apache.org/) or [Apache Hudi](https://hudi.apache.org/). This design enhances analytical and operational workflows, providing ACID transactions and efficient data management within a unified platform. @@ -39,7 +39,7 @@ In our exploration of DuckDB's integration within Kestra environments, we've ide - **Level 1:** focuses on automating queries and managing dependencies within the stack, utilizing DuckDB for query execution and an S3 bucket for storage, with Kestra orchestrating the workflow. This level is straightforward and fits very well in projects that need to be efficient and rely on simple technologies. However, this level does not address SQL query management, metadata management, or "big data" capabilities as it relies only on DuckDB engine (could be hard to scale horizontally and distribute compute) - + - **Level 2:** advances by incorporating SQL query management through tools like SQLMesh or DBT, still orchestrated by Kestra. It enhances the structure from Level 1 by uncoupling the business logic (the SQL queries) from the orchestration logic. For example, dbt project can be stored in a dedicated GitHub repository and pulled at runtime in Kestra. This way, dependencies between upstream tasks (data ingestion or data wrangling) and downstream tasks (alerting, refreshing a BI tool, etc.) is very easy to manage and monitor. It also simplifies backfilling and retry strategy management. @@ -69,7 +69,7 @@ tasks: - **Level 3:** represents a fully-fledged lakehouse model, adding metadata management, ACID properties, and time travel features through the integration of Apache Iceberg for the transaction layer. This level maintains the advancements of Level 2 and addresses its limitations, offering a comprehensive solution for data management and analytics. Note that this integration is still in its early phase: Iceberg writing disposition with DuckDB is still in development and several challenges could arise. Still, it's something open-source [developers are working on](https://github.com/duckdb/duckdb_iceberg) and it could be a very interesting and mature solution soon. - + Each level progressively builds upon the last, offering more sophisticated features and capabilities, illustrating Kestra's flexibility and power in orchestrating complex data ecosystems with DuckDB as the query engine. @@ -83,7 +83,7 @@ Having a control-plane like Kestra is key here: it allows one to manage differen ## Engineers Is Your First Budget Cost not Compute -While the lakehouse architecture reduces computing costs by a great factor, an equally crucial aspect is the human element of development. +While the lakehouse architecture reduces computing costs by a great factor, an equally crucial aspect is the human element of development. Kestra's intuitive, declarative syntax enhances productivity, enabling teams to focus more on innovation and less on the intricacies of orchestration. It facilitates the separation of business and orchestration logic through a fully managed control plane - either using a full web user interface or using code assets like Terraform resources or following [GitOps patterns](https://kestra.io/blogs/2024-02-06-gitops). diff --git a/content/blogs/2024-03-18-guide-vector-databases.md b/src/content/blogs/2024-03-18-guide-vector-databases.md similarity index 99% rename from content/blogs/2024-03-18-guide-vector-databases.md rename to src/content/blogs/2024-03-18-guide-vector-databases.md index ed674f4ea14..c177b5cbab3 100644 --- a/content/blogs/2024-03-18-guide-vector-databases.md +++ b/src/content/blogs/2024-03-18-guide-vector-databases.md @@ -6,7 +6,7 @@ category: Solution author: name: Kevin Fleming image: "kfleming" -image: /blogs/2024-03-18-guide-vector-databases.jpg +image: "@assets/blogs/2024-03-18-guide-vector-databases.jpg" --- In what way are vector data type searches NOT LIKE SQL data type searches? Some answers: @@ -46,7 +46,7 @@ One killer use case is adding critical observability to your company’s use of Another use case for any kind of programmer is improving your help or documentation search results. You can easily replace lexical search with semantic search just by adding a VDB of your documents broken down into manageable chunks, and links to the original docs. No LLMs or massive GPUs needed. -### What is a vector? +### What is a vector? Vectors are lists of values, usually doubles or floats. They are encoded forms of text or images, video, and audio usually, but in fact, vectors can represent any complex data that you have an encoder for.** @@ -55,7 +55,7 @@ For the rest of the article examples, the vectors I will be referring to are cre --- -### Search algorithms and indexes +### Search algorithms and indexes Let’s use the previous example to help understand how search works in VDBs. Consider a corpus of help documents. One of the sections in the document explains how to enable and disable a workflow. Your customers or users, come from all over the world and will probably express their query with a set of related terms. With lexical search, the user must use “enable” or “disable”, and “workflow” to retrieve a result. If the user writes, “How do I start a workflow?” they get nothing, or they get unrelated results. That’s friction; I hate friction. @@ -98,7 +98,7 @@ What really matters is how well a particular VDB handles your use cases. --- -## Comparing VDB metrics and benchmarks +## Comparing VDB metrics and benchmarks This is where the rubber meets the vector database road. The solution to the search problem is what separates the leaders from the hackers. @@ -349,7 +349,7 @@ SentenceTransformers provides models that allow us to embed images and text into --- -## Vector/database use cases +## Vector/database use cases **Natural Language Processing (NLP):** diff --git a/content/blogs/2024-03-19-oltp-databases-guide.md b/src/content/blogs/2024-03-19-oltp-databases-guide.md similarity index 96% rename from content/blogs/2024-03-19-oltp-databases-guide.md rename to src/content/blogs/2024-03-19-oltp-databases-guide.md index f9f361d3be1..85df07c3418 100644 --- a/content/blogs/2024-03-19-oltp-databases-guide.md +++ b/src/content/blogs/2024-03-19-oltp-databases-guide.md @@ -6,7 +6,7 @@ category: Solution author: name: Kevin Fleming image: "kfleming" -image: /blogs/2024-03-19-oltp-databases-guide.jpg +image: "@assets/blogs/2024-03-19-oltp-databases-guide.jpg" --- **Context is everything. Decisions need context; effective choices rely on considering all relevant factors. For example, a doctor wouldn't prescribe medication solely based on symptoms; they'd need the patient's medical history as context.** @@ -34,37 +34,37 @@ The simplest measure of complexity, the one that is easiest to understand and us The following diagrams illustrate the easiest way of measuring complexity. The first diagram shows the number of components in a system, the interactions, and the number of interactions between components: - + If you simply change the labels and the layout of the components, you see the familiar and well-architected API Gateway to microservices: - + However, in the subsequent illustration, you can see right away that the complexity is greatly increased. The number of components has not increased but the number of interactions has increased dramatically. - + There is a saying that is appropriate here: “Good fences make good neighbors.” The following examples show a complete lack of fences, or boundaries between domain context. The API Gateway to microservices architecture shows a relatively low level of complexity. However, In this example, there is little analysis or evidence of domain-driven design and there is a significant amount of complexity as a result. - + This is exactly what happens inside a monolithic web application, an example of which is illustrated below. This was how everyone built applications when web application servers were the hot new technology. - + The result of multiple teams working on the same business domains was fragile, slow-to-change, monolithic apps. Then one magical day, Domain-Driven Design and Microservices got together and the result was highly reliable, scalable, systems that quickly could adapt to the needs of the business and its customers. Yay! - + If you followed the rules, and managed complexity not just in the system architecture but in the software development teams’ architecture, you too could do what Netflix, Amazon, and others have done. - + Amazon's two-pizza team structure gives teams low complexity, single-threaded ownership over a product or service. This means that the team is responsible for the entire customer experience and the lifecycle of the product or service. The teams are also organized around the product or service they deliver, rather than the skills they provide. - + ## The OLTP Database @@ -72,7 +72,7 @@ It’s now very clear why complexity is probably the most important aspect of co The diagram below is an ecosystem view of the context for your OLTP database choice: - + The stakeholders alone can be daunting to consider,each with their own set of requirements: @@ -88,7 +88,7 @@ The stakeholders alone can be daunting to consider,each with their own set of re But let’s start with the core requirements or capabilities - + For the dev team, the choice of database is mostly decided by the ecosystem of helpful libraries that make implementing a domain-driven design better, faster, and stronger. @@ -96,7 +96,7 @@ But when you step back just a bit, you see that the complexity nearly explodes. This side of the content equation can be particularly aggrieved when the data schema suddenly changes without prior consultation. - + ## Managing Backend Complexity @@ -136,7 +136,7 @@ Anytime you need a state change to be atomic, you need a transaction. Transactio The microservice on the left has a cache that must be consistent with the data in the database aka the [system of record](https://en.wikipedia.org/wiki/System_of_record). This means that two transactions are needed: the inner database transactions ensure the consistency and integrity of the database, while the outer ensures the overall integrity of the database and the cache. The microservice on the right has no need for a cache in their use case so only one transaction in the database is required. - + ### Architectural Principles & Design Patterns @@ -152,11 +152,11 @@ There are a few architectural principles and design patterns that can go a long - Encapsulation bundles data and the methods that operate on that data together. This keeps internal details hidden and lets you control access, promoting data integrity, modularity, and reusability of your code. - + **Loose coupling is key to managing complexity and inevitable change…** - + **and growth!** @@ -168,7 +168,7 @@ There are a few architectural principles and design patterns that can go a long - **Repository Pattern** - **Data Access Layer (DAL)** - + ***In this diagram, Raw is provided as a contrast to the actual design patterns.*** diff --git a/content/blogs/2024-03-20-kestra-airbyte.md b/src/content/blogs/2024-03-20-kestra-airbyte.md similarity index 91% rename from content/blogs/2024-03-20-kestra-airbyte.md rename to src/content/blogs/2024-03-20-kestra-airbyte.md index 5e95fca056c..affe057911d 100644 --- a/content/blogs/2024-03-20-kestra-airbyte.md +++ b/src/content/blogs/2024-03-20-kestra-airbyte.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: "smantri" -image: /blogs/2024-03-20-kestra-airbyte.jpg +image: "@assets/blogs/2024-03-20-kestra-airbyte.jpg" --- Airbyte is an open-source data integration platform designed to simplify the process of collecting, integrating, and moving data across various sources. This post demonstrates how we can integrate Airbyte using [Kestra](https://github.com/kestra-io/kestra) and perform operations on Airbyte using Kestra's Airbyte plugin. @@ -55,25 +55,25 @@ Create an S3 bucket with the name of your choice. In the bucket, create a folder On the Airbyte homepage, click on "Create your first connection". First, create the Source connection for which we will choose `MySQL`. Here, put in the appropriate DB host name, port, database, username and password. Select "Scan Changes with User Defined Cursor" option. This is how your connection settings should appear: - + Now, click on the "Set up source" button, which will first test the connection, and if the connection is successful, proceed to the next page. For the destination connection, select `S3`. You will have to provide the AWS access key, AWS secret key, bucket name, bucket region and the folder path within the bucket. For the rest of the form, you can leave the default to have the output format as `CSV: Comma-Separated Values` with no compression and no flattening. This is how your connection settings should appear: - + Now, click on "Set up destination" button, which will first test the connection to the destination, and if the connection is successful, proceed to the next page. On this page is the final connection configuration. Leave everything default. Ensure that the `employees` stream shows up in the below table, and the sync mode for the stream is `Full refresh | Overwrite`. - + Click on "Set up connection", and you are ready to go! You can test this connection right away by clicking on "Sync now" on the connection page. When the sync is successful, you can go to the S3 bucket and check the CSV file that has got created in the S3 bucket at the given folder path. You can download the CSV file, and open it to check its contents. It should have three lines similar to the image below: - + ### Setup Kestra cluster ### @@ -107,7 +107,7 @@ tasks: When you run this task, the sync operation should be invoked on the connection. The output of this task should have the job ID of the sync job as shown in the screenshot below. - + Now, let us use this job ID and check the status of this job using another Kestra flow where we will use the [CheckStatus task](/plugins/tasks/connections/io.kestra.plugin.airbyte.connections.checkstatus). @@ -127,11 +127,11 @@ tasks: The output of this flow should have the Sync job status. - + When the Sync job has succeeded, you can verify that the `Full refresh | Overwrite` actually took place by going to the S3 bucket and to the appropriate folder path. Download the newly generated CSV file, and check its contents. It should now have 5 rows and should appear as: - + This example demonstrated how we can integrate Airbyte with Kestra. Kestra can orchestrate any kind of workflow, exposing a rich UI that monitors all executions. diff --git a/content/blogs/2024-03-21-orchestrate-snowflake-with-kestra.md b/src/content/blogs/2024-03-21-orchestrate-snowflake-with-kestra.md similarity index 98% rename from content/blogs/2024-03-21-orchestrate-snowflake-with-kestra.md rename to src/content/blogs/2024-03-21-orchestrate-snowflake-with-kestra.md index 1f8b0021de8..0c4edc05151 100644 --- a/content/blogs/2024-03-21-orchestrate-snowflake-with-kestra.md +++ b/src/content/blogs/2024-03-21-orchestrate-snowflake-with-kestra.md @@ -6,7 +6,7 @@ category: Company News author: name: Emmanuel Darras image: "edarras" -image: /blogs/2024-03-21-orchestrate-snowflake-with-kestra.jpg +image: "@assets/blogs/2024-03-21-orchestrate-snowflake-with-kestra.jpg" --- Following the announcement of our [partnership with Snowflake](https://kestra.io/blogs/2023-09-25-kestra-snowflake-partnership), we've witnessed a surge in the usage of our plugin. An increasing number of companies are now leveraging Kestra to orchestrate their Snowflake data lakehouses, transforming how they manage their data at scale. This collaboration has significantly improved how data is managed at scale, offering Kestra users advanced capabilities for orchestration within Snowflake's ecosystem. @@ -39,21 +39,21 @@ fetchType: FETCH ### Simplifying Data Movement - **Downloading from Snowflake**: The plugin makes it easier to transfer data from Snowflake to an internal Kestra stage, incorporating advanced features for data compression and role-based access control to enhance the downloading process. - + Here is the snippet for downloading data: - + ```yaml id: "download" type: "io.kestra.plugin.jdbc.snowflake.Download" stageName: MYSTAGE fileName: prefix/destFile.csv - + ``` - + - **Uploading to Snowflake**: Similar to downloading, this functionality simplifies uploading data to Snowflake stages, with options for data compression and transformation that streamline the ETL process. - + Here is the snippet for uploading data: - + ```yaml yamlCopy code id: "upload" @@ -61,9 +61,9 @@ fetchType: FETCH stageName: MYSTAGE prefix: testUploadStream fileName: destFile.csv - + ``` - + ### Implementing Git Workflow for dbt with Snowflake diff --git a/content/blogs/2024-03-27-python-business-logic.md b/src/content/blogs/2024-03-27-python-business-logic.md similarity index 95% rename from content/blogs/2024-03-27-python-business-logic.md rename to src/content/blogs/2024-03-27-python-business-logic.md index abd3d91c5cb..e6dc2edb5f6 100644 --- a/content/blogs/2024-03-27-python-business-logic.md +++ b/src/content/blogs/2024-03-27-python-business-logic.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-03-27-python-business-logic.png +image: "@assets/blogs/2024-03-27-python-business-logic.png" --- ## What’s business logic anyway? @@ -75,7 +75,7 @@ That's why Python is so popular - it's easy to learn and understand, almost like In computer science, there's a trade-off between programmer friendliness and performance. Languages closer to the machine code - the ones and zeros - run faster, but they're also much harder for humans to understand and write. This is because high-level languages, which are closer to natural language, offer features and abstractions that make them easier to use, but these features can sometimes come at the cost of some speed. - + The tension in this duality is often a matter of context. Building robust software that will handle high levels of concurrency and need high availability will often be written in lower-level languages such as C++ or Java. @@ -106,17 +106,17 @@ With Kestra, we’ve built several features to allow developers to handle their For example, Kestra allows to pull of Git repositories containing a whole Python project. Then it’s easy to run Python main commands and describe the orchestration of scripts easily. - + - + We even went further by allowing to write Python scripts directly in an embedded Code editor, while connecting these scripts easily in the orchestration logic. - + - + ## Conclusion diff --git a/content/blogs/2024-04-02-dbt-kestra.md b/src/content/blogs/2024-04-02-dbt-kestra.md similarity index 99% rename from content/blogs/2024-04-02-dbt-kestra.md rename to src/content/blogs/2024-04-02-dbt-kestra.md index eae4d143a8b..5beccbc69b9 100644 --- a/content/blogs/2024-04-02-dbt-kestra.md +++ b/src/content/blogs/2024-04-02-dbt-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2024-04-02-dbt-kestra.jpg +image: "@assets/blogs/2024-04-02-dbt-kestra.jpg" --- diff --git a/content/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.md b/src/content/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.md similarity index 93% rename from content/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.md rename to src/content/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.md index 9915134c377..0b29629cc61 100644 --- a/content/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.md +++ b/src/content/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: "smantri" -image: /blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.jpg +image: "@assets/blogs/2024-04-04-top-10-cool-features-I-love-about-kestra.jpg" --- Kestra is a remarkably powerful orchestration engine. It uses a rather simple, and easy to configure declarative approach for designing workflows. This simplicity facilitates seamless adaptation to Kestra, as one does not need to be a master of any particular programming language. Anyone with clear intentions about the desired workflow can search for the corresponding plugins, and put the workflow together using the powerful YAML notation. @@ -21,13 +21,13 @@ Multiple orchestration tasks generate data, either by fetching it from external Kestra provides an extremely smart and easy to use feature of previewing these data sets. You can go to the Outputs tab, and the data sets that are downloaded to internal storage are available with Download and Preview option. The [Preview option](https://kestra.io/docs/workflow-components/outputs#outputs-preview) is one of my favorites giving me quick access to look at the output file contents. This is how the Preview of the data set looks like: - + ## 9. Editor Kestra comes with an embedded [Code editor](https://kestra.io/docs/getting-started/ui#editor). For any coding that you need to do, you need not go anywhere outside this tool. You have the well-equipped Code editor right there within Kestra itself. It also comes with the Kestra extension installed out of the box, and is flexible to also install any other extensions of your choice. This comes in very handy when you want to write scripts to be used within your orchestration flow. - + ## 8. Autocompletion @@ -35,7 +35,7 @@ When you become used to Kestra, you create the new flow and start typing out you Kestra has an elegant solution to this problem. After typing out `task: `, you can start typing out any part of the type content, like the plugin name, and you will get auto-suggestions containing what you have typed. This has saved multiple minutes of my time on a daily basis. - + ## 7. Flow-based triggers @@ -70,13 +70,13 @@ You can read more about it on this [page](/plugins/core/triggers/io.kestra.plugi Kestra has done an amazing job of achieving this with the click of a button. If you trigger this from the UI, the "backfill execution" is placed where Kestra is already aware of the context of the backfill and requires as minimum information as the time for which backfill needs to be performed. With Kestra, no data engineer will ever panic about backfilling. - + ## 5. Dashboards Kestra provides multiple dashboards, each at a different granularity, all out of the box. The global dashabord which is present as the home page of Kestra, gives an overall picture about how different workflows in Kestra are performing. The executions are available in the timeline format, highlighting any abnormal activities on the number of executions that took place. The failures are appropriately highlighted, making it difficult to miss out on them. - + Every flow and namespace (EE-specific feature) are also provided with dashboards. If you find any abnormalities in the global dashboard, you can easily dive deeper by going to the dashboards of the corresponding flow or namespace. @@ -86,7 +86,7 @@ Kestra flows can be configured to accept different types of [inputs](https://kes For many orchestration tools, it is a tedious task to provide file input, as the file either needs to be checked in to the code or uploaded to an apporopriate loaction in the file system. With Kestra's file input, you can literally choose file from any location of your machine, and provide it as an input. This makes it a piece of cake to try out the workflows with different test files. It could not be any simpler to make changes to the file and iterate the testing process. - + ## 3. Secrets @@ -96,7 +96,7 @@ Kestra just has the right solution in place. The [secrets](https://kestra.io/doc Here is an image of adding secret via the UI in EE edition: - + ## 2. Plugin defaults @@ -146,7 +146,7 @@ pluginDefaults: During the pipeline development phase, you get multiple intermediate data sets that you need to further cleanse or transform in order to achieve the desired results. It is pretty overwhelming to write the next data transformation step as part of the flow and run the complete flow in order to test out the transformation. This is where Kestra has an advanced tooling that helps you perform the data transformation on the existing outputs. It evaluates the transform expression right on the spot and provides you with a preview of the transformed results. - + With all these cool features, it is no wonder that Kestra is the new future of the orchestration industry. I would definitely recommend this tool, and would encourage you to make your hands dirty trying out this tool and its awesome features. diff --git a/content/blogs/2024-04-05-getting-started-with-kestra.md b/src/content/blogs/2024-04-05-getting-started-with-kestra.md similarity index 93% rename from content/blogs/2024-04-05-getting-started-with-kestra.md rename to src/content/blogs/2024-04-05-getting-started-with-kestra.md index faa7fc6fac7..5c778cb992d 100644 --- a/content/blogs/2024-04-05-getting-started-with-kestra.md +++ b/src/content/blogs/2024-04-05-getting-started-with-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Will Russell image: "wrussell" -image: /blogs/2024-04-05-getting-started-with-kestra.png +image: "@assets/blogs/2024-04-05-getting-started-with-kestra.png" ---@@ -24,7 +24,7 @@ Kestra is open source meaning anyone can run it on their machine for free. To ge ```bash docker run --pull=always --rm -it -p 8080:8080 --user=root \ -v /var/run/docker.sock:/var/run/docker.sock \ - -v /tmp:/tmp kestra/kestra:latest server local + -v /tmp:/tmp kestra/kestra:latest server local ``` Once you’ve run this command, head over to your browser and open [https://localhost:8080](https://localhost:8080) to launch the interface so we can start building workflows! @@ -62,7 +62,7 @@ While that might be a lot of properties to get your head around, the Kestra plat ## Building our First Flow -For our first flow, we're going to set up a simple automation that runs a Python script once every hour and sends its output to Discord as a notification. Let's start with the Python part. Firstly, we need a Python file for Kestra to execute! We’ll use something really simple that generates an output from an API request. +For our first flow, we're going to set up a simple automation that runs a Python script once every hour and sends its output to Discord as a notification. Let's start with the Python part. Firstly, we need a Python file for Kestra to execute! We’ll use something really simple that generates an output from an API request. ```python import requests @@ -87,11 +87,11 @@ tasks: We can use this as a starting point, replacing the `Log` task type with a Python one. For Python, you can either use a `Commands` or `Script` plugin. `Commands` is best for executing a separate `.py` file whereas Script is useful if you want to write your Python directly within the task. As we’ve written a `.py` file, we’ll use the Commands plugin. We can use the topology editor to add this and searching for Python. This will help us as it will give us the other fields to fill out, giving us some structure to work with! - + Now you’re probably wondering, how do I get my Python file into Kestra? We can use the Editor in the left side menu to create this file on the platform and save it in a new folder called `scripts` as `api_example.py`. On top of this, we can add the property `namespacesFiles` in our flow and set that as enabled to allow our flow to see other files. - + Once we’ve done that, we just need to make sure we install any dependencies before the script runs by using the `beforeCommands` property to create and activate a virtual environment and install the dependencies into it. One last thing: we'll need to also make a `requirements.txt` with the `requests` library inside it so this runs without any issues! @@ -116,7 +116,7 @@ tasks: On the Logs page, we can see the output from the Python execution, including with the desired output at the end. It set ups the virtual environment, installs the dependencies inside of `requirements.txt` and then executes the Python script. - + ## Using Outputs @@ -143,19 +143,19 @@ With this change made, we can add an additional task that uses this variable to Your new task should look like the following which will get out new output and print it out to the logs clearly for us to see. When we execute it, we should see it separated from all the Python logs for easier reading! - + ## Adding a Notification -Now we can take this one step further and send this output to a messaging app to notify us more easily on the number of stars, rather than digging through logs to find out the final value. For this example, we’ll use Discord but this will work with any of the Plugins in the Notifications group. +Now we can take this one step further and send this output to a messaging app to notify us more easily on the number of stars, rather than digging through logs to find out the final value. For this example, we’ll use Discord but this will work with any of the Plugins in the Notifications group. -For this example, we can use the UI to build it rather than YAML as they’ll be a lot more customisable fields. When we edit our flow, we can open a view that shows YAML on one side, and the topology view on the other giving you the best of both worlds. Underneath the `python_output` task, we can press the ➕ to add a new task and search for Discord. +For this example, we can use the UI to build it rather than YAML as they’ll be a lot more customisable fields. When we edit our flow, we can open a view that shows YAML on one side, and the topology view on the other giving you the best of both worlds. Underneath the `python_output` task, we can press the ➕ to add a new task and search for Discord. We’re going to use the `DiscordExecution` task as this lets us push a message to a webhook which will send a message to a channel. The other is useful if you want your flow to trigger based on an action inside of Discord. Now we’ve opened the `DiscordExecution` page, we’re presented with a long list of properties which can be overwhelming but we can focus on the required ones for now. - + -For our Discord message, we’ll need to give this task an `id` , as well as a Webhook URL which we can get from Discord. While nothing else is required, there’s plenty of customisation to make the message feel more polished and clearer such as adding a title and avatar. For this example, we’ll call the task `send_notification` and change the username to be *Kestra*. We can also add an Avatar by using the URL of the GitHub Organisation profile picture. +For our Discord message, we’ll need to give this task an `id` , as well as a Webhook URL which we can get from Discord. While nothing else is required, there’s plenty of customisation to make the message feel more polished and clearer such as adding a title and avatar. For this example, we’ll call the task `send_notification` and change the username to be *Kestra*. We can also add an Avatar by using the URL of the GitHub Organisation profile picture. Instead of hard coding this straight into the `avatarUrl` box, we can create an **input** to allow us to reuse this later on in case we send notifications to multiple platforms for example. Our input should look like the example below which we can put above the tasks in our flow, similar to what you would do with constants in Python. @@ -166,11 +166,11 @@ inputs: defaults: https://avatars.githubusercontent.com/u/59033362?v=4 ``` -While we’re creating inputs, we can also make our Webhook URL an input in case we want to reuse it too. Discord has a [great guide](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks) on how to generate the Webhook URL for a specific channel so all the messages are sent there. +While we’re creating inputs, we can also make our Webhook URL an input in case we want to reuse it too. Discord has a [great guide](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks) on how to generate the Webhook URL for a specific channel so all the messages are sent there. All we need to do is Edit a channel, head to Integrations and we’ll see an option for creating a Webhook. The details of the Webhook aren’t important as our flow will set these instead but we can simply call it Kestra to remind us what it's used for and press save. Once we’ve done that, we can copy the Webhook URL ready to paste into Kestra. - + Now we can easily make another input underneath the `kestra_logo` input using the same format: @@ -238,21 +238,21 @@ tasks: Let’s execute this and see the outcome! - + Our Python script is executed once the virtual environment is created and the dependencies are installed. The output of this is passed back to Kestra so it can be handed down to our next two tasks. The log outputs our variable correctly and we also see the variable in our Discord channel too with the correct title as well avatar image we defined as an input! - + ## Setting up a Trigger -Now that we have everything running, there’s one last step we need to complete this workflow: set up a trigger to execute our flow automatically! As mentioned earlier, you can set flows to execute based on an event, such as a schedule or webhook. For our example, we’re going to use a schedule to run it once every hour. +Now that we have everything running, there’s one last step we need to complete this workflow: set up a trigger to execute our flow automatically! As mentioned earlier, you can set flows to execute based on an event, such as a schedule or webhook. For our example, we’re going to use a schedule to run it once every hour. -To start with, we can use the `triggers` keyword underneath our tasks to specify our schedule. Similar to tasks, each trigger has an `id` and a `type`. With this in mind, we can call our trigger `hour_trigger` and we will want the `Schedule` type. For the `Schedule` type, we will also need to fill in a `cron` property so it knows what schedule to use. +To start with, we can use the `triggers` keyword underneath our tasks to specify our schedule. Similar to tasks, each trigger has an `id` and a `type`. With this in mind, we can call our trigger `hour_trigger` and we will want the `Schedule` type. For the `Schedule` type, we will also need to fill in a `cron` property so it knows what schedule to use. We can use [crontab.guru](https://crontab.guru) to help us figure out what the correct cron schedule expression would be to run once every hour. This tool is super helpful in visualising what the different expressions mean, as well as with a handy glossary to understand the syntax! - + This cron schedule expression will execute it at minute 0 of every hour so we can now put that into our cron property in our trigger. @@ -265,7 +265,7 @@ triggers: When we look at our topology view, we can now see our trigger has been correctly recognised. There’s no further actions needed to set up the trigger, it will work as soon as you’ve saved your flow! But it is worth noting that if you want to disable it, you can add a `disabled` property set to true so you don’t have to delete it. Helpfully, you can find all these extra properties through the topology edit view. - + With that configured, we now have our fully functioning flow that can make an API request to GitHub through our Python script, output a value from that request to the Kestra logs as well as send it as a Discord notification. And on top of that, it will automatically execute once every hour! To recap, our flow should look like this: @@ -314,6 +314,6 @@ triggers: ## What’s Next -Did you find this useful for getting started with Kestra? Let us know via [Slack](https://kestra.io/slack)! +Did you find this useful for getting started with Kestra? Let us know via [Slack](https://kestra.io/slack)! If you want to learn more about Kestra, check out our [documentation](https://kestra.io/docs) or [request a demo](https://kestra.io/demo), and if you like the project, become our next star on [GitHub](https://github.com/kestra-io/kestra). diff --git a/content/blogs/2024-04-09-aws-data-pipeline.md b/src/content/blogs/2024-04-09-aws-data-pipeline.md similarity index 96% rename from content/blogs/2024-04-09-aws-data-pipeline.md rename to src/content/blogs/2024-04-09-aws-data-pipeline.md index d9e28eab2f7..aa07a1dc7a2 100644 --- a/content/blogs/2024-04-09-aws-data-pipeline.md +++ b/src/content/blogs/2024-04-09-aws-data-pipeline.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: "smantri" -image: /blogs/2024-04-09-aws-data-pipeline.jpg +image: "@assets/blogs/2024-04-09-aws-data-pipeline.jpg" --- This blog post dives into [Kestra's](https://github.com/kestra-io/kestra) integrations for AWS, with an example of a real-world data pipeline I used in my daily work as a data engineer. The data pipeline consists of multiple AWS services, including DynamoDB, S3, and Redshift, which are orchestrated using Kestra. @@ -25,7 +25,7 @@ In the actual world, dimension data like products would be present in databases Then, we will proceed to create the data pipeline. We will load the product data from DynamoDB onto Redshift and load order data from S3 onto Redshift. We'll join these two tables from Redshift and upload the detailed orders to S3. - + ## Data preparation phase @@ -33,7 +33,7 @@ As part of the data preparation phase, we will have a Kestra flow that downloads For uploading data onto DynamoDB, we will first create the `products` table in DynamoDB. - + In order to upload the product records, we will call the PutItem task on DynamoDB for each of the product records from the products CSV file. Hence, we will have a `product_upload` flow that converts each incoming product record into JSON, and then writes the record onto DynamoDB using PutItem task. @@ -184,9 +184,9 @@ tasks: Once you execute this flow, you can check that the Redshift has `products` and `orders` tables with the corresponding data. You can use Redshift Query editor for this purpose. - + - + You can also check the detailed orders by going to the Outputs tab and using the Preview function on the `uri` attribute of the csv_writer_detailed_orders task. Also, you can check that this CSV file has been uploaded to the appropriate location in S3. diff --git a/content/blogs/2024-04-11-http-trigger.md b/src/content/blogs/2024-04-11-http-trigger.md similarity index 96% rename from content/blogs/2024-04-11-http-trigger.md rename to src/content/blogs/2024-04-11-http-trigger.md index 57d84a2609c..9fda101df05 100644 --- a/content/blogs/2024-04-11-http-trigger.md +++ b/src/content/blogs/2024-04-11-http-trigger.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-04-11-http-trigger.jpg +image: "@assets/blogs/2024-04-11-http-trigger.jpg" --- If you’re into automation you know cron schedule and file system event listening are the basics. We need to run jobs on a daily schedule and listen to new files arriving on the FTP or S3 buckets. @@ -54,7 +54,7 @@ triggers: interval: PT2M ``` - + In the above example, we have an API endpoint exposed by the service managing our warehouse facility. This endpoint allows gathering information such as stock information for certain products. @@ -124,7 +124,7 @@ triggers: ``` - + ## Setup the War Room in case of Infrastructure Urgency @@ -192,7 +192,7 @@ triggers: responseCondition: "{{ json(response.body).result.metric.value >= 0.8 }}" interval: PT5M ``` - + ## Conclusion diff --git a/content/blogs/2024-04-12-release-0-16.md b/src/content/blogs/2024-04-12-release-0-16.md similarity index 97% rename from content/blogs/2024-04-12-release-0-16.md rename to src/content/blogs/2024-04-12-release-0-16.md index 777d18d6ba5..030a9b66b89 100644 --- a/content/blogs/2024-04-12-release-0-16.md +++ b/src/content/blogs/2024-04-12-release-0-16.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: ageller -image: /blogs/2024-04-12-release-0-16.png +image: "@assets/blogs/2024-04-12-release-0-16.png" --- We're thrilled to announce Kestra 0.16.0 which adds a new way to deploy your code to various remote environments, including a.o. Kubernetes, AWS Batch, Azure Batch, and Google Batch. We also introduce flow-level retries, new tasks, and UI improvements. @@ -239,7 +239,7 @@ Big thanks to Yuri for [contributing this feature](https://github.com/kestra-io/ When you change the page size on any UI page containing a table, it will be saved and used as the default page size for all tables. This enhancement is useful when you have a large number of executions and want to see more or fewer executions per page. - + ### File and variable outputs stored immediately @@ -251,7 +251,7 @@ You will now also see the outputs of failed tasks (i.e. outputs generated up to We've improved the trigger display in the UI. Instead of only [showing the first letter](https://github.com/kestra-io/kestra/issues/2789), we now display a friendly icon for each trigger type. - + Disabled triggers are now greyed out in the topology view even when they are disabled only via an API call without changing the source code to help you identify which triggers are currently active. @@ -259,7 +259,7 @@ Disabled triggers are now greyed out in the topology view even when they are dis The new Welcome page provides a quick overview of the necessary steps to get started with Kestra. It includes links to the documentation, plugins, guided tour and to the Slack community. - + ## Plugin Enhancements @@ -308,7 +308,7 @@ We've added a (georgeous!) new cluster monitoring dashboard to the Enterprise Ed Using this dashboard, you can centrally monitor your instance health and quickly identify any issues that need attention without having to rely on any additional observability tools. - + ### New IAM roles diff --git a/content/blogs/2024-04-16-infrastructure-orchestration-using-kestra.md b/src/content/blogs/2024-04-16-infrastructure-orchestration-using-kestra.md similarity index 99% rename from content/blogs/2024-04-16-infrastructure-orchestration-using-kestra.md rename to src/content/blogs/2024-04-16-infrastructure-orchestration-using-kestra.md index 600270b3b2d..527884abeb0 100644 --- a/content/blogs/2024-04-16-infrastructure-orchestration-using-kestra.md +++ b/src/content/blogs/2024-04-16-infrastructure-orchestration-using-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: "smantri" -image: /blogs/2024-04-16-infrastructure-orchestration-using-kestra.jpg +image: "@assets/blogs/2024-04-16-infrastructure-orchestration-using-kestra.jpg" --- diff --git a/content/blogs/2024-04-18-clever-cloud-use-case.md b/src/content/blogs/2024-04-18-clever-cloud-use-case.md similarity index 97% rename from content/blogs/2024-04-18-clever-cloud-use-case.md rename to src/content/blogs/2024-04-18-clever-cloud-use-case.md index ed3aadd2e10..f54117129f2 100644 --- a/content/blogs/2024-04-18-clever-cloud-use-case.md +++ b/src/content/blogs/2024-04-18-clever-cloud-use-case.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2024-04-18-clever-cloud-use-case.jpg +image: "@assets/blogs/2024-04-18-clever-cloud-use-case.jpg" --- Clever Cloud provides a Platform as a Service solution, based in Europe. Clever Cloud exists for one purpose: helping people and companies to deliver software and services faster. Their promise is to ensure that once an app is deployed, it stays up, no matter what (high traffic, security updates, DDoS , application failure, hardware issues etc..). The PaaS helps development teams to put digital applications and services into production on a reliable infrastructure, with automatic scalability and transparent pricing. With monitoring data reaching 20TB monthly, Clever Cloud needed a robust solution to manage this influx without compromising system performance or storage efficiency. @@ -47,7 +47,7 @@ Following the compression and validation of the data, the workflow proceeds to t Lastly, the workflow includes monitoring and logging capabilities. Every operation within the workflow is logged, and performance metrics are monitored. This allows tracking of the workflow’s execution, helping to identify and rectify any deviations or anomalies. - + ## What's Next diff --git a/content/blogs/2024-04-22-liveness-heartbeat.md b/src/content/blogs/2024-04-22-liveness-heartbeat.md similarity index 97% rename from content/blogs/2024-04-22-liveness-heartbeat.md rename to src/content/blogs/2024-04-22-liveness-heartbeat.md index cb1725367a5..b03e84301c5 100644 --- a/content/blogs/2024-04-22-liveness-heartbeat.md +++ b/src/content/blogs/2024-04-22-liveness-heartbeat.md @@ -6,7 +6,7 @@ category: Engineering author: name: Florian Hussonnois image: "fhussonnois" -image: /blogs/2024-04-22-liveness-heartbeat.jpg +image: "@assets/blogs/2024-04-22-liveness-heartbeat.jpg" --- Kestra's servers use a heartbeat mechanism to periodically send their current state to the Kestra backend, indicating their liveness. That mechanism is crucial for the timely detection of server failures and for ensuring seamless continuity in workflow executions. @@ -19,7 +19,7 @@ Before delving into the details, let's take a moment to touch upon the concept o As a quick reminder, Kestra operates as a distributed platform with multiple services, each having specific responsibilities (comparable to a microservices architecture). Among these services, the two most important are the **Workers** and **Executors**. Executors oversee flow executions, deciding which tasks to run, while Workers handle the actual execution of these tasks. - + In Kestra, you can deploy as many workers and executors as you need. This not only allows you to scale your platform to handle millions of executions efficiently but also to ensure service redundancy. In fact, having multiple instances of the same service helps reduce downtime and guarantees uninterrupted workflow executions in the face of errors. Being able to deploy multiple instances of any service also reduces the risk of overloading resources as the load is distributed over more than one instance. @@ -41,7 +41,7 @@ In our initial approach, Kestra’s Workers could be considered either as `UP` o Then, the Executors are responsible for detecting missing heartbeats, acknowledging workers as dead as soon as a limit is reached, and immediately rescheduling tasks for unhealthy workers (i.e., `kestra.heartbeat.heartbeat-missed`). Finally, the worker is removed from the cluster metadata. - + If a worker is alive but unable to send a heartbeat for a short period of time (e.g., in the event of a transient network failure or saturation of the JVM's garbage collector), it will detect that it has been marked as `DEAD` or evicted and shut down automatically. @@ -64,7 +64,7 @@ Another problem was the risk of duplicate executions when a worker was considere Finally, in very rare situations, certain tasks can operate as veritable time bombs. Let's imagine that a user of your platform writes a simple Flow to download, decompress, and query a very large Parquet file. If the file turns out to be too large your worker can run out of disk space and crash. Unfortunately, the task will be rescheduled to another worker, which will eventually fail itself, creating a cascading failure. To avoid this, it might be useful to be able to isolate unstable tasks in a worker group for which tasks are not re-emit in case of failure. To resolve these limitations and offer additional functionalities, we came up with a new mechanism that would offer our users greater flexibility.. - + ## The Kestra Service’s Lifecycle @@ -72,7 +72,7 @@ The Kestra Liveness Mechanism has now been extended to all Kestra service compon The diagram below illustrates the various states in the lifecycle of each service - + First, a service always starts in the `CREATED` state before switching almost immediately to the `RUNNING` state as soon as it is operational. Then, when a service stops, it switches to the `TERMINATING` and then the `TERMINATED GRACEFULLY` states (when a worker is forced to stop, there is also the TERMINATED FORCED state). Finally, the two remaining states, `NOT_RUNNING` and `EMPTY,` are handled by Executors to finalize the service's removal from the cluster. @@ -82,7 +82,7 @@ In addition to these states, a service can be switched to the `DISCONNECTED` sta The Kestra liveness mechanism relies on heartbeat signals from the services to the Kestra’s backend. Although this approach is similar to the initial implementation, we now use a configurable `timeout` to detect client failures instead of a number of missing heartbeats. On each client, a dedicated thread, called Liveness Manager, is responsible for propagating all state transitions and the current state of services at fixed intervals. If, at any time, an invalid transition is detected, the service will automatically start to shut down gracefully (i.e., it switches to Terminating). Therefore it is not possible for a service to transition from a DISCONNECTED state to a RUNNING state. - + Next, Executors are responsible for detecting unhealthy or unresponsive services. This is handled by a dedicated thread called the Liveness Coordinator. If no status update is detected within a timeout period, the Liveness Coordinator automatically transitions the service to the `DISCONNECTED` state. In some situations, workers also have dedicated logic to proactively switch to "DISCONNECTED" mode, e.g. when they have been disconnected from the backend for too long or when updating the status is not possible. @@ -185,15 +185,15 @@ It’s up to you to find the configuration that suits your context. But, once ag To provide more visibility into the new service lifecycle and heartbeat mechanism, Kestra EE offers a Cluster Monitor dashboard, giving you all information about the uptime of your cluster services at a glance. - + The dashboard provides access to the current state of each service, as well as, to the important liveness configuration. without having to dig into your deployment configuration files. - + Moreover, users can now access the state transition history of each service, making it easier to understand the actual state of the cluster. - + ## What's Next diff --git a/content/blogs/2024-05-15-task-runners.md b/src/content/blogs/2024-05-15-task-runners.md similarity index 99% rename from content/blogs/2024-05-15-task-runners.md rename to src/content/blogs/2024-05-15-task-runners.md index f7ec1fe9c19..467af20e1d4 100644 --- a/content/blogs/2024-05-15-task-runners.md +++ b/src/content/blogs/2024-05-15-task-runners.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2024-05-15-task-runners.jpg +image: "@assets/blogs/2024-05-15-task-runners.jpg" --- Efficiently managing infrastructure is crucial for businesses striving to stay competitive. In the past, handling compute-intensive tasks has meant maintaining always-on servers, which can be both inefficient and costly. Kestra's Task Runners offer an amazing solution that dynamically compute instances in the cloud. This feature ensures that your data processing tasks receive the resources they need precisely when they need them, optimizing your workloads, reducing costs, and improving processing speed. diff --git a/content/blogs/2024-06-04-release-0-17.md b/src/content/blogs/2024-06-04-release-0-17.md similarity index 98% rename from content/blogs/2024-06-04-release-0-17.md rename to src/content/blogs/2024-06-04-release-0-17.md index d573a368d1b..5a5016a6532 100644 --- a/content/blogs/2024-06-04-release-0-17.md +++ b/src/content/blogs/2024-06-04-release-0-17.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: ageller -image: /blogs/2024-06-04-release-0-17.png +image: "@assets/blogs/2024-06-04-release-0-17.png" --- We're excited to announce Kestra 0.17.0. The highlights of this release include: @@ -275,13 +275,13 @@ Check out the new Getting Started experience in the following video demo: ### Improved Settings page The Settings page has a [new structure](https://github.com/kestra-io/kestra/issues/1947) to make it easier to navigate and find the settings you need. The settings are now grouped into **Theme Preferences**, **Date and Time Preferences** as well as the **Main Configuration** settings. - + ### New Plugin Catalog The new plugin catalog shows all plugins available in your Kestra instance. You can search for any plugin category e.g. AWS, as well as for a specific plugin subgroup e.g. S3. Once you click on a plugin, you'll be redirected to a full documentation page with all the details you need to start using it. - + --- @@ -333,7 +333,7 @@ We've refactored several core abstractions to ensure consistent and intuitive na All of these are **non-breaking changes** as we leverage **aliases** for backward compatibility. You will see a friendly warning in the UI code editor if you use the old names. - + It's worth taking a couple of minutes to rename those in your flows to future-proof your code. @@ -477,11 +477,11 @@ You can now customize the tenant dropdown with a custom logo. This is especially To upload a custom logo, go to the `Tenants` page and navigate to the Tenant for which you want to add a new icon. Click on the `Edit` button and upload the logo in the `Logo` field. - + Here is how it looks like on the Cluster Dashboard page: - + ### Allowed namespaces @@ -489,7 +489,7 @@ We've added a new feature that allows you to explicitly declare which namespaces When you navigate to any Namespace and go to the `Edit` tab, you can explicitly configure which namespaces are allowed to access it. By default, all namespaces are allowed. - + However, you can restrict that access if you want only specific namespaces (or no namespace at all) to trigger its corresponding resources. diff --git a/content/blogs/2024-06-05-gitops-superpowers.md b/src/content/blogs/2024-06-05-gitops-superpowers.md similarity index 94% rename from content/blogs/2024-06-05-gitops-superpowers.md rename to src/content/blogs/2024-06-05-gitops-superpowers.md index 372deb0aebc..ab8a7e4fbce 100644 --- a/content/blogs/2024-06-05-gitops-superpowers.md +++ b/src/content/blogs/2024-06-05-gitops-superpowers.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: "mproset" -image: /blogs/2024-06-05-gitops-superpowers.jpg +image: "@assets/blogs/2024-06-05-gitops-superpowers.jpg" --- We are excited to introduce a fully redesigned version control integration that takes your GitOps capabilities to new heights. This blog post explores how these new features can enhance productivity and collaboration. @@ -19,7 +19,7 @@ For example, when you’ve developed a new data pipeline flow, with PushFlows, y But we didn't stop there. The **SyncFlows** task automatically checks for changes in your Git branch and deploys them to your Kestra namespaces. This continuous synchronization means you no longer need to manually update your production environment. Whether you schedule it to run hourly or trigger it whenever changes are merged into a specific Git branch, SyncFlows ensures that your environments are always up-to-date and consistent. - + ### Continuous Integration with SyncFlows @@ -29,17 +29,17 @@ If you have a production environment that needs to stay updated with the latest With the ability to target specific flows or namespace files, you can ensure that only the necessary changes are committed. -If you’re working on a major feature branch and only want to push changes related to a particular flow, the **PushNamespaceFiles** task makes it easy. +If you’re working on a major feature branch and only want to push changes related to a particular flow, the **PushNamespaceFiles** task makes it easy. ## Moving From Development to Production Made Easy -By combining the **PushFlows** and **SyncFlows** tasks, you can create a comprehensive Git workflow that covers the full software development lifecycle for your workflows. +By combining the **PushFlows** and **SyncFlows** tasks, you can create a comprehensive Git workflow that covers the full software development lifecycle for your workflows. -Here is how that works: +Here is how that works: 1. You push your flows from a development environment to a Git repository -2. You then sync them to your Kestra production environment after they have been reviewed and merged into the production branch. +2. You then sync them to your Kestra production environment after they have been reviewed and merged into the production branch. - + ## Validate Before You Commit with Dry-Run Mode diff --git a/content/blogs/2024-06-13-quadis.md b/src/content/blogs/2024-06-13-quadis.md similarity index 96% rename from content/blogs/2024-06-13-quadis.md rename to src/content/blogs/2024-06-13-quadis.md index 3c9b055c548..29b353d4757 100644 --- a/content/blogs/2024-06-13-quadis.md +++ b/src/content/blogs/2024-06-13-quadis.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-06-13-quadis.png +image: "@assets/blogs/2024-06-13-quadis.png" --- [Quadis](https://www.quadis.es/) is the largest car retailer in Spain, known for its extensive network of dealerships that span the entire country. Established as a leader in the automotive sales industry, Quadis has built a reputation for excellence by providing a diverse range of vehicles from various prestigious manufacturers. With a large network of dealerships throughout Spain, Quadis offers a range of vehicles from numerous prestigious manufacturers. This diversity allows them to serve a broad spectrum of customers, from private individuals to corporate fleets. Their strategic business model focuses on customer satisfaction, advanced marketing strategies, and agility in adapting to market trends, which has not only solidified their market leadership but also facilitated their entry into the top 50 European dealership groups as ranked by the International Car Distribution Program (ICDP). @@ -54,23 +54,23 @@ Having the possibility to have “everything as code” while keeping operations Quadis teams already use a quite classic Git workflow for scripts (dev -> PR -> master) but some users are not that used to it, so it was sometimes a bottleneck. - + *Classic Git workflow for managing custom scripts at Quadis* In this advent, they like the Kestra idea of using UI and `git.Push` task to let users directly push flows from Kestra to Git. With Kestra, such workflow can be easily adjusted for each user. It keeps the possibility to apply best practices without putting pressure on the user's habits. Developers used to Git can incorporate Kestra in their daily flows. Users with a greater appetite for UI-based solutions could still stay on track and keep everything versioned and deployed through CI/CD in Azure DevOps. - + *Develop and deploy flow to git develop branch depending on the user habit* - + *Deploying flow from QA to PROD environments through CI/CD with Azure DevOps and Terraform* As we mentioned before, Quadis teams have to manage different API calls, and custom logic made in C#, Python, etc. To streamline these processes they rely on a proper Docker build and push workflow that fully integrates with Kestra. - + *Process to build and deploy Docker images to AWS ECR across environments* @@ -98,7 +98,7 @@ After onboarding the first users, they expect to have more than 30 users using K As part of a broader modernization of Quadis operation, Kestra would also be the support for the new data lake architecture. - + *Atlas - the new data platform to orchestrate data operation at Quadis* This new architecture will allow Quadis to move forward on data analytics, and internal web scraping (parse PDF, internal platform), and use more and more AWS services to optimize resources and lower the costs of its operations. diff --git a/content/blogs/2024-06-25-kestra-become-real-time.md b/src/content/blogs/2024-06-25-kestra-become-real-time.md similarity index 95% rename from content/blogs/2024-06-25-kestra-become-real-time.md rename to src/content/blogs/2024-06-25-kestra-become-real-time.md index 958fe6c8b26..5c3344967fd 100644 --- a/content/blogs/2024-06-25-kestra-become-real-time.md +++ b/src/content/blogs/2024-06-25-kestra-become-real-time.md @@ -6,10 +6,10 @@ category: Company News author: name: Emmanuel Darras image: "edarras" -image: /blogs/2024-06-25-kestra-become-real-time.jpg +image: "@assets/blogs/2024-06-25-kestra-become-real-time.jpg" --- -Today, we are thrilled to announce Kestra's Realtime Triggers, an innovative feature that sets a new standard for orchestration. This powerful feature provides everything to build and operationalize business-critical workflows in real-time, including powerful, millisecond-latency integrations with messaging systems (Kafka, Pulsar, AMQP, MQTT, AWS SQS, Google Pub/Sub, Azure Event Hubs, NATS, Redis) and SQL databases. +Today, we are thrilled to announce Kestra's Realtime Triggers, an innovative feature that sets a new standard for orchestration. This powerful feature provides everything to build and operationalize business-critical workflows in real-time, including powerful, millisecond-latency integrations with messaging systems (Kafka, Pulsar, AMQP, MQTT, AWS SQS, Google Pub/Sub, Azure Event Hubs, NATS, Redis) and SQL databases. With Realtime Triggers, you can react to events as they happen and automate any business process instantly. Additionally, Kestra simplifies the configuration and management of these workflows, making it an ideal choice for developers and business users. @@ -51,13 +51,13 @@ Coordinate complex microservice interactions in real-time with Kestra. Realtime With Kestra’s ability to consume messages from various messaging systems in real-time, software engineers can create workflows that immediately process incoming messages, reducing latency and improving the responsiveness of applications. -## Unified Batch and Real-Time Processing +## Unified Batch and Real-Time Processing -Whether you’re processing data in **batch or real-time**, Kestra provides fine-grained visibility into the health of your platform. You can batch real-time data into a staging area, like a data lake, before loading it into your data warehouse, ensuring that both real-time and batch needs are met. +Whether you’re processing data in **batch or real-time**, Kestra provides fine-grained visibility into the health of your platform. You can batch real-time data into a staging area, like a data lake, before loading it into your data warehouse, ensuring that both real-time and batch needs are met. -With Kestra, you can **lower latency** for reporting and analytics, transitioning seamlessly from batch to real-time as your needs evolve. Unlike complex orchestration systems that require extensive sensor setup and complex deployment processes, Kestra’s **intuitive design** and **simple configuration** mean you can get started in minutes. +With Kestra, you can **lower latency** for reporting and analytics, transitioning seamlessly from batch to real-time as your needs evolve. Unlike complex orchestration systems that require extensive sensor setup and complex deployment processes, Kestra’s **intuitive design** and **simple configuration** mean you can get started in minutes. - + ## Simplified Real-Time Automation for All Engineers @@ -73,7 +73,7 @@ With Kestra’s Realtime Triggers, businesses can: ## Next steps -[Get started](https://kestra.io/docs/getting-started) today and transform the way you manage your workflows. The future of orchestration is real-time, and it’s already here with Kestra. +[Get started](https://kestra.io/docs/getting-started) today and transform the way you manage your workflows. The future of orchestration is real-time, and it’s already here with Kestra. --- diff --git a/content/blogs/2024-06-27-realtime-triggers.md b/src/content/blogs/2024-06-27-realtime-triggers.md similarity index 97% rename from content/blogs/2024-06-27-realtime-triggers.md rename to src/content/blogs/2024-06-27-realtime-triggers.md index 5e432b33ec4..dd8e815b44e 100644 --- a/content/blogs/2024-06-27-realtime-triggers.md +++ b/src/content/blogs/2024-06-27-realtime-triggers.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: "smantri" -image: /blogs/2024-06-27-realtime-triggers.jpg +image: "@assets/blogs/2024-06-27-realtime-triggers.jpg" --- Kestra 0.17.0 introduced the concept of **Realtime Triggers**, which allows you to react to events instantly without polling. With this feature, Kestra triggers the execution of a flow immediately for every incoming event. This post demonstrates how you can leverage real-time triggers in a real-world scenario. @@ -83,7 +83,7 @@ In the flow, we want to enrich the order event by putting the product informatio We will insert this detailed order record in a collection in MongoDB. This is how the architecture will look like: - + ### Generating order events @@ -117,14 +117,14 @@ We will need a Cassandra cluster in which we will be putting in the product deta CREATE keyspace IF NOT EXISTS kestra WITH replication = {'class' : 'SimpleStrategy', 'replication_factor' : 1}; # Use the newly created keyspace -USE kestra; +USE kestra; # Create the `products` table CREATE TABLE kestra.products ( product_id int, - product_name text, - product_category text, - brand text, + product_name text, + product_category text, + brand text, PRIMARY KEY (product_id)); # Populate the `products` table from the csv @@ -135,7 +135,7 @@ COPY kestra.products FROM 'products.csv' WITH DELIMITER=',' AND HEADER=TRUE; Our final collection `detailed_orders` will reside in MongoDB, whose each document consists of the complete details about the order and the product corresponding to that order. For that, we will require a MongoDB, and have a database named `kestra`, under which we will create a collection named `detailed_orders`. Below is the screenshot for creating the appropriate database and collection using MongoDB Compass: - + With this, all the pre-requisites are in place, and we can move on to create the Kestra flow. diff --git a/content/blogs/2024-08-06-release-0-18.md b/src/content/blogs/2024-08-06-release-0-18.md similarity index 96% rename from content/blogs/2024-08-06-release-0-18.md rename to src/content/blogs/2024-08-06-release-0-18.md index 931c98488d3..1728471b519 100644 --- a/content/blogs/2024-08-06-release-0-18.md +++ b/src/content/blogs/2024-08-06-release-0-18.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: ageller -image: /blogs/2024-08-06-release-0-18.png +image: "@assets/blogs/2024-08-06-release-0-18.png" --- We are thrilled to announce Kestra 0.18.0, which introduces a host of enhancements to both [Open-Source](https://github.com/kestra-io/kestra) and [Enterprise Edition](https://kestra.io/enterprise). @@ -73,7 +73,7 @@ Before Kestra 0.18.0, the `Namespaces` UI page suffered from the following issue 1. That page only displayed **existing namespaces** — those explicitly created from the UI or via Terraform. Other namespaces used in flows were displayed in a greyed-out state, which led to confusion among many users. 2. The **hierarchy** of nested namespaces was missing, which made it difficult to understand the parent-child relationships between namespaces. - + The `Namespaces` page has been [fully redesigned](https://github.com/kestra-io/kestra/issues/3609) in Kestra 0.18.0 to address these issues. You will now see all namespaces used in any flow in a hierarchical structure, including nested child namespaces that can be expanded and collapsed. And we're excited to announce that this feature is now available in the open-source version as well. @@ -81,15 +81,15 @@ We have also added the `Editor` tab to the `Namespace` page, offering one more p Here is how the new `Namespaces` overview page looks like in Kestra 0.18.0 (in both Open Source and Enterprise Edition): - + Here is a detailed page for a Namespace in the Open-Source version — note how the `KV Store` is displayed as one of the Namespace-level tabs: - + And here is how the same Namespace page looks like in the Enterprise Edition: - + Check the following video demo for a deep dive into the new `Namespaces` UI: @@ -105,7 +105,7 @@ The Enterprise Edition of Kestra now supports Directory Sync Integration via SCI Our SCIM integration allows you to automate the provisioning and de-provisioning of users and groups via our SCIM API endpoint. Instead of manually creating and updating users in Kestra, you can configure a `SCIM Provisioning` integration from the IAM section in the Kestra UI, and that integration will keep your Kestra instance in sync with the latest user and group information in your IdP. - + At the time of this release, we have tested and [documented](/docs/enterprise/scim) our SCIM integration with Microsoft Entra ID, Okta, Keycloak, and authentik. If you are using a different IdP or struggle to set up SCIM with Kestra, please [reach out](/demo/). @@ -125,11 +125,11 @@ To help you set up a SQL Server backend, check our [Database Configuration Guide Our audit logs have undergone a comprehensive refactor in this release, making it easier to track changes. - + You can now filter Audit Log events created by a specific `User`. Each audit log now additionally includes information on whether a given resource has been `Created`, `Updated` or `Deleted`. When you need to dive even deeper, click on the `Changes` icon to see a JSON diff of the changes displayed in a Git-like diff format, similar to the one you can see in the flow revision history. - + We've also introduced a couple of new log events, e.g. for Tenant-level changes (_when a tenant is created, renamed, or deleted_). @@ -165,7 +165,7 @@ The `cache` section includes the following properties: Apart from the more **cost-effective handling of API calls** to secrets managers, you can now forward kestra-specific `tags` and a `description` of the secret to the external secrets manager. - + Finally, you can add a global configuration to automatically forward some `tags` to all newly created or updated secrets managed by Kestra: @@ -186,7 +186,7 @@ Based on [your feedback](https://github.com/kestra-io/kestra/issues/1528), we're The Outputs tab now displays Execution outputs in a **multi-column format** with a hierarchical structure, allowing you to **gradually expand nested outputs**. - + All existing features such as the **Outputs preview** and the ability to **render custom expressions** are still available — the only change here is that the `Render Expressions` field has been renamed to `Debug Outputs`. @@ -196,7 +196,7 @@ All existing features such as the **Outputs preview** and the ability to **rende To make Realtime Triggers more observable and easier to troubleshoot, we've extended the trigger view with logs and a restart functionality. For each Realtime Trigger, you can now dive into its logs and restart it directly from the UI when needed. - + If a `RealtimeTrigger` is misconfigured (e.g. invalid SQS or Kafka credentials), Kestra will now immediately generate a failed Execution with a friendly error message asking you to verify the trigger configuration. You can then correct the misconfigured properties and restart the trigger from the UI. @@ -210,21 +210,21 @@ The UI now provides a new view to display workflow execution **logs**. In additi 1. The exact order of logs as they were emitted during the execution 2. [Additional logs](https://github.com/kestra-io/kestra/issues/2521) not related to any specific task emitted by the Executor e.g. logs related to concurrency limits, errors in flowable or executable tasks, etc. - + The GIF below shows how you can switch between both views: - + ### Quality of life improvements All subflow executions (those created via a `Subflow` task and those created via `ForEachItem`) now [generate](https://github.com/kestra-io/kestra/issues/2481#issuecomment-2233326952) clickable links to the corresponding subflow and its execution, simplifying the navigation in parent-child workflows: - + The `Execute` modal now [additionally displays](https://github.com/kestra-io/kestra/issues/3585) a `Copy as cURL` button making it easier to trigger your execution from anywhere: - + --- @@ -332,7 +332,7 @@ Speaking of scheduling, the UI now displays CRON schedules in a human-readable f For example, instead of `0 9 * * *`, the `Flows` page will now display the trigger as `At 09:00 AM`. - + Big thanks to [Yuri](https://github.com/kestra-io/kestra/issues/4211) for contributing this powerful enhancement! @@ -346,7 +346,7 @@ Learn more in a dedicated [How-to Guide](/docs/how-to-guides/null-values). When you delete an execution from the UI, you [now have the option](https://github.com/kestra-io/kestra/issues/3987) to choose whether you also want to delete the logs, metrics and internal storage files related to that execution. Starting from Kestra 0.18.0, we now purge all execution-related data by default. This ensures that your storage space is not cluttered with logs, metrics or files for executions that no longer exist. However, you have full flexibility to choose whether you want to keep that data for specific executions. - + ### New Tasks to Manage Namespace Files diff --git a/content/blogs/2024-08-08-taskrunners-ga.md b/src/content/blogs/2024-08-08-taskrunners-ga.md similarity index 97% rename from content/blogs/2024-08-08-taskrunners-ga.md rename to src/content/blogs/2024-08-08-taskrunners-ga.md index 42a46eb814a..1f6abe48772 100644 --- a/content/blogs/2024-08-08-taskrunners-ga.md +++ b/src/content/blogs/2024-08-08-taskrunners-ga.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: ageller -image: /blogs/2024-08-08-taskrunners-ga.png +image: "@assets/blogs/2024-08-08-taskrunners-ga.png" --- We are thrilled to announce the general availability of Task Runners, a major addition to Kestra's orchestration capabilities, allowing you to offload resource-intensive tasks to on-demand compute services. Task runners guarantee that your workflows have enough resources while reducing compute costs. @@ -21,7 +21,7 @@ Many data processing tasks are computationally intensive and require a lot of re You can either build a custom plugin to run your tasks in any environment you wish, or you can use one of the **managed plugins** offered in Kestra Enterprise or Kestra Cloud, such as AWS Batch, Azure Batch, Google Batch, Google Cloud Run, or Kubernetes. - + ## From Beta to General Availability @@ -43,7 +43,7 @@ Thanks to the built-in documentation and autocompletion, building workflows with To help you get started, we've created several pre-built workflow templates. Many of them include automated deployment of IAM roles and other required Cloud services to quickly set up the Task Runner that matches your environment. The [blueprint example below](/blueprints/aws-batch-terraform-git) automates the setup of an AWS Batch environment to run multiple containerized Python scripts on AWS ECS Fargate. - + ### From development to production diff --git a/content/blogs/2024-09-18-what-is-an-orchestrator.md b/src/content/blogs/2024-09-18-what-is-an-orchestrator.md similarity index 95% rename from content/blogs/2024-09-18-what-is-an-orchestrator.md rename to src/content/blogs/2024-09-18-what-is-an-orchestrator.md index 9273c10c062..644e7d82294 100644 --- a/content/blogs/2024-09-18-what-is-an-orchestrator.md +++ b/src/content/blogs/2024-09-18-what-is-an-orchestrator.md @@ -6,7 +6,7 @@ category: Solutions author: name: Federico Trotta image: "ftrotta" -image: /blogs/2024-09-18-what-is-an-orchestrator.jpg +image: "@assets/blogs/2024-09-18-what-is-an-orchestrator.jpg" --- If you're an engineer looking to scale your automation - maybe because your company is growing rapidly — then this article is definitely for you. @@ -43,7 +43,7 @@ What's the difference between automation and orchestration? These two concepts a In essence, while automation focuses on individual tasks, orchestration ensures all those tasks are arranged and managed within a broader, cohesive system. This matters if you need to reliably handle complex processes with many interdependent steps. - + To explain the difference even further, let’s look at some practical examples. @@ -186,11 +186,11 @@ To reproduce this example, make sure you have Kestra installed. You can follow t To use Kestra for our purpose, click on **Namespaces** > **Tutorial**: - + Under **Editor**, click on **Create file** and give it a name and an extension. For example, let's call it `process_data.py`: - + Now, in **Flows** click on **Create** and fill in the YAML file as follows: @@ -229,7 +229,7 @@ errors: When you've done, click on **Execute**: you'll be asked to load the CSV file containing the data. When the job is done, in the logs section you'll see the results: - + As you can see: - The YAML is shorter and simpler than the one used for GitHub Actions. diff --git a/content/blogs/2024-09-23-kestra-raises-8m-seed.md b/src/content/blogs/2024-09-23-kestra-raises-8m-seed.md similarity index 96% rename from content/blogs/2024-09-23-kestra-raises-8m-seed.md rename to src/content/blogs/2024-09-23-kestra-raises-8m-seed.md index 5753128d0e2..481f6037d21 100644 --- a/content/blogs/2024-09-23-kestra-raises-8m-seed.md +++ b/src/content/blogs/2024-09-23-kestra-raises-8m-seed.md @@ -1,103 +1,103 @@ ---- -title: "🚀 Kestra Secures $8 Million to Simplify and Unify Orchestration for All Engineers" -description: "Enterprises worldwide trust Kestra to orchestrate workflows at any scale, and today, we are proud to announce our seed round, a testament to the strong adoption and confidence in our platform’s ability to power critical operations across industries." -date: 2024-09-23T14:00:00 -category: Company News -author: - name: Emmanuel Darras - image: "edarras" - role: "CEO & Co-Founder" -image: /blogs/2024-09-23-kestra-raises-8m-seed/funding_announcement_8M.jpg ---- - -Orchestration is at the core of the modern business infrastructure, and today, we're taking a huge step toward transforming how it's done. **We’re thrilled to announce [Kestra](https://github.com/kestra-io/kestra)'s $8 million Seed round**, led by [Alven](https://alven.co/) (Stripe, Dataiku, Qonto, Algolia) with participation from [ISAI](https://www.isai.fr/), [Axeleo](https://www.axc.vc/), and key tech leaders such as [Olivier Pomel](https://www.linkedin.com/in/olivierpomel/), [Tristan Handy](https://www.linkedin.com/in/tristanhandy), [Michel Tricot](https://www.linkedin.com/in/micheltricot/), [Clément Delangue](https://www.linkedin.com/in/clementdelangue). This funding marks the next chapter in our mission to redefine orchestration for enterprises worldwide, empowering engineers to simplify the most complex workflows at an unprecedented scale. - -This milestone wouldn’t have been possible without the trust of our growing community. Since raising $3 million in pre-seed funding last year, Kestra has surpassed every expectation: - -- We’ve expanded our use cases far beyond what we initially envisioned. -- We’ve proven our platform’s resilience across large-scale, mission-critical workloads. -- We’ve heard from countless users who confirm that Kestra delivers on its simplicity, transparency, and reliability promise. - -## A Growing Trust in Kestra - -Today, Kestra’s adoption has **skyrocketed by 10x**. Thousands of companies, from ambitious **startups to Fortune 100**, use Kestra to orchestrate their most critical workflows. This drives us to keep pushing boundaries and simplifying orchestration in ways that were previously unimaginable. - -Our $8 million Seed round is a testament to the confidence our investors have in Kestra’s future. In addition to Alven, ISAI, and Axeleo, we’re proud to be supported by an impressive lineup of private investors, including: - -- [Olivier Pomel](https://www.linkedin.com/in/olivierpomel/) (Co-founder and CEO of Datadog), -- [Tristan Handy](https://www.linkedin.com/in/tristanhandy) (Founder and CEO of dbt Labs), -- [Michel Tricot](https://www.linkedin.com/in/micheltricot/) (Co-founder and CEO of Airbyte), -- [Clément Delangue](https://www.linkedin.com/in/clementdelangue) (Co-founder and CEO of Hugging Face), -- [Bertrand Diard](https://www.linkedin.com/in/bertranddiard) (Co-founder of Talend), -- [Nicolas Dessaigne](https://www.linkedin.com/in/nicolasdessaigne/) (Co-founder of Algolia & Group Partner at Y Combinator), -- [Frédéric Plais](https://www.linkedin.com/in/fplais/) (Co-founder and CEO of Platform.sh) -- [David Perry](https://www.linkedin.com/in/david-perry-8ab707/), [John Britton](https://www.linkedin.com/in/johndbritton/), [Antoine Balliet](https://www.linkedin.com/in/antoineballiet/), [Zachary Smith](https://www.linkedin.com/in/zsmith/), [Arnaud Ferreri](https://www.linkedin.com/in/arnaudferreri/). - - -This funding enables us to accelerate our growth, expand our team, and continue delivering exceptional value to engineers and enterprises alike. - -- -- -## Why We Built Kestra: Bridging the Orchestration Gap - -Existing tools often solve specific needs—whether it's automating data pipelines, managing IT tasks, or coordinating business processes—but they **tend to operate in silos**. These siloed solutions introduce complexity, demand specialized skills, and ultimately create unnecessary risks, where what’s needed is efficiency, transparency, and reliability. - -At Kestra, we recognized this gap and set out to build a **unified orchestration platform** that simplifies workflows across any infrastructure, cloud, or application. Our vision was to create an orchestration tool that engineers love to use, **one that breaks down barriers** and scales seamlessly. - -## Simplifying Complexity, Elevating Workflows - -Kestra is designed to simplify complexity. With a **declarative**, **language-agnostic** framework, an **API-first** approach, and our **Everything as Code and from the UI or following GitOps** philosophy, Kestra is intuitive yet incredibly powerful. It’s a platform engineers can adopt quickly, customize extensively, and rely on for any workflow, no matter how complex. - -> _"Kestra has been essential in designing complex execution flows while enhancing our Infrastructure-as-Code best practices."_, Gorgias. - -## A Platform Without Limits - -Kestra isn’t just another orchestration tool. It’s a platform built to handle workflows of **any type, across any domain**. Whether it’s automating infrastructure, transforming and transporting data, coordinating microservices, or real-time network monitoring, Kestra’s flexibility and extensibility make it a trusted solution for a wide range of challenges. - - -And we’re not stopping there. We continue to expand Kestra’s capabilities with new features and integrations, constantly **pushing the boundaries** of what’s possible. - -## Built on the Power of Open Source - -At the heart of Kestra’s success is our **global open-source community**. We empower engineers to easily adopt and integrate Kestra into their workflows by embracing open-source principles. This openness accelerates innovation, fosters collaboration, and ensures that Kestra is continuously improving based on **real-world needs**. It’s why thousands of production environments around the world depend on Kestra to power their **most critical workflows**. - - - -## Scaling Beyond Limits: Orchestrating the Future - -In just one year, Kestra has grown by 10x, and today, hundreds of millions of workflows are powered by our platform. We’ve become the **orchestration layer of choice** for software engineers, DevOps experts, and IT leaders across the tech landscape. - -Kestra enables users to **orchestrate workflows in under 5 minutes** through: - -- **Seamless workflow design**: Easily build workflows through our intuitive UI or directly within your favorite IDE. -- **500+ integrations**: Connect with major technologies incl. AWS, GCP, Azure, Terraform, Docker, GitHub, Kafka, Postgres, Redis, MongoDB, SQL Server, Databricks, Snowflake, dbt, Airbyte, and many more. -- **Deploy anywhere**: Run Kestra on any cloud (AWS, Azure, GCP), on-premises, or even on your laptop using Docker. - - -> _"Kestra is the unifying layer for our data and workflows. You can start small, but scale without limits."_, Leroy Merlin. - -# Resilient Orchestration at Scale for Critical Workflows - -As organizations grow, so do their orchestration needs. For businesses managing mission-critical workflows, Kestra elevates its capabilities to meet these demands. - -Building on Kestra’s core strengths, we offer enhanced **security**, **governance**, and **monitoring** to support **large-scale**, **business-critical** operations. It also ensures real-time performance and seamless integration with features like SSO, CI/CD pipelines, and secret managers. - -With Kestra, organizations gain the **reliability** required to scale their workflows confidently, no matter the complexity or size of their operations. - - -*Orchestrating with Kestra Enterprise: Trusted by Industry Leaders for Mission-Critical Workflows.* - -## Looking Ahead: Innovating and Expanding - -With this second $8 million funding round, we’re excited to enter **the next phase of Kestra's growth**. Our commitment to continuous improvement drives us to expand the platform’s capabilities — enhancing our ecosystem with more third-party integrations, simplifying plugin management, and improving the orchestration experience for all engineers. - - -We’re planning to **expand into the U.S.** to better support our North American clients, bringing us closer to them for improved collaboration and service. Meanwhile, **we’re growing our team across Europe and North America**, hiring key roles such as Software Engineers, DevOps, Architects, Solution Engineers, GTMs, and Marketing professionals. - -Most importantly, we know that **Kestra’s success is driven by the talented and dedicated people** behind the platform. **Thank you Team ❤️**, your commitment to **pushing the boundaries of orchestration** is what sets us apart, and we look forward to growing this exceptional group to take on the challenges ahead. - -**Thank you to our users, customers, and investors** for driving Kestra forward in our mission to transform orchestration. **Help us build the leading platform for Unified Orchestration** by [starring us on GitHub](https://go.kestra.io/github-fundraise) and joining this exciting journey. - -**Orchestrate Everything, Everywhere, All at Once** +--- +title: "🚀 Kestra Secures $8 Million to Simplify and Unify Orchestration for All Engineers" +description: "Enterprises worldwide trust Kestra to orchestrate workflows at any scale, and today, we are proud to announce our seed round, a testament to the strong adoption and confidence in our platform’s ability to power critical operations across industries." +date: 2024-09-23T14:00:00 +category: Company News +author: + name: Emmanuel Darras + image: "edarras" + role: "CEO & Co-Founder" +image: "@assets/blogs/2024-09-23-kestra-raises-8m-seed/funding_announcement_8M.jpg" +--- + +Orchestration is at the core of the modern business infrastructure, and today, we're taking a huge step toward transforming how it's done. **We’re thrilled to announce [Kestra](https://github.com/kestra-io/kestra)'s $8 million Seed round**, led by [Alven](https://alven.co/) (Stripe, Dataiku, Qonto, Algolia) with participation from [ISAI](https://www.isai.fr/), [Axeleo](https://www.axc.vc/), and key tech leaders such as [Olivier Pomel](https://www.linkedin.com/in/olivierpomel/), [Tristan Handy](https://www.linkedin.com/in/tristanhandy), [Michel Tricot](https://www.linkedin.com/in/micheltricot/), [Clément Delangue](https://www.linkedin.com/in/clementdelangue). This funding marks the next chapter in our mission to redefine orchestration for enterprises worldwide, empowering engineers to simplify the most complex workflows at an unprecedented scale. + +This milestone wouldn’t have been possible without the trust of our growing community. Since raising $3 million in pre-seed funding last year, Kestra has surpassed every expectation: + +- We’ve expanded our use cases far beyond what we initially envisioned. +- We’ve proven our platform’s resilience across large-scale, mission-critical workloads. +- We’ve heard from countless users who confirm that Kestra delivers on its simplicity, transparency, and reliability promise. + +## A Growing Trust in Kestra + +Today, Kestra’s adoption has **skyrocketed by 10x**. Thousands of companies, from ambitious **startups to Fortune 100**, use Kestra to orchestrate their most critical workflows. This drives us to keep pushing boundaries and simplifying orchestration in ways that were previously unimaginable. + +Our $8 million Seed round is a testament to the confidence our investors have in Kestra’s future. In addition to Alven, ISAI, and Axeleo, we’re proud to be supported by an impressive lineup of private investors, including: + +- [Olivier Pomel](https://www.linkedin.com/in/olivierpomel/) (Co-founder and CEO of Datadog), +- [Tristan Handy](https://www.linkedin.com/in/tristanhandy) (Founder and CEO of dbt Labs), +- [Michel Tricot](https://www.linkedin.com/in/micheltricot/) (Co-founder and CEO of Airbyte), +- [Clément Delangue](https://www.linkedin.com/in/clementdelangue) (Co-founder and CEO of Hugging Face), +- [Bertrand Diard](https://www.linkedin.com/in/bertranddiard) (Co-founder of Talend), +- [Nicolas Dessaigne](https://www.linkedin.com/in/nicolasdessaigne/) (Co-founder of Algolia & Group Partner at Y Combinator), +- [Frédéric Plais](https://www.linkedin.com/in/fplais/) (Co-founder and CEO of Platform.sh) +- [David Perry](https://www.linkedin.com/in/david-perry-8ab707/), [John Britton](https://www.linkedin.com/in/johndbritton/), [Antoine Balliet](https://www.linkedin.com/in/antoineballiet/), [Zachary Smith](https://www.linkedin.com/in/zsmith/), [Arnaud Ferreri](https://www.linkedin.com/in/arnaudferreri/). + + +This funding enables us to accelerate our growth, expand our team, and continue delivering exceptional value to engineers and enterprises alike. + ++ ++ +## Why We Built Kestra: Bridging the Orchestration Gap + +Existing tools often solve specific needs—whether it's automating data pipelines, managing IT tasks, or coordinating business processes—but they **tend to operate in silos**. These siloed solutions introduce complexity, demand specialized skills, and ultimately create unnecessary risks, where what’s needed is efficiency, transparency, and reliability. + +At Kestra, we recognized this gap and set out to build a **unified orchestration platform** that simplifies workflows across any infrastructure, cloud, or application. Our vision was to create an orchestration tool that engineers love to use, **one that breaks down barriers** and scales seamlessly. + +## Simplifying Complexity, Elevating Workflows + +Kestra is designed to simplify complexity. With a **declarative**, **language-agnostic** framework, an **API-first** approach, and our **Everything as Code and from the UI or following GitOps** philosophy, Kestra is intuitive yet incredibly powerful. It’s a platform engineers can adopt quickly, customize extensively, and rely on for any workflow, no matter how complex. + +> _"Kestra has been essential in designing complex execution flows while enhancing our Infrastructure-as-Code best practices."_, Gorgias. + +## A Platform Without Limits + +Kestra isn’t just another orchestration tool. It’s a platform built to handle workflows of **any type, across any domain**. Whether it’s automating infrastructure, transforming and transporting data, coordinating microservices, or real-time network monitoring, Kestra’s flexibility and extensibility make it a trusted solution for a wide range of challenges. + + +And we’re not stopping there. We continue to expand Kestra’s capabilities with new features and integrations, constantly **pushing the boundaries** of what’s possible. + +## Built on the Power of Open Source + +At the heart of Kestra’s success is our **global open-source community**. We empower engineers to easily adopt and integrate Kestra into their workflows by embracing open-source principles. This openness accelerates innovation, fosters collaboration, and ensures that Kestra is continuously improving based on **real-world needs**. It’s why thousands of production environments around the world depend on Kestra to power their **most critical workflows**. + + + +## Scaling Beyond Limits: Orchestrating the Future + +In just one year, Kestra has grown by 10x, and today, hundreds of millions of workflows are powered by our platform. We’ve become the **orchestration layer of choice** for software engineers, DevOps experts, and IT leaders across the tech landscape. + +Kestra enables users to **orchestrate workflows in under 5 minutes** through: + +- **Seamless workflow design**: Easily build workflows through our intuitive UI or directly within your favorite IDE. +- **500+ integrations**: Connect with major technologies incl. AWS, GCP, Azure, Terraform, Docker, GitHub, Kafka, Postgres, Redis, MongoDB, SQL Server, Databricks, Snowflake, dbt, Airbyte, and many more. +- **Deploy anywhere**: Run Kestra on any cloud (AWS, Azure, GCP), on-premises, or even on your laptop using Docker. + + +> _"Kestra is the unifying layer for our data and workflows. You can start small, but scale without limits."_, Leroy Merlin. + +# Resilient Orchestration at Scale for Critical Workflows + +As organizations grow, so do their orchestration needs. For businesses managing mission-critical workflows, Kestra elevates its capabilities to meet these demands. + +Building on Kestra’s core strengths, we offer enhanced **security**, **governance**, and **monitoring** to support **large-scale**, **business-critical** operations. It also ensures real-time performance and seamless integration with features like SSO, CI/CD pipelines, and secret managers. + +With Kestra, organizations gain the **reliability** required to scale their workflows confidently, no matter the complexity or size of their operations. + + +*Orchestrating with Kestra Enterprise: Trusted by Industry Leaders for Mission-Critical Workflows.* + +## Looking Ahead: Innovating and Expanding + +With this second $8 million funding round, we’re excited to enter **the next phase of Kestra's growth**. Our commitment to continuous improvement drives us to expand the platform’s capabilities — enhancing our ecosystem with more third-party integrations, simplifying plugin management, and improving the orchestration experience for all engineers. + + +We’re planning to **expand into the U.S.** to better support our North American clients, bringing us closer to them for improved collaboration and service. Meanwhile, **we’re growing our team across Europe and North America**, hiring key roles such as Software Engineers, DevOps, Architects, Solution Engineers, GTMs, and Marketing professionals. + +Most importantly, we know that **Kestra’s success is driven by the talented and dedicated people** behind the platform. **Thank you Team ❤️**, your commitment to **pushing the boundaries of orchestration** is what sets us apart, and we look forward to growing this exceptional group to take on the challenges ahead. + +**Thank you to our users, customers, and investors** for driving Kestra forward in our mission to transform orchestration. **Help us build the leading platform for Unified Orchestration** by [starring us on GitHub](https://go.kestra.io/github-fundraise) and joining this exciting journey. + +**Orchestrate Everything, Everywhere, All at Once** diff --git a/content/blogs/2024-09-25-our-open-source-choices.md b/src/content/blogs/2024-09-25-our-open-source-choices.md similarity index 98% rename from content/blogs/2024-09-25-our-open-source-choices.md rename to src/content/blogs/2024-09-25-our-open-source-choices.md index 401f230a6dc..dbc08deb9ac 100644 --- a/content/blogs/2024-09-25-our-open-source-choices.md +++ b/src/content/blogs/2024-09-25-our-open-source-choices.md @@ -7,7 +7,7 @@ author: name: Ludovic Dehon image: "ldehon" role: "CTO & Co-Founder" -image: /blogs/2024-09-25-our-open-source-choices.jpg +image: "@assets/blogs/2024-09-25-our-open-source-choices.jpg" --- Kestra was originally created as part of my consulting project for Leroy Merlin France. The client faced multiple challenges when adopting another data orchestration product — that platform didn't scale for their use cases, led to complex Python dependency management, and introduced a barrier to entry for BI engineers proficient in SQL and YAML. Kestra was born to address these issues and was [open-sourced](https://github.com/kestra-io/kestra) under Apache 2.0 license. @@ -46,7 +46,7 @@ The key was delivering on enterprise needs: **security** (think SSO, RBAC, SCIM, ## **On Making Technical Decisions** - + ### **Engineering vs. UX: Finding the Right Balance** diff --git a/content/blogs/2024-09-25-the-story-behind-our-seed.md b/src/content/blogs/2024-09-25-the-story-behind-our-seed.md similarity index 94% rename from content/blogs/2024-09-25-the-story-behind-our-seed.md rename to src/content/blogs/2024-09-25-the-story-behind-our-seed.md index a0b9e61a0ef..4d252dc58b5 100644 --- a/content/blogs/2024-09-25-the-story-behind-our-seed.md +++ b/src/content/blogs/2024-09-25-the-story-behind-our-seed.md @@ -7,7 +7,7 @@ author: name: Emmanuel Darras image: "edarras" role: "CEO & Co-Founder" -image: /blogs/2024-09-25-the-story-behind-our-seed.jpg +image: "@assets/blogs/2024-09-25-the-story-behind-our-seed.jpg" --- Discover the story behind our $8M seed funding with some CEO/founders of dbt Labs, Datadog, Airbyte, Hugging Face, Algolia, Talend,Platform.sh and some VCs (Alven, ISAI, Axeleo). Learn how we framed our vision, addressed key challenges in orchestration, and built a compelling pitch that secured investor confidence in the future of unified orchestration. @@ -22,7 +22,7 @@ Today, **we're sharing the deck that helped us raise $8M in seed funding**—th ### Framing the Problem: Why Orchestration Matters - + We started by asking a fundamental question: **Why build a company around orchestration?** @@ -34,7 +34,7 @@ This narrative allowed us to connect the dots between the complexity that busine ### The Pain Points We Address - + Here we talk about the specific problems we aim to solve. It’s no secret that **existing tools are either too rigid or require a high degree of technical knowledge to get started**. This results in bottlenecks, inefficiencies, and shadow IT, where non-engineering users default to **spreadsheets, GitHub Actions, and no-code automation tools** to orchestrate their internal processes—all of which are not visible to the central IT teams. @@ -44,7 +44,7 @@ It was therefore essential for us to explain that **Kestra is different**. We ar ### Positioning Ourselves in the Market - + In the early stages of building Kestra, we noticed the need for a simpler and unified automation platform that can combine **workflows as code and low-code automation**. Most tools fell into one of two categories—either code-based, requiring significant technical expertise, or UI-based drag-and-drop tools with limited flexibility. **Kestra offers both a UI and code-based workflow builder** and an Everything as Code approach. @@ -54,7 +54,7 @@ This hybrid approach became one of our most compelling selling points. We are cr ### Our Unique Advantages: More Than Yet Another Automation Tool - + We had to show the **unique advantages of Kestra**. This section of our deck was designed to leave no room for doubt about our value. We focused on three core ideas: @@ -68,7 +68,7 @@ Each point reflected our belief that **Kestra wasn’t just a solution for today ### Building Community and Platform-Led Growth - + The most critical aspect of any open-source project is **adoption**. When we introduced Kestra, we aimed to ensure it wasn’t a top-down tool imposed on engineering teams. Instead, we wanted it to thrive in an open-source environment, where everyone could benefit, contribute, build plugins, and integrate their own systems. diff --git a/content/blogs/2024-10-03-conditional-inputs.md b/src/content/blogs/2024-10-03-conditional-inputs.md similarity index 97% rename from content/blogs/2024-10-03-conditional-inputs.md rename to src/content/blogs/2024-10-03-conditional-inputs.md index 0fa0e94e1b6..6895e44cd46 100644 --- a/content/blogs/2024-10-03-conditional-inputs.md +++ b/src/content/blogs/2024-10-03-conditional-inputs.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset role: image: mproset -image: /blogs/2024-10-03-conditional-inputs.jpg +image: "@assets/blogs/2024-10-03-conditional-inputs.jpg" --- We often encounter workflows where a single set of static inputs just won’t cut it. You need something more flexible, something that reacts to previous selections and adapts on the fly. This is exactly what Conditional **inputs** in Kestra enable you to do. @@ -45,7 +45,7 @@ In this example, the `cloud` input asks the user to select a cloud provider, and ### Beyond Cloud Providers - + While cloud orchestration is an obvious use case, dynamic inputs can apply to a variety of scenarios. For instance, in **access control workflows**, different permission levels might need to be displayed based on the user's role. Similarly, in **approval workflows**, different fields could appear depending on who is approving the request—a manager might see budget approval options, while a team lead might not. diff --git a/content/blogs/2024-10-08-dbt-kestra.md b/src/content/blogs/2024-10-08-dbt-kestra.md similarity index 97% rename from content/blogs/2024-10-08-dbt-kestra.md rename to src/content/blogs/2024-10-08-dbt-kestra.md index ae61297e680..d810aed2d4d 100644 --- a/content/blogs/2024-10-08-dbt-kestra.md +++ b/src/content/blogs/2024-10-08-dbt-kestra.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset role: image: mproset -image: /blogs/2024-10-08-dbt-kestra.jpg +image: "@assets/blogs/2024-10-08-dbt-kestra.jpg" --- When using dbt, you often need tools that can handle large, complex workflows and automate tasks across different environments. At Kestra, we’ve built a suite of features to manage dbt projects in the best way possible, from syncing code with Git, scaling your dbt workflows on-demand with [Task Runners](https://kestra.io/docs/task-runners) to flexible code management using [Namespace Files](https://kestra.io/docs/concepts/namespace-files). Here’s how Kestra can simplify your dbt workflows and make data transformation more scalable. @@ -101,7 +101,7 @@ This configuration allows you to allocate CPU and memory resources dynamically, ## Manage your dbt code with Namespace Files - + With the `UploadFiles`, `DownloadFiles`, and `DeleteFiles` tasks, Kestra lets you manage namespace files more flexibly. For example, `DownloadFiles` allows you to pull namespace files from one project into another, making it easy to share code across projects and teams. @@ -125,7 +125,7 @@ This flexibility allows you to easily share code, manage updates, and ensure tha ## Manage dbt Execution Logs in Large-Scale dbt Projects - + Managing a dbt project with hundreds of models means handling a significant amount of log data. Kestra provides enhanced logging options that make it easy to filter by log level and navigate the information you need. This feature is especially helpful for pinpointing issues in large projects, allowing you to identify and address errors more quickly. diff --git a/content/blogs/2024-10-15-deploying-kestra-in-clever-cloud.md b/src/content/blogs/2024-10-15-deploying-kestra-in-clever-cloud.md similarity index 84% rename from content/blogs/2024-10-15-deploying-kestra-in-clever-cloud.md rename to src/content/blogs/2024-10-15-deploying-kestra-in-clever-cloud.md index 296fdbeede1..abd2aef3860 100644 --- a/content/blogs/2024-10-15-deploying-kestra-in-clever-cloud.md +++ b/src/content/blogs/2024-10-15-deploying-kestra-in-clever-cloud.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu role: Lead Software Engineer image: lmathieu -image: /blogs/2024-10-15-deploying-kestra-in-clever-cloud.jpg +image: "@assets/blogs/2024-10-15-deploying-kestra-in-clever-cloud.jpg" --- [Clever Cloud](https://www.clever-cloud.com/) is a Platform as a Service provider that uses Kestra itself. @@ -21,7 +21,7 @@ To deploy Kestra on Clever Cloud we used their CLI tool: [Clever Tools](https:// Clever Cloud offers managed S3 compatible object storages (Cellar), managed PostgreSQL databases, and managed Docker applications. We will use these three services to deploy Kestra. - + ## Creating a Docker image @@ -44,11 +44,11 @@ On the Clever Cloud console, click on **CREATE**, select **an application**, **C By default, Clever Cloud selects the **XS** instance type with 1 CPU and 1 GB of RAM. As we will start Kestra in an all-in-one process (the standalone server), it's better to choose the **S** instance type with 2 CPU and 2GB of RAM. So click on **Edit** and select **S**. - + Select **NEXT**, then set the application name and the location. Here we will name our application `kestra-clever` and deploy it in the France region. - + Once you select **Finish**, you'll arrive to the add-ons page. We will create these later so we can select **I don't need any add-ons**. @@ -110,29 +110,29 @@ kestra: 4. We set the URL of Kestra to the URL of the application, by default, this will be `${APP_ID}.cleverapps.io` where `APP_ID` is an environment variable injected by Clever Cloud with the identifier of your application. 5. As the Docker engine is not accessible from the Kestra container, we configure globally the `Process` [task runner](../docs/task-runners/index.md) for all plugins using [Plugins Default](../docs/04.workflow-components/09.plugin-defaults.md). - + Remember to select **UPDATE CHANGES** before selecting **NEXT** to save your changes. You will arrive at a page which explains how to deploy a Docker application via git push. Follow the instructions on this page and push your Git branch to Clever Cloud. - + After a few seconds, the console will detect the push and switch to the logs of the deployment. As we're missing the necessary services, you can abort the deployment. - + ## Creating a Cellar bucket On the Clever Cloud console, select **CREATE**, then select **an add-on** then pick **Cellar S3 storage**. - + There is only one plan available, so select **NEXT**, then select **LINK** in front of the `kestra-clever` to link the add-on to the application. Linking the add-on will inject environment variables to the linked application with the connection URL and credentials so it can be easily configured without needed to hardcode them. This is a very nice feature 😉. - + Select **NEXT**, then fill in the name of the Cellar bucket and change the location if required. In our example, we created a bucket named `kestra-clever` in the Paris region. - + After that, the console will display the Key ID and Key Secret to connect to the bucket, we will need them later, but you don't need to copy them as we link the service to the application, so they will be injected. @@ -140,19 +140,19 @@ After that, the console will display the Key ID and Key Secret to connect to the On the Clever Cloud console, select **CREATE**, and **an add-on** then pick **PostgreSQL**. - + Select your plan, here I select **XXS Small Space** as it's a demo environment, but for a production environment you may choose a plan with more capacity. Select **NEXT**, then select **LINK** in front of the `kestra-clever` to link the add-on to the application. - + Select **NEXT**, then fill in the name of the PostgreSQL instance and change the version and location if required. In our example, we created a PostgreSQL v15 instance named `kestra-clever` in the Paris region. - + Next, the console asks if encryption at rest should be enabled, the default is disabled, depending on your security needs you may want to enable it. Click on **Confirm Options**. - + After that, the console will display the Host name, database name and authentication information to connect to PostgreSQL, we will need them later, but you don't need to copy them as we link the service to the application, so they will be injected. @@ -168,7 +168,7 @@ You can also go to the **Logs** page to see the deployment logs and the Kestra s 2024-09-18 14:17:52,678 INFO standalone io.kestra.cli.AbstractCommand Server Running: http://453ec0e8-093f-44df-bb00-c682573bc61f:8080, Management server on port http://453ec0e8-093f-44df-bb00-c682573bc61f:8081/health ``` - + Select the link in the top right corner, Kestra should open in a new browser with a login popup! diff --git a/content/blogs/2024-10-15-huggin-face-kestra-http.md b/src/content/blogs/2024-10-15-huggin-face-kestra-http.md similarity index 99% rename from content/blogs/2024-10-15-huggin-face-kestra-http.md rename to src/content/blogs/2024-10-15-huggin-face-kestra-http.md index 420c5cdc77d..bd702c727fd 100644 --- a/content/blogs/2024-10-15-huggin-face-kestra-http.md +++ b/src/content/blogs/2024-10-15-huggin-face-kestra-http.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset role: image: mproset -image: /blogs/2024-10-15-huggin-face-kestra-http.jpg +image: "@assets/blogs/2024-10-15-huggin-face-kestra-http.jpg" --- AI integration doesn’t have to be complicated. Kestra lets you connect to Hugging Face models quickly with just a few HTTP requests. Need to analyze the sentiment of customer reviews? Or perhaps classify large datasets? With Hugging Face’s extensive API library, you have access to hundreds of models capable of handling these tasks. diff --git a/content/blogs/2024-10-17-cd-cd-kestra-comparison.md b/src/content/blogs/2024-10-17-cd-cd-kestra-comparison.md similarity index 96% rename from content/blogs/2024-10-17-cd-cd-kestra-comparison.md rename to src/content/blogs/2024-10-17-cd-cd-kestra-comparison.md index 1367623fb65..687b093d8db 100644 --- a/content/blogs/2024-10-17-cd-cd-kestra-comparison.md +++ b/src/content/blogs/2024-10-17-cd-cd-kestra-comparison.md @@ -1,217 +1,217 @@ ---- -title: "Kestra vs. Popular CI/CD Tools: When to Choose an Orchestration Solution" -description: "Learn when to to choose an orchestrator rather than a CI/CD solution" -date: 2024-10-17T15:00:00 -category: Solutions -author: - name: Federico Trotta - image: "ftrotta" -image: /blogs/2024-10-17-ci-cd-kestra-comparison.jpg ---- - -In a recent [blog post](./2024-09-18-what-is-an-orchestrator.md), we defined what an orchestrator is, the differences between orchestration and automation, and how orchestration can help you to automate your workflows. - -Now, it's time to answer the question: when should you choose an orchestrator over a CI/CD solution? Both have overlapping functionality so how do you decide which one is best for your job? - -In this article, we'll explore what CI/CD tools are, dive into some of the most popular ones, and look at what Kestra brings to the table. In particular, we'll also provide a deeper comparison between Kestra and Jenkins. - -## What Are CI/CD Tools? -Before comparing CI/CD tools, let's first define what is a CI/CD tool. - -CI/CD tools are software applications that automate the processes of integrating code changes (Continuous Integration) and deploying applications (Continuous Deployment) to production environments. They help teams collaborate effectively by automating builds, tests, and deployments, ensuring that new features and bug fixes are delivered quickly and reliably. - -By automating these steps, CI/CD tools reduce the reliance on manual intervention, which not only accelerates the development cycle but also minimizes the potential for human error. Automation, in fact, ensures that deployments are consistent and repeatable, eliminating mistakes that can occur when developers have to remember and execute complex sequences manually. - -In particular, CI/CD tools are designed to: - -- **Automate builds**: Compile source code into executable programs, saving developers time and minimizing manual errors. -- **Run tests**: Execute automated tests to verify that code changes work as intended and don't introduce new bugs, providing early feedback and maintaining code quality. -- **Deploy applications**: Automatically release new code to production or staging environments, allowing teams to ship features faster and with fewer manual interventions. -- **Provide feedback**: Alert developers about build statuses and test results, helping them identify and address issues as soon as possible. - -These tools are fundamental for maintaining high-quality code and rapid release cycles in today's fast-paced development environments. By removing manual steps and standardizing workflows, they enhance reliability and reduce the chance of errors slipping into production. So, without them, teams would struggle to keep up with the demand for frequent updates, making it much harder to maintain a competitive edge. - -## Most Used CI/CD Tools -There are a lot of CI/CD tools out there, so let's take a closer look at some of the most popular ones. For each, we'll provide an overview, highlight a unique feature, and list pros and cons. - -### GitHub Actions -[GitHub Actions](https://github.com/features/actions) is GitHub's integrated CI/CD solution, allowing you to automate your workflows directly from your GitHub repository. It enables you to build, test, and deploy your code right alongside your pull requests and issues, providing a seamless experience for developers. - -Also, by integrating tightly with GitHub, it reduces context switching, allowing teams to manage their entire CI/CD pipelines within a single interface; this makes GitHub Actions particularly attractive for teams that want to quickly implement automation without having to leave their existing GitHub environment. - - - -**Unique feature: deep integration with the GitHub ecosystem** -GitHub Actions offers seamless integration with the entire GitHub platform, letting you trigger workflows based on any GitHub event—like pull requests, issues, or commits. This makes it an excellent choice for projects already using GitHub, as it provides a highly streamlined experience. - -**Pros**: -- **Ease of use**: Simple setup within your GitHub repository, which means minimal configuration. -- **Marketplace for Actions**: Access to a vast library of pre-built actions, which can save you a lot of time.. -- **Cost-effective**: Generous free tier for public repositories, making it accessible for open-source projects. - -**Cons**: -- **Limited to GitHub-hosted repositories**: While GitHub Actions integrates seamlessly with projects fully hosted on GitHub, it becomes challenging if your codebase spans multiple platforms or includes on-premises repositories. Teams managing repositories across different environments may find it difficult to integrate these external systems, as GitHub Actions is tightly coupled with the GitHub ecosystem. -- **Workflow edits require commits**: Updating workflows necessitates committing changes to the repository, which mixes the codebase and the CI/CD configurations in the commit history. This can clutter your commit log and make it harder to maintain a clean and organized repository, as code changes and workflow updates are intertwined. -- **Resource limits**: Concurrency and job time limits on the free tier can slow down larger projects. -- **Less control over environment**: Less flexibility in customizing the execution environment compared to other CI/CD tols, which can be a limitation for teams needing specific configurations. -- **Complexity with advanced workflows**: Setting up more sophisticated workflows can become complicated, requiring significant experience with the tool. - -### GitLab CI/CD -[GitLab CI/CD](https://docs.gitlab.com/ee/ci/index.html) is an integral part of GitLab, providing a seamless experience from code commit to deployment. It offers robust features for automating the entire DevOps lifecycle within a single application, including source control, continuous integration, testing, and deployment. By providing a comprehensive DevOps solution, GitLab CI/CD ensures that teams can collaborate effectively, track progress, and maintain high levels of code quality, all without needing to switch between multiple tools. - -This integrated approach reduces the friction typically associated with using diverse systems, making GitLab CI/CD a powerful option for teams seeking a streamlined and efficient workflow. Additionally, GitLab's focus on security with built-in features - such as vulnerability scanning and compliance management - strengthens its appeal for enterprises looking for a secure, all-in-one solution. - - - -**Unique feature: all-in-one DevOps platform** -GitLab CI/CD combines source control, CI/CD, project management, and deployment automation in one place, streamlining collaboration, efficiency, and simplifying the overall development lifecycle. With everything under one roof, there's no need to manage multiple tools, which can greatly reduce operational overhead. - -**Pros**: -- **Powerful pipelines**: Supports complex workflows with stages and dependencies, which is ideal for projects requiring detailed control over the build process. -- **Built-in security**: Provides features like static and dynamic application security testing (SAST/DAST) out of the box, making it easier to maintain secure code. -- **Kubernetes integration**: Provides simplified deployment to Kubernetes clusters, which is a huge benefit for teams looking to manage containerized applications. - -**Cons**: -- **Resource intensive**: Can be heavy on system resources - especially when self-hosted - making it a bit challenging for smaller teams or those with limited infrastructure. -- **Complex setup**: Initial configuration can be time-consuming, particularly for large projects or those new to GitLab. -- **Self-hosted maintenance**: Managing updates, security patches, and overall maintenance can be a burden if you're running GitLab on-premises. -- **Limited third-party integrations**: While GitLab covers a lot of use cases internally, it can be harder to integrate with some third-party tools compared to other CI/CD solutions. -- **Cost for premium features**: Advanced features, like better performance metrics and premium support, require a paid subscription. - -### Azure DevOps -[Azure DevOps](https://azure.microsoft.com/en-us/products/devops/) is a suite of development tools from Microsoft, providing version control, CI/CD pipelines, testing, and artifact management. It's designed to support teams in planning work, collaborating on code development, and building and deploying applications, and offers a highly integrated set of tools that help teams manage every stage of the development lifecycle, including version control, CI/CD, artifact management, and testing. - -Key features include Azure Boards for tracking work, Azure Repos for version control, Azure Pipelines for CI/CD, Azure Artifacts for package management, and Azure Test Plans for testing. This makes this CI/CD tool ideal for teams using Microsoft technologies, offering streamlined collaboration and a high-quality development process. - - - -**Unique feature: integrated end-to-end DevOps solution for the Microsoft environment** -Azure DevOps offers an integrated suite covering the entire DevOps lifecycle, from project planning with Azure Boards to deploying applications with Azure Pipelines. This makes it a powerful choice for teams that want a complete, all-in-one DevOps experience when using other Microsoft services. - -**Pros**: -- **Comprehensive toolset**: Covers the entire development lifecycle, reducing the need for additional tools. -- **Strong integration with Microsoft tools**: Seamless integration with Visual Studio and Azure services, which is beneficial for teams already in the Microsoft ecosystem. -- **Flexible deployment**: Supports deploying to any platform or cloud, giving teams versatility in their deployment strategies. - -**Cons**: -- **Complexity**: Can be overwhelming due to the breadth of features, which may be more than what small teams or simple projects need. -- **Steep learning curve**: Requires time to master all components, particularly for those not already familiar with Microsoft's ecosystem. -- **Cost**: Paid tiers can be expensive for larger teams, particularly when compared to other solutions that offer similar features. -- **Interface navigation**: The user interface can be less intuitive with respect to other CI/CD tools, making it harder for new users to find what they need. -- **Best for Microsoft ecosystems**: Less ideal for projects that aren't centered around Microsoft technologies. - -### CircleCI -[CircleCI](https://circleci.com/) is a cloud-based CI/CD platform that automates development workflows and accelerates software delivery. It supports rapid setup and provides powerful customization options for building, testing, and deploying applications. - -Known for its emphasis on speed - allowing developers to create efficient pipelines that run with minimal delays - the platform supports a variety of configurations, giving teams the ability to tailor workflows to their specific needs, whether they are working with traditional applications, containerized microservices, or other deployment strategies. Additionally, its cloud-based nature means that CircleCI can easily scale to meet the demands of growing projects, handling parallel tasks effectively to minimize build times. - -**Unique feature: optimized for speed and parallelism** -CircleCI excels at running pipelines quickly by allowing tasks to run in parallel, significantly reducing build times. This makes it ideal for teams that need fast feedback on their code changes. - -**Pros**: -- **Fast builds**: Optimized for speed with caching and parallelism, helping teams get quick results. -- **Extensive integrations**: Works with a wide range of tools and services, making it easy to fit into existing workflows. -- **Excellent Docker support**: Strong support for containerized applications, which is a big advantage for modern development practices. - -**Cons**: -- **Pricing complexity**: Costs can escalate with increased usage, which can be a concern for teams with many developers or a high volume of builds. -- **Limited free tier**: Restrictions on concurrency and build minutes make the free tier less practical for larger teams or projects. -- **Debugging limitations**: Live debugging can be challenging, which may slow down the troubleshooting process. -- **Learning curve for advanced features**: Advanced configurations, like setting up custom resource classes, can be complex. -- **Reliance on cloud**: Less suitable for on-premises environments, which can limit its adoption in organizations with strict data residency requirements. - -### Jenkins -[Jenkins](https://www.jenkins.io/) is an open-source automation server that helps developers build, test, and deploy their software. It's one of the most popular tools in the CI/CD space, thanks to its extensive plugin ecosystem that allows it to integrate with almost any tool or platform. It has also been around for over a decade, and its longevity speaks to its reliability and flexibility. - -However, Jenkins' extensibility comes with its challenges. Managing a large number of plugins - in fact - can lead to compatibility issues, and keeping everything up to date requires ongoing maintenance. Additionally, configuring Jenkins for optimal performance — especially in distributed environments — can be complex and time-consuming. - -**Unique feature: self-hosted, customizable agent management** -Jenkins offers the ability to set up and manage self-hosted agents (nodes) with full customization. This feature allows teams to control the environment in which their CI/CD tasks run, giving them the flexibility to configure build environments specifically to their needs. - -**Pros**: -- **Flexibility**: Highly customizable to fit any workflow, with plugins for almost any use case you can think of. -- **Open source**: Free to use with a strong community, which is great for developers looking for a cost-effective solution. -- **Wide adoption**: Well-established with extensive documentation and support resources, making it easier to find solutions to problems. - -**Cons**: -- **Maintenance overhead**: Requires significant effort to manage, including plugin updates and server maintenance. -- **Complex configuration**: Setup can be time-consuming, particularly for large or complex projects. -- **Plugin conflicts**: With so many plugins, there's always a risk of compatibility issues, which can lead to instability. -- **Outdated UI**: The interface is less modern and intuitive compared to newer tools, which can be frustrating for new users. -- **Scalability challenges**: Efficient scaling can be difficult, particularly when trying to distribute builds across multiple nodes. - -## Why Kestra Stands Out -After exploring these popular CI/CD tools, you might be wondering where Kestra fits in. So, let's dive into what makes Kestra unique and when it might be the right choice for your projects. - -### Kestra: Orchestrating Complex Workflows With Ease -Kestra is an open-source orchestration and scheduling platform designed to handle complex workflows across various systems. While traditional CI/CD tools focus on automating code integration and deployment, Kestra specializes in orchestrating tasks that span multiple environments and services. - -Here are its unique capabilities: - -- **Unified orchestration across systems**: Kestra allows you to manage workflows involving different cloud providers, databases, APIs, and more — all from a single platform. This makes it easier to coordinate tasks that need to interact with diverse environments, reducing the need for custom integration scripts. -- **Real-time event triggers**: Supports event-driven architectures, enabling workflows to react to events like file uploads, database changes, or API calls. This [real-time](./2024-06-27-realtime-triggers.m) responsiveness can be critical for applications that require immediate action. -- **Visual workflow editor**: Provides an intuitive interface to design and visualize workflows, reducing complexity and making it accessible even for those new to orchestration. This visual approach can save significant time when designing and maintaining workflows. -- **Robust error handling and retries**: Built-in mechanisms for managing failures and retries without the need for custom scripting, ensuring reliability. This is a must when dealing with critical tasks where failure isn't an option. -- **Scalable and distributed execution**: Designed for cloud-native environments, Kestra handles parallelism and scaling seamlessly, making it ideal for large-scale data processing and distributed workflows. - -### When to Choose Kestra Over Traditional CI/CD Tools -At this point, you might be wondering when to choose Kestra over a CI/CI tool. So here are some guidelines to consider: - -- **Complex, multi-system workflows**: If your workflows involve coordinating tasks across various platforms and services, Kestra simplifies this orchestration. Instead of relying on multiple CI/CD jobs and scripts, Kestra provides a unified approach. -- **Event-driven processes**: For applications that need to respond to real-time events, Kestra's event triggers are invaluable. This capability allows your workflows to start automatically when something happens, without manual intervention. -- **Enhanced error handling**: When reliability is critical, Kestra's robust error management ensures workflows can recover gracefully, reducing downtime and manual troubleshooting. -- **Visual design preference**: If you prefer designing workflows visually rather than scripting them, Kestra's editor is a significant advantage. The ability to drag and drop tasks can make workflow creation much more approachable. -- **Scalability needs**: For projects that require handling large-scale data processing or distributed tasks, Kestra is built to scale efficiently. It takes care of distributing tasks across available resources, so you don't have to manage scaling manually. - -## Kestra Vs. Jenkins: A Deep Comparison -So, along this article, we've described what are CI/CD tools used for and we listed the most popular ones. We have also presented Kestra as an orchestration tool and described when to choose it over traditional CI/CD tools. - -As Jenkin is a "jack of all trade" CI/CD tool, here we want to make a deep comparison between it and Kestra to help you understand why and when you should choose Kestra over it. To do so, we'll discuss why developers use Jenkins and difficulties in using it that Kestra solves. - -### Why Developers Use Jenkins -Jenkins has many pros, and we believe the three that are woth mentioning are: - -1. **Wide Adoption and Ecosystem**: Jenkins has been around for over a decade, so it is mature and "battle-tested": this makes it a staple in continuous integration and deployment. Also, its vast plugin ecosystem and open-source nature make it adaptable for almost any CI/CD pipeline need. - -2. **Flexibility**: With Jenkins, developers can create highly customized pipelines as it supports different environments, tools, and languages. - -3. **Community Support**: Jenkins has an active community that ensures there’s a large amount of documentation, tutorials, and forums where developers can find answers to their problems. - -Now, let's see where Jenkins falls short. - -### Difficulties Developers Encounter Using Jenkins -While Jenkins is a powerful tool, it does come with some challenges. - -### Ease of Use and Developer Experience -One of Kestra’s standout features is its intuitive interface which provides built-in autocomplete and detailed error handling: this helps developers quickly define and manage their workflows without getting bogged down by tedious setup processes. - -Unlike Jenkins, which can be slow and challenging to configure, Kestra’s interface accelerates the workflow-building experience, allowing developers to focus more on building their systems rather than troubleshooting pipeline syntax or configuration issues. - -In fact, in Jenkins debugging pipelines can be difficult to set up as logs can become scattered across different plugins and stages, making it hard to trace the root cause of an issue. - -Kestra, instead, provides centralized logging and error-handling across all tasks in a workflow. So, if a pipeline fails, developers can easily view the entire execution history and debug issues with a unified logging system. - - - -#### Groovy Syntax -Jenkins uses [Groovy-based](https://www.jenkins.io/doc/pipeline/steps/groovy/) scripting for pipeline creation, which can be unintuitive for developers unfamiliar with it - as it also a language not widely used. This can create a steep learning curve that can slow down development and cause errors. - -Kestra, instead, uses a declarative YAML-based syntax that is much easier to read and write. YAML is also widely known and used in the industry, making it more accessible to developers, and reducing the learning curve for new users. Its human-readable format makes YAML a practical choice, as it is straightforward to understand, allowing team members across different roles to easily collaborate on workflow definitions. - -#### Scalability Challenges -Jenkins requires a lot of manual setup for distributed builds or scaling across [multiple nodes](https://www.jenkins.io/doc/book/managing/nodes/), and this can lead to bottlenecks when the infrastructure needs to grow. - -In contrast, Kestra leverages [Worker Groups](../docs/06.enterprise/04.scalability/worker-group.md), which are collections of workers that can be targeted for executing tasks based on specific requirements, allowing for efficient workload distribution across different nodes. Additionally, [Task Runners](../docs/06.enterprise/04.scalability/task-runners.md) enable the dynamic allocation of tasks in various cloud environments, facilitating the execution of compute-intensive jobs without the need for permanent infrastructure. - -These features provide streamlined and scalable approach to managing complex workflows, reducing the operational overhead associated with scaling Jenkins. - -## Conclusions -In conclusion, selecting a CI/CD tool depends on your project's unique needs. In particular, to summarize: - -- GitHub Actions is perfect for projects entirely on GitHub, minimizing context switching. -- GitLab CI/CD suits teams wanting everything—from code to deployment—in one place. -- Azure DevOps is tailored for those deep into the Microsoft ecosystem. -- CircleCI offers speed and efficiency for fast-paced development environments. -- Jenkins provides unmatched flexibility for those ready to handle its complexity. - -However, when your workflows become complex and span multiple systems or require real-time event handling, these tools might not suffice. In such cases, Kestra stands out by seamlessly orchestrating complex workflows across diverse platforms, offering robust error handling, and scaling effortlessly. So, for most modern applications that demand more than what traditional CI/CD tools offer, Kestra provides a comprehensive solution that simplifies complexity and accelerates development. +--- +title: "Kestra vs. Popular CI/CD Tools: When to Choose an Orchestration Solution" +description: "Learn when to to choose an orchestrator rather than a CI/CD solution" +date: 2024-10-17T15:00:00 +category: Solutions +author: + name: Federico Trotta + image: "ftrotta" +image: "@assets/blogs/2024-10-17-ci-cd-kestra-comparison.jpg" +--- + +In a recent [blog post](./2024-09-18-what-is-an-orchestrator.md), we defined what an orchestrator is, the differences between orchestration and automation, and how orchestration can help you to automate your workflows. + +Now, it's time to answer the question: when should you choose an orchestrator over a CI/CD solution? Both have overlapping functionality so how do you decide which one is best for your job? + +In this article, we'll explore what CI/CD tools are, dive into some of the most popular ones, and look at what Kestra brings to the table. In particular, we'll also provide a deeper comparison between Kestra and Jenkins. + +## What Are CI/CD Tools? +Before comparing CI/CD tools, let's first define what is a CI/CD tool. + +CI/CD tools are software applications that automate the processes of integrating code changes (Continuous Integration) and deploying applications (Continuous Deployment) to production environments. They help teams collaborate effectively by automating builds, tests, and deployments, ensuring that new features and bug fixes are delivered quickly and reliably. + +By automating these steps, CI/CD tools reduce the reliance on manual intervention, which not only accelerates the development cycle but also minimizes the potential for human error. Automation, in fact, ensures that deployments are consistent and repeatable, eliminating mistakes that can occur when developers have to remember and execute complex sequences manually. + +In particular, CI/CD tools are designed to: + +- **Automate builds**: Compile source code into executable programs, saving developers time and minimizing manual errors. +- **Run tests**: Execute automated tests to verify that code changes work as intended and don't introduce new bugs, providing early feedback and maintaining code quality. +- **Deploy applications**: Automatically release new code to production or staging environments, allowing teams to ship features faster and with fewer manual interventions. +- **Provide feedback**: Alert developers about build statuses and test results, helping them identify and address issues as soon as possible. + +These tools are fundamental for maintaining high-quality code and rapid release cycles in today's fast-paced development environments. By removing manual steps and standardizing workflows, they enhance reliability and reduce the chance of errors slipping into production. So, without them, teams would struggle to keep up with the demand for frequent updates, making it much harder to maintain a competitive edge. + +## Most Used CI/CD Tools +There are a lot of CI/CD tools out there, so let's take a closer look at some of the most popular ones. For each, we'll provide an overview, highlight a unique feature, and list pros and cons. + +### GitHub Actions +[GitHub Actions](https://github.com/features/actions) is GitHub's integrated CI/CD solution, allowing you to automate your workflows directly from your GitHub repository. It enables you to build, test, and deploy your code right alongside your pull requests and issues, providing a seamless experience for developers. + +Also, by integrating tightly with GitHub, it reduces context switching, allowing teams to manage their entire CI/CD pipelines within a single interface; this makes GitHub Actions particularly attractive for teams that want to quickly implement automation without having to leave their existing GitHub environment. + + + +**Unique feature: deep integration with the GitHub ecosystem** +GitHub Actions offers seamless integration with the entire GitHub platform, letting you trigger workflows based on any GitHub event—like pull requests, issues, or commits. This makes it an excellent choice for projects already using GitHub, as it provides a highly streamlined experience. + +**Pros**: +- **Ease of use**: Simple setup within your GitHub repository, which means minimal configuration. +- **Marketplace for Actions**: Access to a vast library of pre-built actions, which can save you a lot of time.. +- **Cost-effective**: Generous free tier for public repositories, making it accessible for open-source projects. + +**Cons**: +- **Limited to GitHub-hosted repositories**: While GitHub Actions integrates seamlessly with projects fully hosted on GitHub, it becomes challenging if your codebase spans multiple platforms or includes on-premises repositories. Teams managing repositories across different environments may find it difficult to integrate these external systems, as GitHub Actions is tightly coupled with the GitHub ecosystem. +- **Workflow edits require commits**: Updating workflows necessitates committing changes to the repository, which mixes the codebase and the CI/CD configurations in the commit history. This can clutter your commit log and make it harder to maintain a clean and organized repository, as code changes and workflow updates are intertwined. +- **Resource limits**: Concurrency and job time limits on the free tier can slow down larger projects. +- **Less control over environment**: Less flexibility in customizing the execution environment compared to other CI/CD tols, which can be a limitation for teams needing specific configurations. +- **Complexity with advanced workflows**: Setting up more sophisticated workflows can become complicated, requiring significant experience with the tool. + +### GitLab CI/CD +[GitLab CI/CD](https://docs.gitlab.com/ee/ci/index.html) is an integral part of GitLab, providing a seamless experience from code commit to deployment. It offers robust features for automating the entire DevOps lifecycle within a single application, including source control, continuous integration, testing, and deployment. By providing a comprehensive DevOps solution, GitLab CI/CD ensures that teams can collaborate effectively, track progress, and maintain high levels of code quality, all without needing to switch between multiple tools. + +This integrated approach reduces the friction typically associated with using diverse systems, making GitLab CI/CD a powerful option for teams seeking a streamlined and efficient workflow. Additionally, GitLab's focus on security with built-in features - such as vulnerability scanning and compliance management - strengthens its appeal for enterprises looking for a secure, all-in-one solution. + + + +**Unique feature: all-in-one DevOps platform** +GitLab CI/CD combines source control, CI/CD, project management, and deployment automation in one place, streamlining collaboration, efficiency, and simplifying the overall development lifecycle. With everything under one roof, there's no need to manage multiple tools, which can greatly reduce operational overhead. + +**Pros**: +- **Powerful pipelines**: Supports complex workflows with stages and dependencies, which is ideal for projects requiring detailed control over the build process. +- **Built-in security**: Provides features like static and dynamic application security testing (SAST/DAST) out of the box, making it easier to maintain secure code. +- **Kubernetes integration**: Provides simplified deployment to Kubernetes clusters, which is a huge benefit for teams looking to manage containerized applications. + +**Cons**: +- **Resource intensive**: Can be heavy on system resources - especially when self-hosted - making it a bit challenging for smaller teams or those with limited infrastructure. +- **Complex setup**: Initial configuration can be time-consuming, particularly for large projects or those new to GitLab. +- **Self-hosted maintenance**: Managing updates, security patches, and overall maintenance can be a burden if you're running GitLab on-premises. +- **Limited third-party integrations**: While GitLab covers a lot of use cases internally, it can be harder to integrate with some third-party tools compared to other CI/CD solutions. +- **Cost for premium features**: Advanced features, like better performance metrics and premium support, require a paid subscription. + +### Azure DevOps +[Azure DevOps](https://azure.microsoft.com/en-us/products/devops/) is a suite of development tools from Microsoft, providing version control, CI/CD pipelines, testing, and artifact management. It's designed to support teams in planning work, collaborating on code development, and building and deploying applications, and offers a highly integrated set of tools that help teams manage every stage of the development lifecycle, including version control, CI/CD, artifact management, and testing. + +Key features include Azure Boards for tracking work, Azure Repos for version control, Azure Pipelines for CI/CD, Azure Artifacts for package management, and Azure Test Plans for testing. This makes this CI/CD tool ideal for teams using Microsoft technologies, offering streamlined collaboration and a high-quality development process. + + + +**Unique feature: integrated end-to-end DevOps solution for the Microsoft environment** +Azure DevOps offers an integrated suite covering the entire DevOps lifecycle, from project planning with Azure Boards to deploying applications with Azure Pipelines. This makes it a powerful choice for teams that want a complete, all-in-one DevOps experience when using other Microsoft services. + +**Pros**: +- **Comprehensive toolset**: Covers the entire development lifecycle, reducing the need for additional tools. +- **Strong integration with Microsoft tools**: Seamless integration with Visual Studio and Azure services, which is beneficial for teams already in the Microsoft ecosystem. +- **Flexible deployment**: Supports deploying to any platform or cloud, giving teams versatility in their deployment strategies. + +**Cons**: +- **Complexity**: Can be overwhelming due to the breadth of features, which may be more than what small teams or simple projects need. +- **Steep learning curve**: Requires time to master all components, particularly for those not already familiar with Microsoft's ecosystem. +- **Cost**: Paid tiers can be expensive for larger teams, particularly when compared to other solutions that offer similar features. +- **Interface navigation**: The user interface can be less intuitive with respect to other CI/CD tools, making it harder for new users to find what they need. +- **Best for Microsoft ecosystems**: Less ideal for projects that aren't centered around Microsoft technologies. + +### CircleCI +[CircleCI](https://circleci.com/) is a cloud-based CI/CD platform that automates development workflows and accelerates software delivery. It supports rapid setup and provides powerful customization options for building, testing, and deploying applications. + +Known for its emphasis on speed - allowing developers to create efficient pipelines that run with minimal delays - the platform supports a variety of configurations, giving teams the ability to tailor workflows to their specific needs, whether they are working with traditional applications, containerized microservices, or other deployment strategies. Additionally, its cloud-based nature means that CircleCI can easily scale to meet the demands of growing projects, handling parallel tasks effectively to minimize build times. + +**Unique feature: optimized for speed and parallelism** +CircleCI excels at running pipelines quickly by allowing tasks to run in parallel, significantly reducing build times. This makes it ideal for teams that need fast feedback on their code changes. + +**Pros**: +- **Fast builds**: Optimized for speed with caching and parallelism, helping teams get quick results. +- **Extensive integrations**: Works with a wide range of tools and services, making it easy to fit into existing workflows. +- **Excellent Docker support**: Strong support for containerized applications, which is a big advantage for modern development practices. + +**Cons**: +- **Pricing complexity**: Costs can escalate with increased usage, which can be a concern for teams with many developers or a high volume of builds. +- **Limited free tier**: Restrictions on concurrency and build minutes make the free tier less practical for larger teams or projects. +- **Debugging limitations**: Live debugging can be challenging, which may slow down the troubleshooting process. +- **Learning curve for advanced features**: Advanced configurations, like setting up custom resource classes, can be complex. +- **Reliance on cloud**: Less suitable for on-premises environments, which can limit its adoption in organizations with strict data residency requirements. + +### Jenkins +[Jenkins](https://www.jenkins.io/) is an open-source automation server that helps developers build, test, and deploy their software. It's one of the most popular tools in the CI/CD space, thanks to its extensive plugin ecosystem that allows it to integrate with almost any tool or platform. It has also been around for over a decade, and its longevity speaks to its reliability and flexibility. + +However, Jenkins' extensibility comes with its challenges. Managing a large number of plugins - in fact - can lead to compatibility issues, and keeping everything up to date requires ongoing maintenance. Additionally, configuring Jenkins for optimal performance — especially in distributed environments — can be complex and time-consuming. + +**Unique feature: self-hosted, customizable agent management** +Jenkins offers the ability to set up and manage self-hosted agents (nodes) with full customization. This feature allows teams to control the environment in which their CI/CD tasks run, giving them the flexibility to configure build environments specifically to their needs. + +**Pros**: +- **Flexibility**: Highly customizable to fit any workflow, with plugins for almost any use case you can think of. +- **Open source**: Free to use with a strong community, which is great for developers looking for a cost-effective solution. +- **Wide adoption**: Well-established with extensive documentation and support resources, making it easier to find solutions to problems. + +**Cons**: +- **Maintenance overhead**: Requires significant effort to manage, including plugin updates and server maintenance. +- **Complex configuration**: Setup can be time-consuming, particularly for large or complex projects. +- **Plugin conflicts**: With so many plugins, there's always a risk of compatibility issues, which can lead to instability. +- **Outdated UI**: The interface is less modern and intuitive compared to newer tools, which can be frustrating for new users. +- **Scalability challenges**: Efficient scaling can be difficult, particularly when trying to distribute builds across multiple nodes. + +## Why Kestra Stands Out +After exploring these popular CI/CD tools, you might be wondering where Kestra fits in. So, let's dive into what makes Kestra unique and when it might be the right choice for your projects. + +### Kestra: Orchestrating Complex Workflows With Ease +Kestra is an open-source orchestration and scheduling platform designed to handle complex workflows across various systems. While traditional CI/CD tools focus on automating code integration and deployment, Kestra specializes in orchestrating tasks that span multiple environments and services. + +Here are its unique capabilities: + +- **Unified orchestration across systems**: Kestra allows you to manage workflows involving different cloud providers, databases, APIs, and more — all from a single platform. This makes it easier to coordinate tasks that need to interact with diverse environments, reducing the need for custom integration scripts. +- **Real-time event triggers**: Supports event-driven architectures, enabling workflows to react to events like file uploads, database changes, or API calls. This [real-time](./2024-06-27-realtime-triggers.m) responsiveness can be critical for applications that require immediate action. +- **Visual workflow editor**: Provides an intuitive interface to design and visualize workflows, reducing complexity and making it accessible even for those new to orchestration. This visual approach can save significant time when designing and maintaining workflows. +- **Robust error handling and retries**: Built-in mechanisms for managing failures and retries without the need for custom scripting, ensuring reliability. This is a must when dealing with critical tasks where failure isn't an option. +- **Scalable and distributed execution**: Designed for cloud-native environments, Kestra handles parallelism and scaling seamlessly, making it ideal for large-scale data processing and distributed workflows. + +### When to Choose Kestra Over Traditional CI/CD Tools +At this point, you might be wondering when to choose Kestra over a CI/CI tool. So here are some guidelines to consider: + +- **Complex, multi-system workflows**: If your workflows involve coordinating tasks across various platforms and services, Kestra simplifies this orchestration. Instead of relying on multiple CI/CD jobs and scripts, Kestra provides a unified approach. +- **Event-driven processes**: For applications that need to respond to real-time events, Kestra's event triggers are invaluable. This capability allows your workflows to start automatically when something happens, without manual intervention. +- **Enhanced error handling**: When reliability is critical, Kestra's robust error management ensures workflows can recover gracefully, reducing downtime and manual troubleshooting. +- **Visual design preference**: If you prefer designing workflows visually rather than scripting them, Kestra's editor is a significant advantage. The ability to drag and drop tasks can make workflow creation much more approachable. +- **Scalability needs**: For projects that require handling large-scale data processing or distributed tasks, Kestra is built to scale efficiently. It takes care of distributing tasks across available resources, so you don't have to manage scaling manually. + +## Kestra Vs. Jenkins: A Deep Comparison +So, along this article, we've described what are CI/CD tools used for and we listed the most popular ones. We have also presented Kestra as an orchestration tool and described when to choose it over traditional CI/CD tools. + +As Jenkin is a "jack of all trade" CI/CD tool, here we want to make a deep comparison between it and Kestra to help you understand why and when you should choose Kestra over it. To do so, we'll discuss why developers use Jenkins and difficulties in using it that Kestra solves. + +### Why Developers Use Jenkins +Jenkins has many pros, and we believe the three that are woth mentioning are: + +1. **Wide Adoption and Ecosystem**: Jenkins has been around for over a decade, so it is mature and "battle-tested": this makes it a staple in continuous integration and deployment. Also, its vast plugin ecosystem and open-source nature make it adaptable for almost any CI/CD pipeline need. + +2. **Flexibility**: With Jenkins, developers can create highly customized pipelines as it supports different environments, tools, and languages. + +3. **Community Support**: Jenkins has an active community that ensures there’s a large amount of documentation, tutorials, and forums where developers can find answers to their problems. + +Now, let's see where Jenkins falls short. + +### Difficulties Developers Encounter Using Jenkins +While Jenkins is a powerful tool, it does come with some challenges. + +### Ease of Use and Developer Experience +One of Kestra’s standout features is its intuitive interface which provides built-in autocomplete and detailed error handling: this helps developers quickly define and manage their workflows without getting bogged down by tedious setup processes. + +Unlike Jenkins, which can be slow and challenging to configure, Kestra’s interface accelerates the workflow-building experience, allowing developers to focus more on building their systems rather than troubleshooting pipeline syntax or configuration issues. + +In fact, in Jenkins debugging pipelines can be difficult to set up as logs can become scattered across different plugins and stages, making it hard to trace the root cause of an issue. + +Kestra, instead, provides centralized logging and error-handling across all tasks in a workflow. So, if a pipeline fails, developers can easily view the entire execution history and debug issues with a unified logging system. + + + +#### Groovy Syntax +Jenkins uses [Groovy-based](https://www.jenkins.io/doc/pipeline/steps/groovy/) scripting for pipeline creation, which can be unintuitive for developers unfamiliar with it - as it also a language not widely used. This can create a steep learning curve that can slow down development and cause errors. + +Kestra, instead, uses a declarative YAML-based syntax that is much easier to read and write. YAML is also widely known and used in the industry, making it more accessible to developers, and reducing the learning curve for new users. Its human-readable format makes YAML a practical choice, as it is straightforward to understand, allowing team members across different roles to easily collaborate on workflow definitions. + +#### Scalability Challenges +Jenkins requires a lot of manual setup for distributed builds or scaling across [multiple nodes](https://www.jenkins.io/doc/book/managing/nodes/), and this can lead to bottlenecks when the infrastructure needs to grow. + +In contrast, Kestra leverages [Worker Groups](../docs/06.enterprise/04.scalability/worker-group.md), which are collections of workers that can be targeted for executing tasks based on specific requirements, allowing for efficient workload distribution across different nodes. Additionally, [Task Runners](../docs/06.enterprise/04.scalability/task-runners.md) enable the dynamic allocation of tasks in various cloud environments, facilitating the execution of compute-intensive jobs without the need for permanent infrastructure. + +These features provide streamlined and scalable approach to managing complex workflows, reducing the operational overhead associated with scaling Jenkins. + +## Conclusions +In conclusion, selecting a CI/CD tool depends on your project's unique needs. In particular, to summarize: + +- GitHub Actions is perfect for projects entirely on GitHub, minimizing context switching. +- GitLab CI/CD suits teams wanting everything—from code to deployment—in one place. +- Azure DevOps is tailored for those deep into the Microsoft ecosystem. +- CircleCI offers speed and efficiency for fast-paced development environments. +- Jenkins provides unmatched flexibility for those ready to handle its complexity. + +However, when your workflows become complex and span multiple systems or require real-time event handling, these tools might not suffice. In such cases, Kestra stands out by seamlessly orchestrating complex workflows across diverse platforms, offering robust error handling, and scaling effortlessly. So, for most modern applications that demand more than what traditional CI/CD tools offer, Kestra provides a comprehensive solution that simplifies complexity and accelerates development. diff --git a/content/blogs/2024-10-22-credit-agricole-case-study.md b/src/content/blogs/2024-10-22-credit-agricole-case-study.md similarity index 93% rename from content/blogs/2024-10-22-credit-agricole-case-study.md rename to src/content/blogs/2024-10-22-credit-agricole-case-study.md index 7cb4d11ded0..55c92608f77 100644 --- a/content/blogs/2024-10-22-credit-agricole-case-study.md +++ b/src/content/blogs/2024-10-22-credit-agricole-case-study.md @@ -7,16 +7,16 @@ author: name: Julien Legrand image: jlegrand role: Data & AI Product Owner -image: /blogs/2024-10-22-credit-agricole-case-study.jpg +image: "@assets/blogs/2024-10-22-credit-agricole-case-study.jpg" --- CAGIP is the IT production entity of Crédit Agricole Group, a leading French banking and financial services company, acting as the central provider of IT services for the entire group. In the data team, we own several products that are used by different entities to host transactional, streaming or analytical data. We provide most of our solutions as a SaaS hosted on a private cloud. Expectations regarding security, regulations and high availability imply specific needs regarding infrastructure operations. ## The challenges we faced in scaling data pipelines -For a long time, we used Ansible & Jenkins to manage all the tasks that must be done on every of our deployments. Lately, we faced a significant scale up in the number of clusters and services that we manage. To keep up with the requirements related to hosting critical services in a banking environment, we had to: -⁃ run more infrastructure services in parallel (operating on over 50 MongoDB clusters) -⁃ optimize the consumed resources (using containers instead of virtual machines) +For a long time, we used Ansible & Jenkins to manage all the tasks that must be done on every of our deployments. Lately, we faced a significant scale up in the number of clusters and services that we manage. To keep up with the requirements related to hosting critical services in a banking environment, we had to: +⁃ run more infrastructure services in parallel (operating on over 50 MongoDB clusters) +⁃ optimize the consumed resources (using containers instead of virtual machines) ⁃ enhance the security (activating key rotation at scale). ## Experimenting with Kestra @@ -24,12 +24,12 @@ For a long time, we used Ansible & Jenkins to manage all the tasks that must be We probably could have challenged our current tools, but some of us were quickly convinced by Kestra and we wanted to go much further! So, we started with a quick installation in order to check the usability of the interface and the flow syntax defined in YAML. It went well and we decided to continue with setting up the right architecture: - + ## Using Kestra in production Before releasing the new tool to the teams, we wanted to define guidelines regarding CI/CD patterns and security. To do so, we prepared a few subflows simplifying the use of the solution such as Vault to store and retrieve secrets. We also tried multiple delivery patterns to agree on: development on the Kestra interface, test it in a specific namespace, then commit the flow to Git and finally use a Git Sync to make sure that each of our production flow is managed in a Git repository. Recently, we even connected it to our alerting service to get notified instantly when something goes wrong. - + It tooks us time, but we are now confident to open access to the platform built on top of Kestra across our 7 data teams this fall! ## Expanding Kestra to even more use cases diff --git a/content/blogs/2024-10-22-orchestrate-dags-with-kestra.md b/src/content/blogs/2024-10-22-orchestrate-dags-with-kestra.md similarity index 96% rename from content/blogs/2024-10-22-orchestrate-dags-with-kestra.md rename to src/content/blogs/2024-10-22-orchestrate-dags-with-kestra.md index 394c2132c9b..6d7db005d7d 100644 --- a/content/blogs/2024-10-22-orchestrate-dags-with-kestra.md +++ b/src/content/blogs/2024-10-22-orchestrate-dags-with-kestra.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset role: image: mproset -image: /blogs/2024-10-22-orchestrate-dags-with-kestra.jpg +image: "@assets/blogs/2024-10-22-orchestrate-dags-with-kestra.jpg" --- Migrating from one orchestration tool to another can seem like an intimidating task—especially if you have critical workflows running in production. When you rely on Airflow for essential data processing, the idea of moving everything to a new platform at once might feel risky. That’s why with **Kestra**, you don't have to jump into a big-bang migration. Instead, you can transition **one workflow at a time** and gradually adopt Kestra’s advanced orchestration capabilities while keeping what works in Airflow. @@ -58,10 +58,10 @@ In this setup: - **Monitor and poll the status** of your Airflow tasks directly within Kestra, allowing for real-time visibility. - **Pass execution metadata** (like task and flow IDs) to maintain context and track workflow performance across both platforms. - + As we can see, Kestra catch all the dag run information. - + On the other side, the Airflow DAG is triggered successfully. ## Kestra: A Central tool for All Your Workflows diff --git a/content/blogs/2024-10-25-code-in-any-language.md b/src/content/blogs/2024-10-25-code-in-any-language.md similarity index 98% rename from content/blogs/2024-10-25-code-in-any-language.md rename to src/content/blogs/2024-10-25-code-in-any-language.md index 089cc43df7d..e091acc7b0f 100644 --- a/content/blogs/2024-10-25-code-in-any-language.md +++ b/src/content/blogs/2024-10-25-code-in-any-language.md @@ -6,10 +6,10 @@ category: Solutions author: name: Will Russell image: "wrussell" -image: /blogs/2024-10-25-code-in-any-language.jpg +image: "@assets/blogs/2024-10-25-code-in-any-language.jpg" --- -There are only two kinds of programming languages: the ones people complain about and the ones nobody uses. Each language has its own pros and cons. That's why at Kestra, we offer you the flexibility to code in any language. This functionality is possible because Kestra separates your business logic from the glue code needed for orchestration. +There are only two kinds of programming languages: the ones people complain about and the ones nobody uses. Each language has its own pros and cons. That's why at Kestra, we offer you the flexibility to code in any language. This functionality is possible because Kestra separates your business logic from the glue code needed for orchestration.@@ -21,11 +21,11 @@ In this post, we'll look at the different ways that you can run your code inside ## Why use different languages? -While Python is a great tool for many problems, it’s not always the best choice for your business logic. For example, some use cases work best using a compiled language like C or Rust for performance advantages, whereas others benefit from the flexibility and ease of using an interpreted language like Python. +While Python is a great tool for many problems, it’s not always the best choice for your business logic. For example, some use cases work best using a compiled language like C or Rust for performance advantages, whereas others benefit from the flexibility and ease of using an interpreted language like Python. Another scenario might be that your team is familiar with a specific stack, like Ruby, which is why you want to use that for your business logic, as operating faster is more important than performance. Kestra makes this easy by allowing you to use any programming language interchangeably. -Inside Kestra, we have a number of dedicated plugins to allow you to use your favorite programming languages in a few lines of YAML. For each of these plugins, there’s the option to write your code directly inside of the task called `Script` tasks, or to run a command to run a dedicated file called `Commands` Tasks. +Inside Kestra, we have a number of dedicated plugins to allow you to use your favorite programming languages in a few lines of YAML. For each of these plugins, there’s the option to write your code directly inside of the task called `Script` tasks, or to run a command to run a dedicated file called `Commands` Tasks. This flexibility means you can keep shorter snippets inside of your YAML without having to introduce multiple files, but for larger more complex projects, you can write them locally in your IDE, push them to Git, and then sync them directly into your Kestra instance for your workflow to execute. Also, this works for languages without dedicated plugins too with a few extra lines of YAML. @@ -68,7 +68,7 @@ tasks: And just like that, in a few lines of YAML, we have a workflow that can run our Python code. By default, these tasks will run inside of a Docker container via a [Task Runner](../docs/task-runners/index.md) to isolate dependencies from other tasks, but also allow us to specify container images that have dependencies pre-installed. -Below we have an example where we’ve explicitly defined our Docker Task Runner to make it clearer what’s going on under the hood. However, you can still use the `containerImage` property without explicitly defining the task runner. By using the `containerImage` property, we can pick a Python image that includes some pre-installed libraries reducing the need to use `beforeCommands` . +Below we have an example where we’ve explicitly defined our Docker Task Runner to make it clearer what’s going on under the hood. However, you can still use the `containerImage` property without explicitly defining the task runner. By using the `containerImage` property, we can pick a Python image that includes some pre-installed libraries reducing the need to use `beforeCommands` . In this case, we’re using the `pydata` image which comes with a few useful libraries like `pandas` bundled in. When we run this example, it pulls the docker image and then starts to run our code without issue as the dependencies we need are baked into the image: @@ -173,7 +173,7 @@ Both the `Script` and `Commands` tasks have their benefits allowing you to decid ## Write code in a separate file with the Shell task -While not all languages have dedicated plugins, it’s still simple to use other languages and integrate them into your workflows. +While not all languages have dedicated plugins, it’s still simple to use other languages and integrate them into your workflows. For languages without dedicated plugins, we can use the Shell Commands task inside of a Docker Task Runner to run any language we need. We can easily specify a container image that has the correct dependencies for the language we want to use, similarly to the Python example using the `pydata` image with bundled in dependencies. Lastly, we can run any setup or compile commands prior to running our code. @@ -198,7 +198,7 @@ tasks: ## Write code inline with the Shell task -We can still write our code inline too if we’d prefer using the `inputFiles` property. Typically, this property is used for passing files into a task from a FILE input or a file output from an earlier task. +We can still write our code inline too if we’d prefer using the `inputFiles` property. Typically, this property is used for passing files into a task from a FILE input or a file output from an earlier task. Despite this, we can still use it for writing the file inline by using a pipe, allowing us to get the same benefits as the dedicated plugins. We will still run the same commands as if the file was a namespace file, but because this isn't a namespace file, we don’t need to use the `namespaceFiles` property because we’re using the `inputFiles` property to specify files available. @@ -255,7 +255,7 @@ tasks: char *token = strtok(line, ","); int i = 0; double total = 0.0; - + while (token) { if (i == 6) { total = atof(token); diff --git a/content/blogs/2024-10-30-ops-everything.md b/src/content/blogs/2024-10-30-ops-everything.md similarity index 98% rename from content/blogs/2024-10-30-ops-everything.md rename to src/content/blogs/2024-10-30-ops-everything.md index 836a3cdfae9..d97cc664e8e 100644 --- a/content/blogs/2024-10-30-ops-everything.md +++ b/src/content/blogs/2024-10-30-ops-everything.md @@ -7,7 +7,7 @@ author: name: Emmanuel Darras image: "edarras" role: CEO & Co-Founder -image: /blogs/2024-10-30-ops-everything.jpg +image: "@assets/blogs/2024-10-30-ops-everything.jpg" --- Despite growing demands for **orchestration, CI/CD, and end-to-end monitoring** across all operational and data workflows, many teams still depend on scattered tools that manage only parts of the process. This tool-driven approach reduces productivity, complicates maintenance, and delays troubleshooting. @@ -46,7 +46,7 @@ Establishing an effective **Ops-Everything** framework requires a comprehensiv ## Why Kestra? A Step Toward Unified, Collaborative Operations - + At [**Kestra**](https://github.com/kestra-io/kestra), we’re working to build this **unified approach**, creating an orchestration platform that meets operational needs across data and engineering. Our customers [**Gorgias**](https://kestra.io/use-cases/stories/13-gorgias-using-declarative-data-engineering-orchestration-with-kestra) and [**Leroy Merlin France**](https://kestra.io/use-cases/stories/14-achieving-agility-and-efficiency-in-data-architecture-with-kestra) underscore the transformative potential of unified workflows. Gorgias integrates Kestra with tools like **Airbyte**, **dbt**, and **Hightouch**, optimizing Infrastructure as Code practices, while Leroy Merlin relies on Kestra to support its **data mesh**, giving business units orchestration access without shadow IT. diff --git a/content/blogs/2024-11-05-sophia-genetics-use-case.md b/src/content/blogs/2024-11-05-sophia-genetics-use-case.md similarity index 98% rename from content/blogs/2024-11-05-sophia-genetics-use-case.md rename to src/content/blogs/2024-11-05-sophia-genetics-use-case.md index c7075b2c7e2..61bd1bf2aa1 100644 --- a/content/blogs/2024-11-05-sophia-genetics-use-case.md +++ b/src/content/blogs/2024-11-05-sophia-genetics-use-case.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: "bpimpaud" -image: /blogs/2024-11-05-sophia-genetics-use-case.jpg +image: "@assets/blogs/2024-11-05-sophia-genetics-use-case.jpg" --- Genomic sequence analysis is a key process for leading companies in the health technology industry. Yet, bioinformaticians have long grappled with existing tools that either lack user-friendly interfaces or fail to integrate smoothly with external systems. Enter Kestra, a software orchestrator that represents a game-changing solution designed to fill this gap. While many tools in the field either focus on narrow scientific applications, neglect modern integration capabilities, or rely on the limitations of interpreted languages like Python, Kestra offers a balanced approach. It combines scientific rigor with the flexibility to integrate with contemporary tooling, making it easier to scale, update architecture, and onboard new talent into this specialized field. In essence, Kestra addresses the bioinformatics community's pressing need for a tool that harmonizes scientific depth with modern technological agility. diff --git a/content/blogs/2024-11-06-examples-to-help-build-with-kestra.md b/src/content/blogs/2024-11-06-examples-to-help-build-with-kestra.md similarity index 99% rename from content/blogs/2024-11-06-examples-to-help-build-with-kestra.md rename to src/content/blogs/2024-11-06-examples-to-help-build-with-kestra.md index c1069880cdc..45264d2cb5a 100644 --- a/content/blogs/2024-11-06-examples-to-help-build-with-kestra.md +++ b/src/content/blogs/2024-11-06-examples-to-help-build-with-kestra.md @@ -6,7 +6,7 @@ category: Solutions author: name: Will Russell image: "wrussell" -image: /blogs/2024-11-06-examples-to-help-build-with-kestra.jpg +image: "@assets/blogs/2024-11-06-examples-to-help-build-with-kestra.jpg" --- When you get started with a new tool, it can be overwhelming to know where to start and what to look at first. You probably already have some existing code that you're looking to integrate without doing a ton of extra work. @@ -136,7 +136,7 @@ tasks: char *token = strtok(line, ","); int i = 0; double total = 0.0; - + while (token) { if (i == 6) { total = atof(token); @@ -285,7 +285,7 @@ triggers: On the trend of event driven workflows, we can use [Realtime triggers](../docs/04.workflow-components/07.triggers/05.realtime-trigger.md) to allow our workflows to react to new messages with low latency. -In this example, we're using the [Google Cloud PubSub Realtime Trigger](/plugins/google%20cloud/triggers/io.kestra.plugin.gcp.pubsub.realtimetrigger) to listen for new messages in realtime, and setting that data in a Firestore database. +In this example, we're using the [Google Cloud PubSub Realtime Trigger](/plugins/google%20cloud/triggers/io.kestra.plugin.gcp.pubsub.realtimetrigger) to listen for new messages in realtime, and setting that data in a Firestore database. ```yaml id: pubsub-realtime-trigger diff --git a/content/blogs/2024-11-19-kestra-ion.md b/src/content/blogs/2024-11-19-kestra-ion.md similarity index 99% rename from content/blogs/2024-11-19-kestra-ion.md rename to src/content/blogs/2024-11-19-kestra-ion.md index 084b2da1d2e..ba25f912d41 100644 --- a/content/blogs/2024-11-19-kestra-ion.md +++ b/src/content/blogs/2024-11-19-kestra-ion.md @@ -6,7 +6,7 @@ category: Solutions author: name: Shruti Mantri image: smantri -image: /blogs/2024-11-19-kestra-ion.jpg +image: "@assets/blogs/2024-11-19-kestra-ion.jpg" --- Kestra is a powerful orchestration tool that integrates with multiple data stores across different cloud environments, such as AWS, GCP, and Azure. It supports a wide range of databases, both relational and non-relational, as well as various file systems that store data in formats like CSV, Avro, Parquet, JSON, and more. With such a diverse set of data sources, it was essential to unify all incoming data into a common format. This is where Kestra had to decide how to manage and store the diverse data it ingests from various sources. diff --git a/content/blogs/2024-11-25-kestra-vs-jenkins.md b/src/content/blogs/2024-11-25-kestra-vs-jenkins.md similarity index 98% rename from content/blogs/2024-11-25-kestra-vs-jenkins.md rename to src/content/blogs/2024-11-25-kestra-vs-jenkins.md index fee385966df..1df168623a0 100644 --- a/content/blogs/2024-11-25-kestra-vs-jenkins.md +++ b/src/content/blogs/2024-11-25-kestra-vs-jenkins.md @@ -6,7 +6,7 @@ category: Solutions author: name: Will Russell image: "wrussell" -image: /blogs/2024-11-25-kestra-vs-jenkins.jpg +image: "@assets/blogs/2024-11-25-kestra-vs-jenkins.jpg" --- Jenkins is a well known open source automation server, commonly used for CI/CD. @@ -40,26 +40,26 @@ Running tests is a common use case for a automation/orchestrator. The example we - Run pytest tests - Send a Slack notification -In Jenkins, we will use Groovy to declare our pipeline. In this example, we are using a docker container with a `python` image to run our stages. The first stage clones the repository. +In Jenkins, we will use Groovy to declare our pipeline. In this example, we are using a docker container with a `python` image to run our stages. The first stage clones the repository. After that, we set up a virtual environment as Jenkins doesn't let you install dependencies to the container directly. Despite the container isolating pipelines from each other, you will need to use a virtual environment to install pytest. In our final stage, we run the pytest tests, but we need to reactivate the virtual environment for the separate stage. The success message here will determine whether the pipeline build will pass or fail. Afterwards, we use a `post` block to send a Slack notification using variables to dynamically set the message based on the output. The nice thing here is that this will run separately to the pipeline, enabling us to send a message about it. - + ```groovy pipeline { agent { docker { image 'python:3.9.0' } } - + stages { stage('checkout') { steps { git( url: 'https://github.com/wrussell1999/kestra-examples.git', branch: 'main' - ) + ) } } stage('dependencies') { @@ -125,7 +125,7 @@ In Jenkins, you can simply add a Jenkinsfile to your repository and put your Gro ```groovy pipeline { agent { docker { image 'python:3.9.0' } } - + stages { stage('dependencies') { steps { @@ -195,14 +195,14 @@ triggers: ```groovy pipeline { agent { docker { image 'python:3.9.0' } } - + stages { stage('checkout') { steps { git( url: 'https://github.com/wrussell1999/kestra-examples.git', branch: 'main' - ) + ) } } stage('dependencies') { @@ -231,7 +231,7 @@ tasks: type: io.kestra.plugin.git.Clone url: https://github.com/wrussell1999/kestra-examples branch: main - + - id: run_code type: io.kestra.plugin.scripts.python.Commands taskRunner: @@ -323,7 +323,7 @@ In summary, both Kestra and Jenkins have certain features that stand out to each | Total | 3 | 2 | Jenkins stands out for: -- Using a Jenkinsfile to keep your pipeline and code in one place, and keep it out of Jenkins +- Using a Jenkinsfile to keep your pipeline and code in one place, and keep it out of Jenkins - Managing Plugins both from the CLI and UI, with options to install without restarting the server - Schedule builds at a set time, but automatically spread them out to prevent overloading the server diff --git a/content/blogs/2025-02-14-performance-improvements.md b/src/content/blogs/2025-02-14-performance-improvements.md similarity index 99% rename from content/blogs/2025-02-14-performance-improvements.md rename to src/content/blogs/2025-02-14-performance-improvements.md index 108d960c670..0b2d5dddaed 100644 --- a/content/blogs/2025-02-14-performance-improvements.md +++ b/src/content/blogs/2025-02-14-performance-improvements.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/optimized-performance.png +image: "@assets/blogs/optimized-performance.png" --- Kestra's engineering team is continuously improving orchestrator performance to make it more resource efficient. In versions 0.19 and 0.20, they addressed inefficiencies in data serialization, database query indexes, log handling, and more. Below is an overview of these recent enhancements. diff --git a/content/blogs/2025-03-27-using-amazon-s3-tables-with-kestra.md b/src/content/blogs/2025-03-27-using-amazon-s3-tables-with-kestra.md similarity index 96% rename from content/blogs/2025-03-27-using-amazon-s3-tables-with-kestra.md rename to src/content/blogs/2025-03-27-using-amazon-s3-tables-with-kestra.md index 4f74115377a..e2e79c3d934 100644 --- a/content/blogs/2025-03-27-using-amazon-s3-tables-with-kestra.md +++ b/src/content/blogs/2025-03-27-using-amazon-s3-tables-with-kestra.md @@ -6,8 +6,8 @@ category: Solutions author: name: Shruti Mantri image: smantri - role: -image: /blogs/s3-table.jpg + role: +image: "@assets/blogs/s3-table.jpg" --- Amazon recently introduced S3 Tables, purpose-built for storing and querying tabular data directly on S3. Backed by built-in Apache Iceberg support, S3 Tables make data instantly accessible to popular AWS and third-party analytics engines like EMR and Athena. @@ -47,7 +47,7 @@ In order to get the end-to-end Kestra workflow that interacts with S3 table, we Firstly, we will need a general purpose S3 bucket where we will store the data. For this, navigate to the [S3 service](https://console.aws.amazon.com/s3/home) on the AWS console. From the left navigation menu, select `General purpose buckets`. On the `General purpose buckets` page, select the `Create bucket` button. On the `Create bucket` page, provide a globally unique bucket name in the `Bucket name` text box. For the purpose of this blog, for example we name the bucket as `s3-general-purpose-ecommerce`. Rest of the configurations can be left as default, and select the **Create bucket** button at the bottom of the page. This will create the new bucket. - + From the `General purpose buckets` page, search for the newly created bucket, and select the bucket name. On the corresponding bucket's home page, select the `Create folder` button. Provide the folder name, for example `data`, and select the `Create folder` button at the bottom of the page. We will be storing our data in this folder. @@ -103,11 +103,11 @@ On the [S3 service](https://console.aws.amazon.com/s3/home) page on the AWS cons In case, you are opening the table buckets page for the first time, you will see a box at the top of the page about `Integration with AWS analytics services - New` with the `Enable integration` button. Select the button and enable the integration of S3 table buckets with AWS analytics services like Amazon EMR, Amazon Redshift and Amazon Athena. - + Next, we will create a table bucket. Select the `Create table bucket` button at the top of the page. On the `Create table bucket` page, provide an appropriate name for the table bucket, say `ecommerce-lakehouse`. Select the `Create table bucket` button at the bottom of the page. This will create the new table bucket. - + ### Providing IAM Access @@ -119,7 +119,7 @@ On the `Roles` page with IAM, search for `EMR_EC2_DefaultRole`, and select the s Navigate to [EC2 service](https://console.aws.amazon.com/ec2/home) on the AWS console. From the left navigation menu, navigate to `Key pairs`. On the `Key pairs` page, select the `Create key pair` button at the top of the page. On the `Create key pair` page, provide an appropriate name for the key pair, say `emr-ec2-key-pair`, and select the `Create key pair` button at the bottom of the page. This will download the pem file associated with the key pair to your machine, and the new key pair will be created. - + ### Create PySpark Job @@ -162,7 +162,7 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--input", type=str, help="Data location in S3", default="") args = parser.parse_args() - + spark = SparkSession.builder.appName("Load to Iceberg").getOrCreate() sqlContext = SQLContext(spark.sparkContext) @@ -295,7 +295,7 @@ SELECT * FROM "data"."products"; You should be able to see all the 20 rows from the table getting displayed in the `Query results` section. - + Thus, we have successfully leverage S3 table bucket to create an Iceberg table. @@ -303,6 +303,6 @@ Thus, we have successfully leverage S3 table bucket to create an Iceberg table. Kestra workflows can be used to work with the S3 table buckets and create Iceberg tables. This enables us to introduce orchestration related to S3 tables with Kestra, bringing in all the good features that S3 tables have to offer. -If you have any questions, reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). +If you have any questions, reach out via [Kestra Community Slack](https://kestra.io/slack) or open [a GitHub issue](https://github.com/kestra-io/kestra). If you like the project, give us a [GitHub star](https://github.com/kestra-io/kestra) and join [the open-source community](https://kestra.io/slack). diff --git a/content/blogs/2025-04-08-performance-improvements.md b/src/content/blogs/2025-04-08-performance-improvements.md similarity index 99% rename from content/blogs/2025-04-08-performance-improvements.md rename to src/content/blogs/2025-04-08-performance-improvements.md index 596b8c64150..10baa541d70 100644 --- a/content/blogs/2025-04-08-performance-improvements.md +++ b/src/content/blogs/2025-04-08-performance-improvements.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/optimized-performance-2.png +image: "@assets/blogs/optimized-performance-2.png" --- The engineering team focused on improving Kestra's performance in version 0.22. Here’s a clear overview of the optimizations we've made: diff --git a/content/blogs/2025-data-engineering-and-ai-trends.md b/src/content/blogs/2025-data-engineering-and-ai-trends.md similarity index 98% rename from content/blogs/2025-data-engineering-and-ai-trends.md rename to src/content/blogs/2025-data-engineering-and-ai-trends.md index 2aa7640264d..e46bd22af1f 100644 --- a/content/blogs/2025-data-engineering-and-ai-trends.md +++ b/src/content/blogs/2025-data-engineering-and-ai-trends.md @@ -7,7 +7,7 @@ author: name: Anna Geller image: ageller role: Product Lead -image: /blogs/2025-data-engineering-and-ai-trends.png +image: "@assets/blogs/2025-data-engineering-and-ai-trends.png" --- Many trends that began shaping [data engineering in 2024](https://kestra.io/blogs/2024-01-24-2024-data-engineering-trends) continue to affect data teams in 2025. AI keeps accelerating, and data lakes—along with open table formats—are more popular than ever. Below is our take on the trends influencing data engineering and AI today, and how they impact data professionals. @@ -95,7 +95,7 @@ The database world’s “Swiss Army knife” keeps getting sharper. In 2025, ** The [2024 Stack Overflow survey](https://survey.stackoverflow.co/2024/) found 49% of developers now use PostgreSQL – surpassing MySQL for the first time. This growth stems from its *ecosystem-first* strategy: instead of forcing users to adopt new tools, PostgreSQL integrates them, becoming what many call *the Linux of databases* – boringly reliable, and infinitely adaptable. - + Source: [Postgres is eating the database world](https://medium.com/@fengruohang/postgres-is-eating-the-database-world-157c204dcfc4) @@ -107,7 +107,7 @@ Even though many developers love PostgreSQL, migrating databases or moving workl There’s a bright spot, though. AI is starting to make certain migrations much easier. [AWS Database Migration Service (DMS)](https://aws.amazon.com/blogs/aws/aws-data-migration-service-improves-database-schema-conversion-with-generative-ai/) now uses generative AI to automate many of the time-consuming schema conversion tasks needed to move from commercial databases like Oracle to PostgreSQL. It won’t handle every edge case—proprietary functions and special data types can still be tricky—but it can significantly reduce the pain of database migration. This is a welcome trend for data engineers who typically face long, painstaking processes to convert and migrate data manually. - + --- diff --git a/content/blogs/bdl2025.md b/src/content/blogs/bdl2025.md similarity index 98% rename from content/blogs/bdl2025.md rename to src/content/blogs/bdl2025.md index fcb81fa1a33..6b4a0d7f4b4 100644 --- a/content/blogs/bdl2025.md +++ b/src/content/blogs/bdl2025.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Benoit Pimpaud image: bpimpaud -image: /blogs/bdl_2025_1.jpg +image: "@assets/blogs/bdl_2025_1.jpg" --- Nowadays it's easy to find the last news over LinkedIn and to keep updated through the last discussions on Reddit. But there's a place where the distribution of subject and people feels more realistic: a physical event. @@ -36,7 +36,7 @@ The data industry is still busy with ELT, pipelines, moving data from A to B. Pe What we saw was AI as a feature—assistants, copilots—helping with interfaces, not yet reshaping the workflows behind the scenes. This is where Kestra stands differently: we introduced the AI agent to embed AI into the orchestration logic itself, making it easier to schedule and run the workflows that people are already struggling with. - + ## Open Source Is the Way diff --git a/content/blogs/data-orchestration-beyond-analytics.md b/src/content/blogs/data-orchestration-beyond-analytics.md similarity index 99% rename from content/blogs/data-orchestration-beyond-analytics.md rename to src/content/blogs/data-orchestration-beyond-analytics.md index 2788aa2da2e..f5bd912a1d5 100644 --- a/content/blogs/data-orchestration-beyond-analytics.md +++ b/src/content/blogs/data-orchestration-beyond-analytics.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Anna Geller image: ageller -image: /blogs/data-orchestration-beyond-analytics.png +image: "@assets/blogs/data-orchestration-beyond-analytics.png" --- diff --git a/content/blogs/declarative-from-day-one.md b/src/content/blogs/declarative-from-day-one.md similarity index 99% rename from content/blogs/declarative-from-day-one.md rename to src/content/blogs/declarative-from-day-one.md index 83bae4fd2ab..aba6e7e8210 100644 --- a/content/blogs/declarative-from-day-one.md +++ b/src/content/blogs/declarative-from-day-one.md @@ -7,7 +7,7 @@ author: name: Emmanuel Darras image: edarras role: CEO & Co-Founder -image: /blogs/declarative-orchestration.jpg +image: "@assets/blogs/declarative-orchestration.jpg" --- [Kestra](https://github.com/kestra-io/kestra) committed to a **declarative-first approach** from day one – and we’re more convinced than ever that it was the right decision. While others bolt on YAML or no-code layers as afterthoughts, Kestra was **designed from the ground** to be declarative, flexible, and language-agnostic. diff --git a/content/blogs/embedded-databases.md b/src/content/blogs/embedded-databases.md similarity index 99% rename from content/blogs/embedded-databases.md rename to src/content/blogs/embedded-databases.md index 843caf2617d..66c6c812d01 100644 --- a/content/blogs/embedded-databases.md +++ b/src/content/blogs/embedded-databases.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: mproset -image: /blogs/embedded-databases.jpg +image: "@assets/blogs/embedded-databases.jpg" --- Whether you're building complex ETL pipelines, conducting exploratory data analysis, or powering real-time APIs, these databases are usually in your stack. Why? They eliminate the latency of disk I/O. Tools like [**DuckDB**](https://github.com/duckdb/duckdb), [chDB](https://github.com/chdb-io/chdb), and [**SQLite**](https://github.com/sqlite/sqlite), alongside the rise of [**Limbo**](https://github.com/tursodatabase/limbo), are more relevant **than ever for 2025.** diff --git a/content/blogs/from-kestra-0-to-1.md b/src/content/blogs/from-kestra-0-to-1.md similarity index 99% rename from content/blogs/from-kestra-0-to-1.md rename to src/content/blogs/from-kestra-0-to-1.md index 2ca92c07435..58837b27729 100644 --- a/content/blogs/from-kestra-0-to-1.md +++ b/src/content/blogs/from-kestra-0-to-1.md @@ -3,11 +3,11 @@ title: "The Road from Kestra 0.1 to 1.0" description: We are getting closer to the 1.0 release, this is our journey date: 2025-09-04T13:00:00 category: News & Product Updates -author: +author: name: Ludovic Dehon image: ldehon role: CTO & Co-Founder -image: /blogs/from-0-to-1.jpg +image: "@assets/blogs/from-0-to-1.jpg" --- On Tuesday, September 9th, we will officially launch **Kestra 1.0,** a release that will **change the face of orchestration forever**. @@ -40,7 +40,7 @@ This is how Kestra turned declarative orchestration into something universal, us ## Open source as a foundation, not a tactic -We chose **open source** from day one. Not as a marketing lever, but because orchestration is too critical to be a black box. The code should be inspectable. The community could report, contribute. +We chose **open source** from day one. Not as a marketing lever, but because orchestration is too critical to be a black box. The code should be inspectable. The community could report, contribute. By keeping Kestra open, we gave the community a lever to make Kestra better, and they did. @@ -82,4 +82,4 @@ We are proud of where we landed. **Kestra 1.0** is ready. The release you’ll s If you’ve been with us since the early days, thank you for the issues you opened, the pull requests you sent, and the ideas you pushed us to test. If you’re just discovering Kestra now, welcome. You’ll find a platform that values clarity, reliability, and openness over lock‑in. -The countdown is on. In 5 days, we’ll reveal what will **permanently redefine orchestration.** \ No newline at end of file +The countdown is on. In 5 days, we’ll reveal what will **permanently redefine orchestration.** \ No newline at end of file diff --git a/content/blogs/gravitee-Kestra.md b/src/content/blogs/gravitee-Kestra.md similarity index 97% rename from content/blogs/gravitee-Kestra.md rename to src/content/blogs/gravitee-Kestra.md index 04ace2530dc..58eafbc2ef9 100644 --- a/content/blogs/gravitee-Kestra.md +++ b/src/content/blogs/gravitee-Kestra.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset image: mproset role: Kestra Team -image: /blogs/kestra-gravitee.png +image: "@assets/blogs/kestra-gravitee.png" --- [Gravitee.io] (https://www.gravitee.io/) started in 2015 with a simple idea: making APIs less complex. What began as a team of four developers has grown into a platform that powers API and event stream ecosystems for some of the world’s biggest companies. Recognized as a 2024 **Gartner Magic Quadrant™ Leader for API Management**, Gravitee helps enterprises like **Michelin, Roche,** and **Blue Yonder** take control of their APIs and event streams. @@ -39,7 +39,7 @@ Gravitee.io's workflow showcases the power of combining orchestration with gener With Kestra handling the backend orchestration, customers only need to trigger a workflow with a single click. This initiates the generation of developer-friendly, up-to-date documentation for any newly created API. - + 2. **Triggering Workflows with SQL Polling** @@ -57,13 +57,13 @@ Using Kestra’s **http.Request** tasks, the API specifications are fed into a l To maintain reliability, Kestra monitors the entire workflow. Any errors are immediately flagged, and Slack alerts are sent to the team. - + ## Fast and Reliable Documentation With generative AI accelerating the process, documentation is produced faster than ever, reducing manual effort and saving developers time. Kestra’s modular design ensured the system could grow alongside their expanding API ecosystem, adding new workflows with ease. By automating repetitive tasks, developers are free to focus on building better APIs rather than managing documentation. - + ## Why It Matters for API Management diff --git a/content/blogs/introducing-ai-agents.md b/src/content/blogs/introducing-ai-agents.md similarity index 99% rename from content/blogs/introducing-ai-agents.md rename to src/content/blogs/introducing-ai-agents.md index 590eefd135c..756d716a7d3 100644 --- a/content/blogs/introducing-ai-agents.md +++ b/src/content/blogs/introducing-ai-agents.md @@ -7,7 +7,7 @@ authors: - name: Anna Geller image: ageller role: Product Lead -image: /blogs/introducing-ai-agents.jpg +image: "@assets/blogs/introducing-ai-agents.jpg" --- We're excited to announce **AI Agents** in Kestra 1.0. With AI Agents, workflows are no longer limited to a predefined sequence of tasks and triggers. Instead, you can launch autonomous processes that use Large Language Models (LLMs), memory, and tools to dynamically decide which actions to take and in what order. diff --git a/content/blogs/introducing-apps.md b/src/content/blogs/introducing-apps.md similarity index 96% rename from content/blogs/introducing-apps.md rename to src/content/blogs/introducing-apps.md index 3fabb710aca..9a2e1b6ca23 100644 --- a/content/blogs/introducing-apps.md +++ b/src/content/blogs/introducing-apps.md @@ -7,12 +7,12 @@ author: name: Anna Geller image: ageller role: Product Lead -image: /blogs/introducing-apps.jpg +image: "@assets/blogs/introducing-apps.jpg" --- We’re excited to introduce **Apps**. With Apps, you can create custom user interfaces on top of your Kestra workflows. This feature makes it possible for anyone — not just technical users — to interact with your flows directly by submitting data, approving tasks, or viewing outputs, allowing you to build self-service applications for your data products and business processes. - + --- @@ -27,7 +27,7 @@ With Apps, you can: In short, Apps let you turn any Kestra workflow into a user-facing application. - + --- @@ -177,15 +177,15 @@ layout: Click on `View App` to see it in action: - + You should see a page with a form: - + Fill out the form and click on `Submit`. Once processing is complete, you should see the results displayed. - + The UI display and all actions performed by the app are configurable through `blocks` specified in the `layout` property. diff --git a/content/blogs/introducing-lts.md b/src/content/blogs/introducing-lts.md similarity index 97% rename from content/blogs/introducing-lts.md rename to src/content/blogs/introducing-lts.md index 20789745740..4c312c30815 100644 --- a/content/blogs/introducing-lts.md +++ b/src/content/blogs/introducing-lts.md @@ -7,7 +7,7 @@ authors: - name: Anna Geller image: ageller role: Product Lead -image: /blogs/introducing-lts.jpg +image: "@assets/blogs/introducing-lts.jpg" --- With the release of **Kestra 1.0**, we are introducing a **Long-Term Support (LTS)** release model. This change ensures predictable upgrade paths and long-term stability for production environments. diff --git a/content/blogs/introducing-unit-tests.md b/src/content/blogs/introducing-unit-tests.md similarity index 97% rename from content/blogs/introducing-unit-tests.md rename to src/content/blogs/introducing-unit-tests.md index ffac0e620f8..ccc016b7a8f 100644 --- a/content/blogs/introducing-unit-tests.md +++ b/src/content/blogs/introducing-unit-tests.md @@ -7,7 +7,7 @@ author: name: Anna Geller image: ageller role: Product Lead -image: /blogs/introducing_unittests.png +image: "@assets/blogs/introducing_unittests.png" --- The 0.23 release introduces a major addition to the Kestra platform: **Unit Tests for Flows**. With this new feature, you can verify the logic of your flows in isolation, helping you catch regressions early and maintain reliability as your automations evolve. @@ -48,7 +48,7 @@ Each test includes: The image below visualizes the relationship between a flow, its tests, test cases, fixtures and assertions. - + ### Fixtures @@ -121,7 +121,7 @@ There are two main ways to create and manage tests in Kestra: From these UI pages, you can define tests in YAML, run them and observe their results. - + ### How to Run Tests @@ -343,19 +343,19 @@ Finally, let's look at the process of creating and running tests from the Kestra First, open any flow and switch to the **Tests** tab. Here, you can create and manage your test suite: - + Define your test cases in YAML and save the test. - + Now if you navigate back to the **Tests** tab, you can see your test listed. Click on the **Run** button to execute it. If you have multiple tests, you can use the **Run All** button to execute all tests in parallel. - + Now you can inspect results directly from the UI. Additionally, clicking on the `ExecutionId` link will take you to the execution details page, where you can troubleshoot any issues that may have occurred during the test run. - + ## Next Steps diff --git a/content/blogs/kestra-1-in-7-days.md b/src/content/blogs/kestra-1-in-7-days.md similarity index 97% rename from content/blogs/kestra-1-in-7-days.md rename to src/content/blogs/kestra-1-in-7-days.md index 51027ffbb93..417398c5ab2 100644 --- a/content/blogs/kestra-1-in-7-days.md +++ b/src/content/blogs/kestra-1-in-7-days.md @@ -3,11 +3,11 @@ title: "Kestra 1.0 is Coming: the next big Thing in Orchestration" description: In just 7 days, we will release Kestra 1.0, and it will redefine orchestration. date: 2025-09-02T13:00:00 category: News & Product Updates -author: +author: name: Emmanuel Darras image: edarras role: CEO & Co-Founder -image: /blogs/1.0-7-days.jpg +image: "@assets/blogs/1.0-7-days.jpg" --- For too long, orchestration has meant **complexity and patchwork**: fragile schedulers, vendor lock-in, homegrown scripts, endless configs, stacked monitoring layers. Some even ended up coding their workflows directly in Python as if orchestration itself needed to be coded. The result: **slow to build, painful to maintain, impossible to scale.** @@ -52,4 +52,4 @@ We have built the foundation for the next decade of orchestration. - **AI-powered:** built to orchestrate workflows that are increasingly dynamic and intelligent. - **Extensible:** powered by :PluginCount plugins to integrate with everything that matters. -The countdown is on. In 7 days, we’ll reveal what will **permanently redefine orchestration.** +The countdown is on. In 7 days, we’ll reveal what will **permanently redefine orchestration.** diff --git a/content/blogs/kestra-over-databricks-workflows.md b/src/content/blogs/kestra-over-databricks-workflows.md similarity index 99% rename from content/blogs/kestra-over-databricks-workflows.md rename to src/content/blogs/kestra-over-databricks-workflows.md index ef6cd2832e4..ec9984bbc3b 100644 --- a/content/blogs/kestra-over-databricks-workflows.md +++ b/src/content/blogs/kestra-over-databricks-workflows.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset image: mproset role: -image: /blogs/kestra-over-databricks-workflows.jpg +image: "@assets/blogs/kestra-over-databricks-workflows.jpg" --- Databricks offers a robust platform for big data processing and machine learning. Yet we’ve all encountered the challenges that come with managing its workflows and clusters. These challenges aren’t about what Databricks can do, but more about the increasingly complex data ecosystems driving up costs or adding operational overhead. diff --git a/content/blogs/kestra-over-snowpipe.md b/src/content/blogs/kestra-over-snowpipe.md similarity index 99% rename from content/blogs/kestra-over-snowpipe.md rename to src/content/blogs/kestra-over-snowpipe.md index bc132221f13..47866297c33 100644 --- a/content/blogs/kestra-over-snowpipe.md +++ b/src/content/blogs/kestra-over-snowpipe.md @@ -6,7 +6,7 @@ category: Solutions author: name: Martin-Pierre Roset image: mproset -image: /blogs/kestra-over-snowpipe.jpg +image: "@assets/blogs/kestra-over-snowpipe.jpg" --- Snowflake is a leading cloud data platform that delivers scalable, real-time data solutions. Its **Snowpipe** feature automatically loads files into Snowflake from cloud storage. Though powerful, this is just the beginning. As data architectures become more complex, Snowpipe's limitations emerge, leading teams to seek orchestration solutions. diff --git a/content/blogs/kestra-reach-20k-stars.md b/src/content/blogs/kestra-reach-20k-stars.md similarity index 98% rename from content/blogs/kestra-reach-20k-stars.md rename to src/content/blogs/kestra-reach-20k-stars.md index 9e3e9b628d3..a17b1836573 100644 --- a/content/blogs/kestra-reach-20k-stars.md +++ b/src/content/blogs/kestra-reach-20k-stars.md @@ -7,7 +7,7 @@ author: name: Emmanuel Darras image: edarras role: CEO & Co-Founder -image: /blogs/20000stars.jpg +image: "@assets/blogs/20000stars.jpg" --- We've just hit **20,000 stars on GitHub**. diff --git a/content/blogs/namespace-files.md b/src/content/blogs/namespace-files.md similarity index 98% rename from content/blogs/namespace-files.md rename to src/content/blogs/namespace-files.md index b83b4cddd0d..4a77b594c48 100644 --- a/content/blogs/namespace-files.md +++ b/src/content/blogs/namespace-files.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset image: mproset role: -image: /blogs/namespace.png +image: "@assets/blogs/namespace.png" --- Engineering teams all face a familiar dilemma: strike the right balance between central governance and team autonomy or risk chaos. Centralization slows everyone down. Decentralization breeds inconsistency and risk. Most orchestration platforms force you to pick a side. **Kestra doesn’t.** Inspired by infrastructure best practices like Kubernetes, Kestra brings logical isolation, inheritance, and secure reusability to orchestration through a powerful feature called **Namespace Files**. @@ -21,7 +21,7 @@ Other engineering disciplines solved similar problems decades ago. In 2002, Linu Yet, despite namespaces' success in software infrastructure, orchestration tools have mostly overlooked their potential until now. - + ## How Kestra Leverages Namespaces diff --git a/content/blogs/observability-with-opentelemetry-traces.md b/src/content/blogs/observability-with-opentelemetry-traces.md similarity index 94% rename from content/blogs/observability-with-opentelemetry-traces.md rename to src/content/blogs/observability-with-opentelemetry-traces.md index 43e6f14b33f..f6e9a5a18ae 100644 --- a/content/blogs/observability-with-opentelemetry-traces.md +++ b/src/content/blogs/observability-with-opentelemetry-traces.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/kestra-observability.png +image: "@assets/blogs/kestra-observability.png" --- **Observability** is essential when running workflows in production. You need to know what happened, when, and why — especially when things go wrong. @@ -95,11 +95,11 @@ After launching a flow execution, go to the Jaeger UI (http://localhost:16686/), You will see traces for every API call, providing a detailed view of execution flows and interactions within the system. - + Most interesting is the trace that starts an execution. Its name is **POST /api/v1/executions/{namespace}/{id}** and you can see it has 7 spans. Click on it to view span details, including execution order and timing. - + The trace starts inside the API, then you can see 6 spans inside Kestra itself. Those spans are children of the API span, and each span has a duration that is displayed in a timeline, making it easy to analyze performance bottlenecks. @@ -109,7 +109,7 @@ Inside Kestra, there a multiple kinds of spans, but two are particularly relevan If you click on a span, you will see additional information stored inside the span. Here, clicking on **Tags** reveals execution details such as namespace, flow ID, execution ID, and task run ID. This metadata helps track executions and correlate logs with traces. - + ## Tracing parent and subflow executions @@ -135,7 +135,7 @@ tasks: If you start an execution and inspect its trace, you will see 19 spans and a correlated sub-trace for the subflow execution. - + The parent execution includes a span named **EXECUTOR - io.kestra.plugin.core.flow.Subflow**; this is the Subflow task that creates it. Following this span, you will see a correlated trace containing the 7 spans from the subflow execution. This structure helps track workflow dependencies across multiple flow executions. @@ -153,7 +153,7 @@ In the following screenshot, you can see a trace starting in an external service This service triggers a new flow execution via a webhook. The flow then makes an HTTP request using the `io.kestra.plugin.core.http.Request`, calling the **downstream** external service. Finally, you can see a trace inside the **downstream** external service for the `/hello` HTTP endpoint, linking all interactions together. - + ## Conclusion diff --git a/content/blogs/orchestration-differences.md b/src/content/blogs/orchestration-differences.md similarity index 99% rename from content/blogs/orchestration-differences.md rename to src/content/blogs/orchestration-differences.md index 115eef8c827..7fc1d7f48e9 100644 --- a/content/blogs/orchestration-differences.md +++ b/src/content/blogs/orchestration-differences.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset image: mproset role: -image: /blogs/orchestrations-differences.jpg +image: "@assets/blogs/orchestrations-differences.jpg" --- Orchestration is often misunderstood because its meaning changes based on your role. To DevOps engineers, orchestration might involve deploying containers with Kubernetes or automating deployments via GitHub Actions. Data engineers see it as managing complex ETL pipelines or streaming analytics workflows. Infrastructure teams understand orchestration as automating the provisioning of servers, networks, and cloud resources. diff --git a/content/blogs/performance-improvements-0-23.md b/src/content/blogs/performance-improvements-0-23.md similarity index 99% rename from content/blogs/performance-improvements-0-23.md rename to src/content/blogs/performance-improvements-0-23.md index 8ef9a4cecb8..b006b16ba03 100644 --- a/content/blogs/performance-improvements-0-23.md +++ b/src/content/blogs/performance-improvements-0-23.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/performances-0-23.jpg +image: "@assets/blogs/performances-0-23.jpg" --- In 0.22, the engineering team focused on performance in multiple areas, you can find the details in this blog post [Optimizing Performance in Kestra in Version 0.22](https://kestra.io/blogs/2025-04-08-performance-improvements). diff --git a/content/blogs/performance-improvements-0-24.md b/src/content/blogs/performance-improvements-0-24.md similarity index 98% rename from content/blogs/performance-improvements-0-24.md rename to src/content/blogs/performance-improvements-0-24.md index 776abf19c78..98c2e1c9b9c 100644 --- a/content/blogs/performance-improvements-0-24.md +++ b/src/content/blogs/performance-improvements-0-24.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/0-24-performance-upgrades.png +image: "@assets/blogs/0-24-performance-upgrades.png" --- In 0.23, the engineering team focused on performance in multiple areas. You can find the details in this blog post: [Optimizing Performance in Kestra in Version 0.23](https://kestra.io/blogs/performance-improvements-0.23.md). diff --git a/content/blogs/performance-improvements-1-0.md b/src/content/blogs/performance-improvements-1-0.md similarity index 99% rename from content/blogs/performance-improvements-1-0.md rename to src/content/blogs/performance-improvements-1-0.md index 9cdd2d9c906..3de12b798bf 100644 --- a/content/blogs/performance-improvements-1-0.md +++ b/src/content/blogs/performance-improvements-1-0.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/kestra-performance-1-0.jpg +image: "@assets/blogs/kestra-performance-1-0.jpg" --- In 0.24, the engineering team focused on performance in multiple areas. You can find the details in this blog post: [Optimizing Performance in Kestra in Version 0.24](https://kestra.io/blogs/performance-improvements-0.24) diff --git a/content/blogs/plugin-versioning.md b/src/content/blogs/plugin-versioning.md similarity index 99% rename from content/blogs/plugin-versioning.md rename to src/content/blogs/plugin-versioning.md index feabe3e7111..8ff9b6dde29 100644 --- a/content/blogs/plugin-versioning.md +++ b/src/content/blogs/plugin-versioning.md @@ -7,7 +7,7 @@ author: name: Martin-Pierre Roset image: mproset role: -image: /blogs/plugin-versioning.png +image: "@assets/blogs/plugin-versioning.png" --- Kestra relies on plugins to integrate with various systems and services. As workflows evolve, keeping these plugins up-to-date without breaking existing flows can become a challenge. @@ -73,7 +73,7 @@ To access this feature, navigate in the Kestra UI to **Administration > Instance Once you confirm, Kestra will download and install that plugin version into its internal repository. If the plugin was not installed before, it now appears in your list with the specified version. If an older version is already present, the new one will be added **alongside** the old one, not replacing it. The Versioned Plugins table will show the plugin with multiple versions. Kestra even flags when an update is available: you might see a notice like “New Version Available” next to an older version, with an option to **Upgrade**. - + :::alert{type="info"} After installing multiple versions, the **Versioned Plugins** page lists each plugin and the versions installed. In this example, Ansible plugin v0.21.2 is installed, and the PostgreSQL plugin v0.19.0 is installed with a newer version available (hence the Upgrade prompt). Kestra preserves the old version when upgrading, adding the new version as a separate entry. diff --git a/content/blogs/rag-with-gemini-and-langchain4j.md b/src/content/blogs/rag-with-gemini-and-langchain4j.md similarity index 98% rename from content/blogs/rag-with-gemini-and-langchain4j.md rename to src/content/blogs/rag-with-gemini-and-langchain4j.md index ba6c7299c44..f7d715f26a8 100644 --- a/content/blogs/rag-with-gemini-and-langchain4j.md +++ b/src/content/blogs/rag-with-gemini-and-langchain4j.md @@ -7,7 +7,7 @@ author: name: Loïc Mathieu image: lmathieu role: Lead Developer -image: /blogs/rag.jpg +image: "@assets/blogs/rag.jpg" --- Generative AI tools are great. However, relying purely on generative models can lead to outputs that feel generic, inaccurate, or outdated. This is where **Retrieval-Augmented Generation (RAG)** comes in, combining the creativity of Generative AI with real-time, accurate context sourced from custom data. @@ -64,7 +64,7 @@ tasks: After executing the flow, you will be able to see a new KV store entry with the serialized form of the computed embeddings. - + ### Define documents from multiple sources diff --git a/content/blogs/release-0-19.md b/src/content/blogs/release-0-19.md similarity index 98% rename from content/blogs/release-0-19.md rename to src/content/blogs/release-0-19.md index 01ef2474496..eec1d809cf1 100644 --- a/content/blogs/release-0-19.md +++ b/src/content/blogs/release-0-19.md @@ -7,7 +7,7 @@ author: name: Anna Geller image: ageller role: Product Lead -image: /blogs/release-0-19.png +image: "@assets/blogs/release-0-19.png" --- Kestra 0.19.0 has arrived, bringing a host of powerful new updates for your orchestration platform. @@ -68,7 +68,7 @@ At Kestra, we know how critical it is to have a clear view of your orchestration The previous dashboard aimed to display as much information as possible, but over time, it became cluttered and sometimes slow to load (see the image below). - + Here’s what we’ve changed: @@ -80,7 +80,7 @@ Here’s what we’ve changed: This new layout brings clarity and faster load times, and is visually appealing! See the screenshot below. - + In the future, we plan to add more customization options allowing you to set custom color palettes and create additional visuals. @@ -105,11 +105,11 @@ kestra: To access System Flows, navigate to the `Namespaces` section in the UI. The `system` namespace is pinned at the top for quick access. - + Here, you’ll find the _System Blueprints_ tab, which provides fully customizable templates tagged for system use. You can modify these templates to suit your organization’s needs. - + Video version: @@ -123,7 +123,7 @@ Keep in mind that System Flows are not restricted to System Blueprints — any v System Flows are intentionally hidden from the main UI, appearing only in the `system` namespace. The Dashboard, Flows, and Executions pages now offer a multi-select filter with options for `User` (default) and `System` (visible by default only within the `system` namespace). This makes it easy to toggle between user-facing workflows and background system flows and their executions, or view both simultaneously. - + In terms of permissions, the `system` namespace is open by default. With the namespace-level RBAC functionality in the Enterprise Edition, you can restrict access to the `system` namespace only to Admins, while assigning `company.*` namespaces to your general user base. @@ -387,7 +387,7 @@ For each Kestra execution, you can filter logs by specific levels, such as WARN Kestra 0.19.0 makes logs view [context-aware](https://github.com/kestra-io/kestra/issues/2045) — you can see all log levels while still being able to jump directly to the next `TRACE`, `DEBUG`, `INFO`, `WARN`, or `ERROR` logs. - + Using the new log-level navigation, you can quickly jump to the next log of a specific level while having the full context at your fingertips. With that additional context, it's easier to understand what led up to an issue and what followed, simplifying troubleshooting. @@ -525,7 +525,7 @@ Kestra 0.19 introduces a more convenient **view for permissions management** to In short, the new permissions view eliminates tedious clicks needed to configure roles. - + --- @@ -552,7 +552,7 @@ kestra: On the User detail page, users with basic authentication and an email set have the option to reset their password. - + --- @@ -617,11 +617,11 @@ Starting from Kestra 0.19.0, [you can schedule any flow](https://github.com/kest You can type the desired date directly, or use the date picker and click on the `Execute` button. - + That execution will be shown in the `CREATED` state and will only move into the `RUNNING` state at the scheduled date. You can see the scheduled date in the created Execution's `Overview` page: - + If you prefer a programmatic approach, you can also schedule execution for later using one of the following methods: 1. An API call @@ -760,7 +760,7 @@ Let us know how you plan to use these scheduling enhancements to make your flows The new `Concurrency` tab in the `Flow` UI page allows you to track and troubleshoot concurrency issues. [This new tab](https://github.com/kestra-io/kestra/issues/4721#event-14422957135) shows a progress bar with the number of active slots compared to the total number of slots available. Below that progress bar, you can see a table showing currently running and queued Executions, providing a clear overview of the flow's concurrency status. - + To see the concurrency behavior in action, you can configure a flow with a concurrency limit as follows: @@ -783,7 +783,7 @@ tasks: Then trigger multiple Executions of that flow and watch the `Concurrency` tab showing the active slots and queued Executions. - + --- diff --git a/content/blogs/release-0-20.md b/src/content/blogs/release-0-20.md similarity index 97% rename from content/blogs/release-0-20.md rename to src/content/blogs/release-0-20.md index 23f7b78c42a..fe332a0ba6d 100644 --- a/content/blogs/release-0-20.md +++ b/src/content/blogs/release-0-20.md @@ -7,7 +7,7 @@ author: name: Anna Geller image: ageller role: Product Lead -image: /blogs/release-0-20.png +image: "@assets/blogs/release-0-20.png" --- @@ -65,7 +65,7 @@ However, teams often need *physical* data isolation per organizational unit. Sta To configure dedicated storage and secrets backends per tenant, navigate to the respective tenant in the UI, click on `Edit`, and select the storage and secrets backend you want to use. You can configure the same on a namespace level if you want multiple teams to work in their isolated workspaces but still be able to have shared workflow dependencies (using subflows or flow triggers). - + This feature enables decentralized workspaces for individual business units with centralized governance for operational teams. @@ -77,17 +77,17 @@ Previously, administrators needed to create users manually and then assign roles By default, if the email server is configured in Kestra EE, we send an email with an invitation link. If the email server isn’t configured, you can manually share the link with invited users. - + ## Announcements You can now add [custom announcements](https://kestra.io/docs/enterprise/announcements) from the Kestra UI to inform users about planned maintenance, outages, or incidents. This feature helps communicate important events directly from the UI. - + Announcements appear as banners of the chosen type (`Info`, `Warning`, `Error`) for the specified time period. - + ## System Labels @@ -275,13 +275,13 @@ errors: The new sidebar on the right side of the Kestra UI provides quick access to the latest product news, documentation, and other resources. You can now stay up-to-date and browse the docs (soon contextual!) without leaving the UI. - + ## Bookmarks You can now [bookmark any Kestra UI page](https://kestra.io/docs/ui/bookmarks) with your selected filters which is particularly handy when you need quick access to specific filtered views, such as _"Failed Executions within the last 2 days"_. This new feature makes frequently-used pages available at a fingertip. - + ## Transactional Queries @@ -293,7 +293,7 @@ In short, you can use this feature to safely execute sequences of SQL operations The filter and search bars have been improved to better handle more complex filtering criteria. You can now adjust filters on any UI page simply by typing your filter criteria. The improved filtering system applies across different parts of the Kestra UI, including the main Dashboard, Executions, Logs, Flows, Apps, and more. - + ## Enhancements to dbt diff --git a/content/blogs/release-0-21.md b/src/content/blogs/release-0-21.md similarity index 98% rename from content/blogs/release-0-21.md rename to src/content/blogs/release-0-21.md index 28b628a3e31..9ec63064a32 100644 --- a/content/blogs/release-0-21.md +++ b/src/content/blogs/release-0-21.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Benoit Pimpaud image: bpimpaud -image: /blogs/release-0-21.jpg +image: "@assets/blogs/release-0-21.jpg" --- Kestra 0.21 introduces no-code forms for simpler workflow creation, customizable dashboards for more flexible monitoring, a new core property for cleanup tasks, advanced log forwarding across your entire infrastructure, and several other improvements. @@ -69,7 +69,7 @@ triggers: ``` ::: - + :::collapse{title="Expand for an example with AWS CloudWatch"} @@ -97,7 +97,7 @@ triggers: ``` ::: - + ### New No Code Experience @@ -178,9 +178,9 @@ charts: ``` ::: - + - + You can find Dashboard blueprints from the left side menu. diff --git a/content/blogs/release-0-22.md b/src/content/blogs/release-0-22.md similarity index 98% rename from content/blogs/release-0-22.md rename to src/content/blogs/release-0-22.md index 4c4e6443302..9852858a261 100644 --- a/content/blogs/release-0-22.md +++ b/src/content/blogs/release-0-22.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Benoit Pimpaud image: bpimpaud -image: /blogs/release-0-22.jpg +image: "@assets/blogs/release-0-22.jpg" --- @@ -71,9 +71,9 @@ The UI clearly distinguishes externally managed secrets with a lock icon, provid For detailed instructions on how to configure and use this feature, visit the [Read-Only Secrets Backends documentation](../docs/enterprise/governance/read-only-secrets). - + - + ### New flow-level property called `afterExecution` @@ -200,7 +200,7 @@ Once LDAP integration is set up, users logging into Kestra for the first time wi For detailed information on setting up and configuring LDAP in Kestra, check our [LDAP documentation](/docs/enterprise/auth/sso/ldap). - + ### New Log Shipper plugins diff --git a/content/blogs/release-0-23.md b/src/content/blogs/release-0-23.md similarity index 99% rename from content/blogs/release-0-23.md rename to src/content/blogs/release-0-23.md index 6b7d566676f..03bc43b8f0f 100644 --- a/content/blogs/release-0-23.md +++ b/src/content/blogs/release-0-23.md @@ -6,7 +6,7 @@ category: News & Product Updates author: name: Benoit Pimpaud image: bpimpaud -image: /blogs/release-0-23.jpg +image: "@assets/blogs/release-0-23.jpg" --- @@ -322,7 +322,7 @@ triggers: **Pebble Function Autocompletion**: When editing Pebble expressions (`{{ ... }}`), function names autocomplete as you type. - + **Worker Information in Task Execution**: Task execution details now show the worker ID, hostname, version, and state. Example: `bbbe25da-06fe-42c2-b50f-4deeba2bb3ba: Hostname=postgres-ee-preview-67c9bbcd56-4fnvr, Version=0.23.0-SNAPSHOT, State=RUNNING`. diff --git a/content/blogs/release-0-24.md b/src/content/blogs/release-0-24.md similarity index 98% rename from content/blogs/release-0-24.md rename to src/content/blogs/release-0-24.md index 22e739e00e8..76cdf65a062 100644 --- a/content/blogs/release-0-24.md +++ b/src/content/blogs/release-0-24.md @@ -7,7 +7,7 @@ authors: - name: Anna Geller image: ageller role: Product Lead -image: /blogs/release-0-24.jpg +image: "@assets/blogs/release-0-24.jpg" --- @@ -63,7 +63,7 @@ To see Playground in action, check out the demo below. :::alert{type="warning"} Note that Playground mode is **currently in Beta**, and we welcome your feedback and suggestions for improvements. You can enable it directly from the Kestra UI from the **Settings** page simply by toggling on the `Playground` button: - + ::: @@ -327,14 +327,14 @@ tasks: messageText: "Current news from {{ inputs.city }}: {{ outputs.news.outputText }}" ``` - + ## New Execution dependency view The new Execution dependency view allows you to follow runtime dependencies from the first parent to the last child flow. It simplifies troubleshooting long execution chains by providing a clear overview of the relationships between each execution and those that precede or follow it. - + ## Listing all flow dependencies (EE only) @@ -346,7 +346,7 @@ When running Kestra locally, you can access the documentation for this endpoint The new [CSV Export](https://github.com/kestra-io/kestra/issues/9368) is a handy feature that allows you to export tabular data from any dashboard into a CSV file for reporting and daily operations. You can use it to analyze data in Excel or Google Sheets, or to share data with stakeholders who work with spreadsheets. - + ## New universal file protocol @@ -389,7 +389,7 @@ pluginDefaults: - python hello.py ``` - + ### Allowed paths @@ -475,11 +475,11 @@ tasks: We've introduced a new Apps Catalog to the Enterprise Edition, which allows you to showcase your Apps to the entire company in a new list or gallery view. This feature is designed to help teams discover and share Apps, making it easier to build workflows and automate processes across the organization. - + The Apps catalog is offered as a dedicated page without showing any typical Kestra UI elements, such as the sidebar or header. This makes it easy to share the catalog with non-technical users who may not be familiar with Kestra. The catalog is accessible via a dedicated URL in the format `http://your_host/ui/your_tenant/apps/catalog`, which can be shared with anyone in your organization who has at least `APP`-Read and `APPEXECUTION`-Read permissions in that Kestra tenant (adding all `APPEXECUTION` permissions is recommended). - + ## Custom UI Links (EE only) @@ -515,7 +515,7 @@ kestra: The links will show up in the sidebar, allowing users to quickly access important resources without leaving the Kestra UI. - + ## Unit Test Improvements (EE only) @@ -558,7 +558,7 @@ testCases: When you run this test, Kestra will execute the flow and verify that the output value matches the expected value. If the assertion fails, the test will be marked as failed, and you can inspect the execution logs to see what went wrong. - + ## Mandatory Authentication in OSS diff --git a/content/blogs/release-1-0.md b/src/content/blogs/release-1-0.md similarity index 98% rename from content/blogs/release-1-0.md rename to src/content/blogs/release-1-0.md index 3b89661b8e7..5d964fe145c 100644 --- a/content/blogs/release-1-0.md +++ b/src/content/blogs/release-1-0.md @@ -7,7 +7,7 @@ authors: - name: Anna Geller image: ageller role: Product Lead -image: /blogs/release-1-0.jpg +image: "@assets/blogs/release-1-0.jpg" --- The table below highlights the key features of this release. @@ -107,7 +107,7 @@ flowchart LR With Kestra 1.0, we've also added AI-powered search on the Kestra website, bringing more relevant and contextual answers right where you need them. Built on top of the same AI plugin used by AI Agents, this feature leverages Retrieval-Augmented Generation (RAG) to ground responses in the official Kestra documentation. You can ask questions in natural language, such as "How do I configure a flow schedule?", and the search will return a summary based on the most relevant docs so you don't have to manually scan through multiple pages. - + --- @@ -201,7 +201,7 @@ With Playground, you can execute individual tasks in sequence, reusing outputs f In summary, Playground gives you a safe, iterative space to prototype new workflows before running them in production. - + The video below shows how to use Playground to build a flow step by step: @@ -219,7 +219,7 @@ Since its Beta release, we've extended Plugin Versioning to work with **plugin d Any new or updated plugin version is instantly synchronized across your environment without downtime, ensuring you can upgrade safely and keep full control over your plugin ecosystem. - + --- @@ -230,7 +230,7 @@ To further improve the reliability of your flows, Kestra 1.0 brings Unit Tests o Since the initial release, we've redesigned the Unit Tests UI to show the test definition, flow code, and documentation side by side, making it easier to write and maintain tests. New UI tabs allow you to track all Test Runs and related Audit Logs. - + You can now also run tests programmatically from a flow using the new `RunTest` and `RunTests` tasks. This allows you to trigger tests on demand for: - all tests in a given **tenant**, @@ -300,7 +300,7 @@ Traditionally, Apps in Kestra are defined as code, specifying layout blocks and Just like with the multi-panel Flow Editor, you can open, reorder, and close any combination of panels (incl. No-Code, App Code, Documentation, Preview and Blueprints) to build a personalized workspace. The No-Code form editor simplifies the creation of complex App layouts, making it easier to design interactive Apps for internal tools, dashboards, or data request forms without needing to start from raw YAML. - + --- diff --git a/content/blogs/serverless-data-pipelines.md b/src/content/blogs/serverless-data-pipelines.md similarity index 98% rename from content/blogs/serverless-data-pipelines.md rename to src/content/blogs/serverless-data-pipelines.md index 177dcb36893..08d1df19cc0 100644 --- a/content/blogs/serverless-data-pipelines.md +++ b/src/content/blogs/serverless-data-pipelines.md @@ -7,7 +7,7 @@ author: name: Anna Geller image: ageller role: Product Lead -image: /blogs/serverless-data-pipelines.jpg +image: "@assets/blogs/serverless-data-pipelines.jpg" --- Building data pipelines often comes down to getting the right compute power when you need it. With serverless options like Modal and BigQuery, you can focus on your workflows without having to think about infrastructure. In this post, we'll walk through a real-world example of a serverless data pipeline where we use **Kestra** for orchestration, **Modal** for on-demand compute, **dbt** for data transformations, and **BigQuery** for data storage and querying. Based on this example, we'll explore why [Kestra](https://github.com/kestra-io/kestra) is a great choice for orchestrating serverless data pipelines and how it can help you build interactive workflows that dynamically adapt compute to your needs. @@ -18,7 +18,7 @@ You can find the entire code for this project in the [kestra-io/serverless](http Here is a conceptual overview of the project: - + ## Serverless Workflow in Action diff --git a/content/blogs/use-case-apps.md b/src/content/blogs/use-case-apps.md similarity index 97% rename from content/blogs/use-case-apps.md rename to src/content/blogs/use-case-apps.md index b540c2d7b09..6a39ef9b14f 100644 --- a/content/blogs/use-case-apps.md +++ b/src/content/blogs/use-case-apps.md @@ -6,7 +6,7 @@ category: Solutions author: name: Benoit Pimpaud image: bpimpaud -image: /blogs/use-case-apps.jpg +image: "@assets/blogs/use-case-apps.jpg" --- Automation focuses on the execution of tasks—triggering scripts, transferring data, or running jobs. Orchestration, however, operates at a higher level: coordinating these tasks, defining dependencies, and ensuring everything flows across systems and teams. @@ -96,9 +96,9 @@ tasks: ``` - + - + This example is one of the many one can imagine! Providing a simple interface for any users to request infrastructure deployment, file access, days off for holiday, etc. There are tons of cases where these need custom specifications and underlying automation. @@ -246,8 +246,8 @@ layout: ``` - - + + ## Simple Interfaces for Everyday Automation @@ -424,15 +424,15 @@ layout: With Kestra Apps, this workflow is paired with a simple UI that allows users to provide input and see results. Here is our main user interface. Here the user is asked the general user context - + LLMs are doing the work under the hood - + And then we get a potential answer for our user - + This example is just one of many. Whether automating lead qualification, simplifying infrastructure requests, or responding to customer inquiries, Kestra Apps make automation accessible to all teams. diff --git a/content/cloud-license-agreement.md b/src/content/cloud-license-agreement.md similarity index 100% rename from content/cloud-license-agreement.md rename to src/content/cloud-license-agreement.md diff --git a/content/cookie-policy.md b/src/content/cookie-policy.md similarity index 100% rename from content/cookie-policy.md rename to src/content/cookie-policy.md diff --git a/content/data-processing-agreement.md b/src/content/data-processing-agreement.md similarity index 100% rename from content/data-processing-agreement.md rename to src/content/data-processing-agreement.md diff --git a/content/docs/01.getting-started/01.quickstart.md b/src/content/docs/01.getting-started/01.quickstart.md similarity index 100% rename from content/docs/01.getting-started/01.quickstart.md rename to src/content/docs/01.getting-started/01.quickstart.md diff --git a/content/docs/01.getting-started/02.plugins.md b/src/content/docs/01.getting-started/02.plugins.md similarity index 100% rename from content/docs/01.getting-started/02.plugins.md rename to src/content/docs/01.getting-started/02.plugins.md diff --git a/content/docs/01.getting-started/03.contributing.md b/src/content/docs/01.getting-started/03.contributing.md similarity index 98% rename from content/docs/01.getting-started/03.contributing.md rename to src/content/docs/01.getting-started/03.contributing.md index df2cedd46c4..e1e4ad8ec65 100644 --- a/content/docs/01.getting-started/03.contributing.md +++ b/src/content/docs/01.getting-started/03.contributing.md @@ -70,11 +70,11 @@ You can also build it from a terminal using `./gradlew build`. The Gradle wrappe - The main class is `io.kestra.cli.App` from module `kestra.cli.main`. - Pass as program arguments the server you want to develop, for example `server standalone` starts a standalone Kestra server. - The Intellij Idea configuration can be found in screenshot below: - + - `MICRONAUT_ENVIRONMENTS`: can be set as any string and will load a custom configuration file in `cli/src/main/resources/application-{env}.yml` - `KESTRA_PLUGINS_PATH`: is the path where you save plugins as Jar and is loaded during the startup process - If you encounter **JavaScript memory heap out** error during startup, configure `NODE_OPTIONS` environment variable with some large value. - - Example `NODE_OPTIONS: --max-old-space-size=4096` or `NODE_OPTIONS: --max-old-space-size=8192`  + - Example `NODE_OPTIONS: --max-old-space-size=4096` or `NODE_OPTIONS: --max-old-space-size=8192`  - You can also use the gradle task `./gradlew runLocal` that runs a standalone server with `MICRONAUT_ENVIRONMENTS=override` and plugins path `local/plugins` - The server start by default on port 8080 and is reachable on `http://localhost:8080`. diff --git a/content/docs/01.getting-started/04.docs-contributor-guide.md b/src/content/docs/01.getting-started/04.docs-contributor-guide.md similarity index 97% rename from content/docs/01.getting-started/04.docs-contributor-guide.md rename to src/content/docs/01.getting-started/04.docs-contributor-guide.md index 88d06045a9f..a7f28e98d64 100644 --- a/content/docs/01.getting-started/04.docs-contributor-guide.md +++ b/src/content/docs/01.getting-started/04.docs-contributor-guide.md @@ -68,7 +68,7 @@ Follow the [Quickstart Guide](./01.quickstart.md) to install Kestra and start bu And the page displays the following with all the sub topics of "Getting Started" listed with their card and icon: - + Note that when writing a standalone documentation page, the first sentence appears in the ChildCard view to introduce the topic. In the above example for [Quickstart Guide](01.quickstart.md) this sentence is visible: @@ -94,7 +94,7 @@ docId: apps And this is the resulting view: - + Let's discuss each property in more detail. @@ -118,7 +118,7 @@ topics: And appears on the site as follows: - + The icon lives in the `public/docs/icons` folder path and is specified as [Neon](https://neon.tech/home), so the correct logo shows for the tool. General icons, such as `api.svg` or `installation.svg`, are also available in the folder. If you contribute a guide incorporating a tool without an existing icon, place the appropriate SVG file in this folder and reference it in the front matter. @@ -184,7 +184,7 @@ One of Kestra's major benefits is its in-app contextual docs. This means that wh Kestra knows that you are working with Apps, and it can show you the relevant documentation without a task switch. - + The same is true for all the main components of Kestra (e.g., Namespace, Flow, Blueprints, Plugins, etc.). @@ -216,7 +216,7 @@ Yippee, it worked. :::alert{type="warning"} This is a warning, but it's fine. - + ::: Another helpful component we use is `::collapse`. This tag keeps the documentation space-efficient and hides long examples or other information that does not need to be seen when scrolling the page. Still, the reader can open it up to reveal its content. This is particularly useful for flows that could otherwise take up a lot of space on a page or FAQ Answers that may not be relevant to every reader and can be selected as needed. @@ -333,7 +333,7 @@ The supported languages for code blocks are fully listed in the `useShiki.ts` fi Images are a key part of the documentation. We organize images by topic and section in the documentation to make them easy to find and add. Taking this guide as an example, an image we used earlier in the guide appears in the markdown as follows: ```markdown - + ``` The image has a clear title and is located in an image folder called `docs-contributor-guide` in the `public/docs` directory of the repository. For this guide, all images are placed in this folder path so the organization is clear and easily worked with by another contributor. This same practice is used for our blog and other parts of the website that are kept in the repository. @@ -352,7 +352,7 @@ To contribute to a plugin's documentation, fork the repository. Once cloned, con Continuing with [OpenAI](/plugins/plugin-openai), the tasks include [ChatCompletion](/plugins/plugin-openai/io.kestra.plugin.openai.chatcompletion) and [CreateImage](/plugins/plugin-openai/io.kestra.plugin.openai.createimage). - + Each task is in the path `src/main/java/io/kestra/plugin/openai`. This will be similar to all other plugins (i.e., `src/main/java/io/kestra/plugin/`). To improve or add to the documentation, open the Java file for the task and edit the `@Schema`, `@Plugin`, and `@Example` doc strings. @@ -471,6 +471,6 @@ For the Blueprint to be easily searchable, it is essential to include the approp With the proper YAML and extension, the Flow's topology will display interactively on the Blueprint page along with a **Copy source code** button and task icons. - + If you have ideas for new blueprints or existing titles, descriptions, or examples that could be improved, create a pull request or an issue on the [Blueprints repository](http://github.com/kestra-io/blueprints). We will happily review and merge it into the set. diff --git a/content/docs/01.getting-started/05.community-guidelines.md b/src/content/docs/01.getting-started/05.community-guidelines.md similarity index 100% rename from content/docs/01.getting-started/05.community-guidelines.md rename to src/content/docs/01.getting-started/05.community-guidelines.md diff --git a/content/docs/01.getting-started/index.md b/src/content/docs/01.getting-started/index.md similarity index 100% rename from content/docs/01.getting-started/index.md rename to src/content/docs/01.getting-started/index.md diff --git a/content/docs/01.getting-started/selected-plugin-installation.md b/src/content/docs/01.getting-started/selected-plugin-installation.md similarity index 100% rename from content/docs/01.getting-started/selected-plugin-installation.md rename to src/content/docs/01.getting-started/selected-plugin-installation.md diff --git a/content/docs/02.installation/02.docker.md b/src/content/docs/02.installation/02.docker.md similarity index 100% rename from content/docs/02.installation/02.docker.md rename to src/content/docs/02.installation/02.docker.md diff --git a/content/docs/02.installation/03.docker-compose.md b/src/content/docs/02.installation/03.docker-compose.md similarity index 100% rename from content/docs/02.installation/03.docker-compose.md rename to src/content/docs/02.installation/03.docker-compose.md diff --git a/content/docs/02.installation/03.kubernetes.md b/src/content/docs/02.installation/03.kubernetes.md similarity index 100% rename from content/docs/02.installation/03.kubernetes.md rename to src/content/docs/02.installation/03.kubernetes.md diff --git a/content/docs/02.installation/04.kubernetes-aws-eks.md b/src/content/docs/02.installation/04.kubernetes-aws-eks.md similarity index 100% rename from content/docs/02.installation/04.kubernetes-aws-eks.md rename to src/content/docs/02.installation/04.kubernetes-aws-eks.md diff --git a/content/docs/02.installation/05.kubernetes-gcp-gke.md b/src/content/docs/02.installation/05.kubernetes-gcp-gke.md similarity index 94% rename from content/docs/02.installation/05.kubernetes-gcp-gke.md rename to src/content/docs/02.installation/05.kubernetes-gcp-gke.md index 922e31ca976..3b8236be949 100644 --- a/content/docs/02.installation/05.kubernetes-gcp-gke.md +++ b/src/content/docs/02.installation/05.kubernetes-gcp-gke.md @@ -93,9 +93,9 @@ This configuration links your Kubernetes service account to the GCP service acco 7. Choose the appropriate region and zonal availability. 8. Click create and wait for completion. - + - + **Enable VM connection to database** @@ -105,9 +105,9 @@ This configuration links your Kubernetes service account to the GCP service acco 4. Click on **Done** in the section. 5. Click on **Save** on the page. - + - + **Create database user** @@ -115,9 +115,9 @@ This configuration links your Kubernetes service account to the GCP service acco 2. Click on **Add User Account**. 3. Put an appropriate username and password and click on **Add**. - + - + **Create Kestra database** diff --git a/content/docs/02.installation/06.kubernetes-azure-aks.md b/src/content/docs/02.installation/06.kubernetes-azure-aks.md similarity index 96% rename from content/docs/02.installation/06.kubernetes-azure-aks.md rename to src/content/docs/02.installation/06.kubernetes-azure-aks.md index eec3f603d92..ce43d7a0262 100644 --- a/content/docs/02.installation/06.kubernetes-azure-aks.md +++ b/src/content/docs/02.installation/06.kubernetes-azure-aks.md @@ -69,11 +69,11 @@ For a production-grade installation, we recommend a managed database service suc 11. Click **Review + Create**. Review the configurations and click **Create**. 12. Wait for the database to be provisioned. - + - + - + **Create a Kestra database** diff --git a/content/docs/02.installation/08.aws-ec2.md b/src/content/docs/02.installation/08.aws-ec2.md similarity index 91% rename from content/docs/02.installation/08.aws-ec2.md rename to src/content/docs/02.installation/08.aws-ec2.md index 083b1cfa826..8e6a328848b 100644 --- a/content/docs/02.installation/08.aws-ec2.md +++ b/src/content/docs/02.installation/08.aws-ec2.md @@ -28,11 +28,11 @@ First, create an EC2 instance. To do so, [go to the AWS console and choose EC2]( 4. Create a key-pair to securely connect to your instance. This key is needed to connect through SSH in the following steps. 5. Create a security group that allows SSH traffic from your IP and also allow HTTPS traffic. - + - + - + You can now click on **Launch instance** and wait a few seconds for the instance to be up and running. @@ -83,7 +83,7 @@ Note that if you haven't set up basic authentication in the previous step, your ::: - + You can now access your Kestra instance and create, edit, and run Flows. @@ -106,11 +106,11 @@ However, for a production-grade installation, we recommend a managed database se 5. Fine-tune instance class and storage type to avoid import AWS costs. For a first step, a small PostgreSQL instance is enough. 6. Click create and wait for completion - + - + - + **Create Kestra database** @@ -159,7 +159,7 @@ kestra: 6. Restart docker services. - + For more information on S3 storage configuration, check out the [S3 configuration guide](../configuration/index.md#s3). diff --git a/content/docs/02.installation/09.gcp-vm.md b/src/content/docs/02.installation/09.gcp-vm.md similarity index 82% rename from content/docs/02.installation/09.gcp-vm.md rename to src/content/docs/02.installation/09.gcp-vm.md index f7201094f89..f28b9868574 100644 --- a/content/docs/02.installation/09.gcp-vm.md +++ b/src/content/docs/02.installation/09.gcp-vm.md @@ -28,13 +28,13 @@ First, create a VM instance using the Compute Engine. To do so, [go to the GCP c 7. Under the "Public Images" tab, choose **Ubuntu** as the operating system and the **Ubuntu 22.04 LTS** version. 8. Continue with the **Allow default access** access scope, and select **Allow HTTPS traffic** in the Firewall section. - + - + - + - + You can now click on **Create** and wait a few seconds for the VM instance to be up and running. @@ -42,7 +42,7 @@ You can now click on **Create** and wait a few seconds for the VM instance to be Click on the **SSH** button on the right side of the VM instance details to SSH into the VM instance terminal. Click on the **Authorize** button in the pop-up to authorize the SSH connection into the VM instance. - + Kestra can be started directly from a `.jar` binary or using Docker. We use Docker here for a quicker setup. Install Docker on the GCP VM instance. You can find the last updated [instruction on the Docker website](https://docs.docker.com/engine/install/ubuntu/). @@ -70,13 +70,13 @@ kestra: password: kestra ``` - + - + - + - + :::alert{type="warning"} @@ -105,11 +105,11 @@ However, for a production-grade installation, we recommend a managed database se 7. Choose the appropriate region and zonal availability. 8. Expand Show `Show Configuration Options` at the bottom of the page. - + - + - + **Enable VM connection to database** @@ -120,19 +120,19 @@ However, for a production-grade installation, we recommend a managed database se 5. Click on `Create Connection`. - + - + - + - + **Enable Deletion** If you are just testing or would like to be able to delete your instance and all of its data, then expand the `Data Protection` on the left hand side and make sure `Enable deletion protection` is UNCHECKED. - + **Create database user** @@ -140,9 +140,9 @@ If you are just testing or would like to be able to delete your instance and all 2. Click **Add User Account**. 3. Put an appropriate username and password and click **Add**. - + - + **Create Kestra database** diff --git a/content/docs/02.installation/10.azure-vm.md b/src/content/docs/02.installation/10.azure-vm.md similarity index 92% rename from content/docs/02.installation/10.azure-vm.md rename to src/content/docs/02.installation/10.azure-vm.md index 819dbdc570b..d0c0460daa4 100644 --- a/content/docs/02.installation/10.azure-vm.md +++ b/src/content/docs/02.installation/10.azure-vm.md @@ -28,15 +28,15 @@ First, create a virtual machine using Azure Virtual Machines. To do so, go to th 11. Click **Review + Create**. 12. You can now review the configurations and click on **Create**. On the **Generate new key pair** popup, click **Download private key and create** resource. - + - + - + Wait until the virtual machine is up and running. - + ## Install Docker @@ -90,9 +90,9 @@ Kestra is now running and the Kestra server exposes traffic on the `8080` port. If you want to only allow traffic coming from your local machine, set the **Source** to your own IP address. To open the instance to the entire Internet, leave it as **Any**. - + - + :::alert{type="warning"} If you haven’t set up basic authentication, your Kestra instance will be publicly accessible to anyone without authentication. @@ -123,11 +123,11 @@ However, for a production-grade installation, we recommend a managed database se 11. Click **Review + Create**. Review the configurations and click **Create**. 12. Wait for the database to be provisioned. - + - + - + **Create a Kestra database** diff --git a/content/docs/02.installation/11.digitalocean-droplet.md b/src/content/docs/02.installation/11.digitalocean-droplet.md similarity index 78% rename from content/docs/02.installation/11.digitalocean-droplet.md rename to src/content/docs/02.installation/11.digitalocean-droplet.md index 33b71bb76e7..a4552a1f386 100644 --- a/content/docs/02.installation/11.digitalocean-droplet.md +++ b/src/content/docs/02.installation/11.digitalocean-droplet.md @@ -23,17 +23,17 @@ First, we need to create a virtual machine known as a Droplet in DigitalOcean. T 5. You can choose an appropriate authentication method: SSH Key or Password based. 6. Provide an appropriate hostname and click on the `Create Droplet` button at the bottom. - + - + - + - + Wait until the virtual machine is up and running. From the Droplets page, you can navigate to the recently created Droplet. From here, you can open the machine's console by clicking on the `Console` button at the top. - + ## Install Docker @@ -90,11 +90,11 @@ However, for a production-grade installation, we recommend a managed database se 6. Click on the `Create Database Cluster` button at the bottom of the page. 7. Wait for the database to be provisioned. Generally, this takes around 5 minutes. - + - + - + 8. Once the database is ready, you can click on the `Get Started` button. 9. In the `Add trusted sources` dropbox, you can select your computer (in case you want to connect to this database from the PostgreSQL client running on your computer) and the `kestra-host` droplet created in the earlier section. @@ -102,22 +102,22 @@ However, for a production-grade installation, we recommend a managed database se 11. On this page, ensure `Public network` is selected on the top. Take a note of the Connection Details that appear, and click on `Continue`. 12. On the next page, click on `Great, I'm done` button. - + - + - + - + **Create a Kestra database** 1. Go to the database overview page and navigate to `Users & Databases` tab. 2. Under `Databases`, type an appropriate database name and click on `Save`. - + - + **Update Kestra configuration** @@ -155,11 +155,11 @@ First, we create the access key and secret key that can be used to connect to Sp 4. Provide an appropriate name for the spaces access key and click on `Create Access Key`. 5. A new access key with the given name will be generated. Take a note of the secret key as you will not be able to retrieve it later. - + - + - + Let's create a bucket in the Spaces Object Storage. @@ -187,13 +187,13 @@ kestra: In order for the changes to take effect, restart the docker services with `sudo docker compose restart` or `sudo docker compose up -d`. - + - + - + - + ## Next steps diff --git a/content/docs/02.installation/12.standalone-server.md b/src/content/docs/02.installation/12.standalone-server.md similarity index 100% rename from content/docs/02.installation/12.standalone-server.md rename to src/content/docs/02.installation/12.standalone-server.md diff --git a/content/docs/02.installation/14.podman-compose.md b/src/content/docs/02.installation/14.podman-compose.md similarity index 100% rename from content/docs/02.installation/14.podman-compose.md rename to src/content/docs/02.installation/14.podman-compose.md diff --git a/content/docs/02.installation/15.kestra-cloud.md b/src/content/docs/02.installation/15.kestra-cloud.md similarity index 100% rename from content/docs/02.installation/15.kestra-cloud.md rename to src/content/docs/02.installation/15.kestra-cloud.md diff --git a/content/docs/02.installation/index.md b/src/content/docs/02.installation/index.md similarity index 100% rename from content/docs/02.installation/index.md rename to src/content/docs/02.installation/index.md diff --git a/content/docs/03.tutorial/01.fundamentals.md b/src/content/docs/03.tutorial/01.fundamentals.md similarity index 96% rename from content/docs/03.tutorial/01.fundamentals.md rename to src/content/docs/03.tutorial/01.fundamentals.md index c82a5c5eb41..06f54a84589 100644 --- a/content/docs/03.tutorial/01.fundamentals.md +++ b/src/content/docs/03.tutorial/01.fundamentals.md @@ -148,7 +148,7 @@ Apart from **core tasks**, the [plugins library](/plugins) provides a wide range Now, let's create and run your first flow. On the left side of the screen, click on the **Flows** menu. Then, click on the **Create** button. - + Paste the following code into the Flow editor: @@ -164,12 +164,12 @@ tasks: Then, hit the **Save** button. - + This flow has a single task that will fetch data from the [dummyjson](https://dummyjson.com/) API. Let's run it! - + After execution, you’ll be directed to the Gantt view to see the stages of your flow’s progress. In this simple example, we see the API request successfully execute. We'll continue adding more to our flow in the coming sections. - + diff --git a/content/docs/03.tutorial/02.inputs.md b/src/content/docs/03.tutorial/02.inputs.md similarity index 98% rename from content/docs/03.tutorial/02.inputs.md rename to src/content/docs/03.tutorial/02.inputs.md index 49761cdea44..1a938c2d844 100644 --- a/content/docs/03.tutorial/02.inputs.md +++ b/src/content/docs/03.tutorial/02.inputs.md @@ -36,7 +36,7 @@ tasks: Try running the above flow with different values for the `user` input. You can do this by clicking on the **Execute** button in the UI and then typing the desired value in the menu. For any downstream task, inputs are accessible using expressions. - + :::alert{type="info"} The plural form `defaults` is used instead of `default` for two reasons. First, `default` is a reserved keyword in Java, so it couldn't be used. Second, this property allows you to set default values for a JSON object which can be an array that simultaneously defines multiple default values. diff --git a/content/docs/03.tutorial/03.outputs.md b/src/content/docs/03.tutorial/03.outputs.md similarity index 97% rename from content/docs/03.tutorial/03.outputs.md rename to src/content/docs/03.tutorial/03.outputs.md index 3413525e6fa..aa0179338df 100644 --- a/content/docs/03.tutorial/03.outputs.md +++ b/src/content/docs/03.tutorial/03.outputs.md @@ -18,7 +18,7 @@ Similar to inputs, use [expressions](../expressions/index.md) to access outputs If your task `id` contains one or more hyphens (`-`), wrap the task `id` in square brackets, for example: `{{ outputs['task-id'].output_property }}`. To see which outputs have been generated during a flow execution, go to the **Outputs** tab on the Execution page: - + Outputs are useful for troubleshooting and auditing. Additionally, you can use outputs to: - share **downloadable artifacts** with business stakeholders (e.g., a table generated by a SQL query or a CSV file generated by a Python script) @@ -73,7 +73,7 @@ When referencing the output from the previous task, this flow uses `jq` [languag You can test `{{ outputs.task_id.body | jq('.products') | first }}` and any other output parsing expression using the built-in expressions evaluator on the **Outputs** page: - + --- @@ -118,7 +118,7 @@ tasks: This example flow passes data between tasks using outputs. The `inputFiles` argument of the `io.kestra.plugin.jdbc.duckdb.Query` task allows you to pass files from internal storage to the task. The `store: true` property ensures that the result of the SQL query is stored in the internal storage and can be previewed and downloaded from the Outputs tab. - + To sum up, our flow extracts data from an API, uses that data in a Python script, executes a SQL query, and generates a downloadable artifact. diff --git a/content/docs/03.tutorial/04.triggers.md b/src/content/docs/03.tutorial/04.triggers.md similarity index 100% rename from content/docs/03.tutorial/04.triggers.md rename to src/content/docs/03.tutorial/04.triggers.md diff --git a/content/docs/03.tutorial/05.flowable.md b/src/content/docs/03.tutorial/05.flowable.md similarity index 98% rename from content/docs/03.tutorial/05.flowable.md rename to src/content/docs/03.tutorial/05.flowable.md index e51bd179154..2f97fdd9b4d 100644 --- a/content/docs/03.tutorial/05.flowable.md +++ b/src/content/docs/03.tutorial/05.flowable.md @@ -17,7 +17,7 @@ For example, you can use the [If task](/plugins/core/tasks/flows/io.kestra.plugi The following flow is an example of the If task in action. Calling back to [dummyjson](https://dummyjson.com), an API request is made based on the product category input of either `beauty` or `notebook` (one does not exist). -The `if` task has a `condition` of `"{{ json(outputs.api.body).products | length > 0 }}"` (i.e., checking whether the API body is not empty and contains at least one product). The log message then depends on whether the actual product category exists or not. +The `if` task has a `condition` of `"{{ json(outputs.api.body).products | length > 0 }}"` (i.e., checking whether the API body is not empty and contains at least one product). The log message then depends on whether the actual product category exists or not. ```yaml id: getting_started @@ -73,7 +73,7 @@ tasks: After execution, the Gantt view shows separate runs for each of the three listed authors in the task. - + ## Add parallelism using Flowable tasks @@ -127,5 +127,5 @@ tasks: ``` These examples, while simple, demonstrate the flexibility of flowable tasks in both simple and complex workflows. - + To learn more about flowable tasks and see more examples, check out the full [flowable tasks documentation](../04.workflow-components/01.tasks/00.flowable-tasks.md). diff --git a/content/docs/03.tutorial/06.errors.md b/src/content/docs/03.tutorial/06.errors.md similarity index 98% rename from content/docs/03.tutorial/06.errors.md rename to src/content/docs/03.tutorial/06.errors.md index 088da2e5003..e4a68a41889 100644 --- a/content/docs/03.tutorial/06.errors.md +++ b/src/content/docs/03.tutorial/06.errors.md @@ -86,7 +86,7 @@ triggers: Adding this flow ensures you receive a Slack alert for any flow failure in the `company.team` namespace. - + --- diff --git a/content/docs/03.tutorial/07.scripts.md b/src/content/docs/03.tutorial/07.scripts.md similarity index 99% rename from content/docs/03.tutorial/07.scripts.md rename to src/content/docs/03.tutorial/07.scripts.md index a10686213c7..f1563bdef3c 100644 --- a/content/docs/03.tutorial/07.scripts.md +++ b/src/content/docs/03.tutorial/07.scripts.md @@ -105,7 +105,7 @@ func main() { Once saved, click **Execute** to see the "Hello World!" message in the execution logs. - + For more examples of running scripts in Docker containers, check the [Script tasks](../16.scripts/index.md) page. diff --git a/content/docs/03.tutorial/index.md b/src/content/docs/03.tutorial/index.md similarity index 100% rename from content/docs/03.tutorial/index.md rename to src/content/docs/03.tutorial/index.md diff --git a/content/docs/04.workflow-components/01.flow.md b/src/content/docs/04.workflow-components/01.flow.md similarity index 99% rename from content/docs/04.workflow-components/01.flow.md rename to src/content/docs/04.workflow-components/01.flow.md index f7fd2ebe698..9065757db4b 100644 --- a/content/docs/04.workflow-components/01.flow.md +++ b/src/content/docs/04.workflow-components/01.flow.md @@ -96,7 +96,7 @@ By default, all flows are active and will execute whether or not a trigger has b You can [disable a flow](./16.disabled.md) to temporarily prevent it from running. This is useful for pausing scheduled executions, troubleshooting, or testing. - + ## Task diff --git a/content/docs/04.workflow-components/01.tasks/00.flowable-tasks.md b/src/content/docs/04.workflow-components/01.tasks/00.flowable-tasks.md similarity index 100% rename from content/docs/04.workflow-components/01.tasks/00.flowable-tasks.md rename to src/content/docs/04.workflow-components/01.tasks/00.flowable-tasks.md diff --git a/content/docs/04.workflow-components/01.tasks/01.runnable-tasks.md b/src/content/docs/04.workflow-components/01.tasks/01.runnable-tasks.md similarity index 100% rename from content/docs/04.workflow-components/01.tasks/01.runnable-tasks.md rename to src/content/docs/04.workflow-components/01.tasks/01.runnable-tasks.md diff --git a/content/docs/04.workflow-components/01.tasks/02.taskruns.md b/src/content/docs/04.workflow-components/01.tasks/02.taskruns.md similarity index 99% rename from content/docs/04.workflow-components/01.tasks/02.taskruns.md rename to src/content/docs/04.workflow-components/01.tasks/02.taskruns.md index c82c01a566d..fe20c35d46b 100644 --- a/content/docs/04.workflow-components/01.tasks/02.taskruns.md +++ b/src/content/docs/04.workflow-components/01.tasks/02.taskruns.md @@ -270,6 +270,6 @@ This feature is only available on the Enterprise Edition If your Kestra instance is set up with the [Kafka and Elasticsearch backend](../../07.architecture/index.md#architecture-with-kafka-and-elasticsearch-backend), you can view Task Runs directly in the UI. - + This view is similar to the [Execution View](../../08.ui/02.executions.md), but displays only task runs. diff --git a/content/docs/04.workflow-components/01.tasks/index.md b/src/content/docs/04.workflow-components/01.tasks/index.md similarity index 99% rename from content/docs/04.workflow-components/01.tasks/index.md rename to src/content/docs/04.workflow-components/01.tasks/index.md index b7bff928307..3f5eab5d55c 100644 --- a/content/docs/04.workflow-components/01.tasks/index.md +++ b/src/content/docs/04.workflow-components/01.tasks/index.md @@ -56,7 +56,7 @@ All tasks share the following core properties: Task properties can be static or dynamic. Dynamic properties can be set using expressions. To determine whether a property is static or dynamic, check the task’s documentation on the [plugin's homepage](/plugins) or in the UI by clicking on the documentation tab for the task. - + Some properties are marked as **not dynamic** because they are complex types (e.g., maps, lists of strings, lists of maps). These act as **placeholders** for other dynamic properties. diff --git a/content/docs/04.workflow-components/02.namespace.md b/src/content/docs/04.workflow-components/02.namespace.md similarity index 93% rename from content/docs/04.workflow-components/02.namespace.md rename to src/content/docs/04.workflow-components/02.namespace.md index 0b5da7c88f1..f6107158df2 100644 --- a/content/docs/04.workflow-components/02.namespace.md +++ b/src/content/docs/04.workflow-components/02.namespace.md @@ -47,11 +47,11 @@ tasks: Below, the flow is assigned to the `marketing` namespace. This assignment of a namespace to a flow already provides a benefit of improved organization and filtering: - + Additionally, you can organize your code on a namespace-level using the embedded Code editor and [Namespace Files](../05.concepts/02.namespace-files.md), with the option to [sync those files from Git](../version-control-cicd/04.git.md): - + ## Namespace Tab @@ -63,11 +63,11 @@ Kestra 0.18.0 introduced the **Namespaces** tab in the UI for open source users. You can open the details about any namespace by clicking on the name or details button to the right of that namespace. - + When you select the details button for any namespace, the namespace overview page opens which details the executions of flows in that namespace. - + On the top of this page, you have different tabs: diff --git a/content/docs/04.workflow-components/03.execution.md b/src/content/docs/04.workflow-components/03.execution.md similarity index 99% rename from content/docs/04.workflow-components/03.execution.md rename to src/content/docs/04.workflow-components/03.execution.md index 2895a078c99..453579bb1ea 100644 --- a/content/docs/04.workflow-components/03.execution.md +++ b/src/content/docs/04.workflow-components/03.execution.md @@ -70,7 +70,7 @@ You can see the list of generated metrics generated in the [BigQuery Load task d After executing the flow, view the BigQuery Load task metrics in the **Metrics** tab. - + ## State @@ -113,7 +113,7 @@ You can use the following execution expressions in your flow. You can trigger a flow manually from the Kestra UI by clicking the **Execute** button on the flow page. This is useful when you want to test a flow or run it on demand. - + --- @@ -373,7 +373,7 @@ You can test the webhook trigger using a tool like Postman or cURL. Paste the we Finally, click the **Send** button to trigger the flow execution. You should get a response with the execution ID and status code 200 OK. - + :::alert{type="info"} ⚡️ **When to use a webhook trigger vs. an API call?** To decide whether to use a webhook trigger or an API call to create an Execution, consider the following: diff --git a/content/docs/04.workflow-components/04.variables.md b/src/content/docs/04.workflow-components/04.variables.md similarity index 98% rename from content/docs/04.workflow-components/04.variables.md rename to src/content/docs/04.workflow-components/04.variables.md index 0de7ab4fd20..35f65f4bcb6 100644 --- a/content/docs/04.workflow-components/04.variables.md +++ b/src/content/docs/04.workflow-components/04.variables.md @@ -111,7 +111,7 @@ Initially, `state` is `FAILED` and `ansibleTicket` is `myticket`. Within the flo After the flow runs, `state`, `ansibleTicket`, and `nested.child` have their new values, and `nested.unchanged` remains unchanged. - + ## Delete or unset execution variables @@ -128,7 +128,7 @@ To unset variables, use `io.kestra.plugin.core.execution.UnsetVariables`. Buildi After executing the flow, the only remaining variable is `nested.unchanged` with the value `stay the same`. In the unset task, `state`, `ansibleTicket`, and `nested.child` were deleted. - + ## FAQ diff --git a/content/docs/04.workflow-components/05.inputs.md b/src/content/docs/04.workflow-components/05.inputs.md similarity index 99% rename from content/docs/04.workflow-components/05.inputs.md rename to src/content/docs/04.workflow-components/05.inputs.md index cbc55b33b45..73669339038 100644 --- a/content/docs/04.workflow-components/05.inputs.md +++ b/src/content/docs/04.workflow-components/05.inputs.md @@ -333,7 +333,7 @@ tasks: Below is how the array inputs are rendered in the UI when you create an execution: - + ## Use an input value in a flow @@ -421,7 +421,7 @@ When creating an execution from the web UI, you must set the inputs in the UI fo The input form for the inputs above looks as follows: - + Once the inputs are set, you can trigger an execution of the flow. diff --git a/content/docs/04.workflow-components/06.outputs.md b/src/content/docs/04.workflow-components/06.outputs.md similarity index 94% rename from content/docs/04.workflow-components/06.outputs.md rename to src/content/docs/04.workflow-components/06.outputs.md index 64966a1615a..aca445bae63 100644 --- a/content/docs/04.workflow-components/06.outputs.md +++ b/src/content/docs/04.workflow-components/06.outputs.md @@ -53,7 +53,7 @@ In the example above, the **Return** task produces an output attribute `value`. The **Outputs** tab shows the output for `produce_output` task. There is no output for `use_output` task as it only logs a message. - + In the next example, we can see a file is passed between an input and a task, where the task generates a new file as an output: @@ -135,7 +135,7 @@ Outputs are defined as a list of key-value pairs. The `id` is the name of the ou Flow outputs appear in the **Overview** tab of the **Executions** page. - + ### Pass data between flows using flow outputs @@ -167,7 +167,7 @@ Note how the `outputs` are set twice within the `"{{outputs.subflow.outputs.fina Here is what you will see in the **Outputs** tab of the **Executions** page in the parent flow: - + ### Return outputs conditionally @@ -222,7 +222,7 @@ tasks: The **Outputs** tab contains the output for each of the inner task. - + ### Loop over a list of JSON objects @@ -353,11 +353,11 @@ tasks: On flow execution, the file is downloaded into the Kestra internal storage. When you go to the Outputs tab for this execution, the `uri` attribute of the `download` task contains the file location on Kestra's internal storage and has a Download and a Preview button. - + On clicking the Preview button, you can preview the contents of the file in a tabular format, making it extremely easy to check the contents of the file without downloading it. - + ## Using Debug Expression @@ -375,15 +375,15 @@ tasks: When you run this flow, the **Outputs** tab will contain the output for the `sample_json` task, as shown below: - + You can select the task from the drop-down menu. Here, we select "sample_json" and select **Debug Expression**: - + You can now use Pebble expressions to evaluate and analyze the output data further. - + @@ -421,4 +421,4 @@ tasks: The `encrypted` output is displayed encoded: - + diff --git a/content/docs/04.workflow-components/07.triggers/01.schedule-trigger.md b/src/content/docs/04.workflow-components/07.triggers/01.schedule-trigger.md similarity index 99% rename from content/docs/04.workflow-components/07.triggers/01.schedule-trigger.md rename to src/content/docs/04.workflow-components/07.triggers/01.schedule-trigger.md index 56113de744c..122d30dedc9 100644 --- a/content/docs/04.workflow-components/07.triggers/01.schedule-trigger.md +++ b/src/content/docs/04.workflow-components/07.triggers/01.schedule-trigger.md @@ -147,7 +147,7 @@ Backfills are replays of missed schedule intervals between a defined start and e To backfill the missed executions, go to the `Triggers` tab on the flow's detail page and click on the `Backfill executions` button. - + For more information on Backfill, check out the [dedicated documentation](../../05.concepts/08.backfill.md). diff --git a/content/docs/04.workflow-components/07.triggers/02.flow-trigger.md b/src/content/docs/04.workflow-components/07.triggers/02.flow-trigger.md similarity index 100% rename from content/docs/04.workflow-components/07.triggers/02.flow-trigger.md rename to src/content/docs/04.workflow-components/07.triggers/02.flow-trigger.md diff --git a/content/docs/04.workflow-components/07.triggers/03.webhook-trigger.md b/src/content/docs/04.workflow-components/07.triggers/03.webhook-trigger.md similarity index 96% rename from content/docs/04.workflow-components/07.triggers/03.webhook-trigger.md rename to src/content/docs/04.workflow-components/07.triggers/03.webhook-trigger.md index c9bac928b72..2a2c81e1c58 100644 --- a/content/docs/04.workflow-components/07.triggers/03.webhook-trigger.md +++ b/src/content/docs/04.workflow-components/07.triggers/03.webhook-trigger.md @@ -59,7 +59,7 @@ You can also copy the formed Webhook URL from the **Triggers** tab. If your flow uses trigger variables (such as `{{ trigger.body }})`, you can test it directly from the execution modal. Kestra generates a ready-to-use `cURL` command that lets you trigger the flow with a custom JSON payload. - + --- diff --git a/content/docs/04.workflow-components/07.triggers/04.polling-trigger.md b/src/content/docs/04.workflow-components/07.triggers/04.polling-trigger.md similarity index 100% rename from content/docs/04.workflow-components/07.triggers/04.polling-trigger.md rename to src/content/docs/04.workflow-components/07.triggers/04.polling-trigger.md diff --git a/content/docs/04.workflow-components/07.triggers/05.realtime-trigger.md b/src/content/docs/04.workflow-components/07.triggers/05.realtime-trigger.md similarity index 100% rename from content/docs/04.workflow-components/07.triggers/05.realtime-trigger.md rename to src/content/docs/04.workflow-components/07.triggers/05.realtime-trigger.md diff --git a/content/docs/04.workflow-components/07.triggers/index.md b/src/content/docs/04.workflow-components/07.triggers/index.md similarity index 97% rename from content/docs/04.workflow-components/07.triggers/index.md rename to src/content/docs/04.workflow-components/07.triggers/index.md index 058293ec18d..41ebf8e3734 100644 --- a/content/docs/04.workflow-components/07.triggers/index.md +++ b/src/content/docs/04.workflow-components/07.triggers/index.md @@ -148,11 +148,11 @@ You can disable or re-enable a trigger from the UI. Here is how you can do it: 1. Go to the `Flows` page and click on the flow you want to disable the trigger for. 2. Go to the `Triggers` tab and click on the `Enabled` toggle next to the trigger you want to disable. You can re-enable it by clicking the toggle again. - + If your trigger is locked due to an execution in progress, you can unlock it by clicking the `Unlock trigger` button. - + The **Unlock trigger** functionality is useful for troubleshooting, e.g. if a process is stuck due to infrastructure issues. Keep in mind that manually unlocking triggers may result in multiple concurrent (potentially duplicated) executions — use it with caution. @@ -164,7 +164,7 @@ Only scheduled-based triggers (triggers handled by the Scheduler) will be visibl You can also disable, re-enable, or unlock triggers from the Administration page. Here is how you can do it: - + ## Troubleshooting a trigger from the UI @@ -194,7 +194,7 @@ triggers: When you add that flow to Kestra, you'll see that no Executions are created. To troubleshoot this, you can go to the `Triggers` tab on the Flow's page and **expand the logs** of the trigger that is causing the issue. You'll see a detailed error message that will help you identify the problem: - + ## The ``stopAfter`` property diff --git a/content/docs/04.workflow-components/08.labels.md b/src/content/docs/04.workflow-components/08.labels.md similarity index 97% rename from content/docs/04.workflow-components/08.labels.md rename to src/content/docs/04.workflow-components/08.labels.md index 949caac4c60..b1c9d33072d 100644 --- a/content/docs/04.workflow-components/08.labels.md +++ b/src/content/docs/04.workflow-components/08.labels.md @@ -65,9 +65,9 @@ data from different regions. When you execute a flow with labels, those labels are automatically applied to its executions. - + - + ## Set execution labels when executing a flow from the UI @@ -83,11 +83,11 @@ For example, you can add a label to a failed execution to indicate its status, s To set labels from the UI, go to the **Overview** tab of an **Execution** and click on the "Set labels" button. You can add multiple labels at once. - + You can even set labels for multiple executions at once from the UI. This feature is helpful for bulk operations, such as acknowledging multiple failed executions at once after an outage. - + ## Set labels based on flow inputs and task outputs diff --git a/content/docs/04.workflow-components/09.plugin-defaults.md b/src/content/docs/04.workflow-components/09.plugin-defaults.md similarity index 98% rename from content/docs/04.workflow-components/09.plugin-defaults.md rename to src/content/docs/04.workflow-components/09.plugin-defaults.md index e9eb690e27b..d3fa9a85deb 100644 --- a/content/docs/04.workflow-components/09.plugin-defaults.md +++ b/src/content/docs/04.workflow-components/09.plugin-defaults.md @@ -69,7 +69,7 @@ In this example, Docker and Python configurations are defined once in `pluginDef If you move required attributes into `pluginDefaults`, the UI code editor may show warnings about missing arguments, because defaults are only resolved at runtime. As long as `pluginDefaults` contains the relevant arguments, you can save the flow and ignore the warning displayed in the editor. - + ### `forced` attribute in `pluginDefaults` diff --git a/content/docs/04.workflow-components/10.subflows.md b/src/content/docs/04.workflow-components/10.subflows.md similarity index 100% rename from content/docs/04.workflow-components/10.subflows.md rename to src/content/docs/04.workflow-components/10.subflows.md diff --git a/content/docs/04.workflow-components/11.errors.md b/src/content/docs/04.workflow-components/11.errors.md similarity index 100% rename from content/docs/04.workflow-components/11.errors.md rename to src/content/docs/04.workflow-components/11.errors.md diff --git a/content/docs/04.workflow-components/12.retries.md b/src/content/docs/04.workflow-components/12.retries.md similarity index 96% rename from content/docs/04.workflow-components/12.retries.md rename to src/content/docs/04.workflow-components/12.retries.md index 4d7bdbbce7e..2c46e7cba4b 100644 --- a/content/docs/04.workflow-components/12.retries.md +++ b/src/content/docs/04.workflow-components/12.retries.md @@ -185,20 +185,20 @@ Flow-level retries also restart Subflows as new executions. - **Restart**: Manual rerun of failed tasks within the same execution. - **Replay**: Manual rerun from any point, creating a new execution. - + ### Restart vs. Replay - **Restart**: Retries only failed tasks in the same execution. - **Replay**: Starts a new execution from a chosen task, with a new execution ID. Outputs of previous tasks are reused from cache if needed. - + Replays can start from successful or failed tasks but always create a new execution. Restarts keep the same execution ID. After a Replay, you can still track which Execution triggered this new run thanks to the `Original Execution` field: - + ### Summary diff --git a/content/docs/04.workflow-components/13.timeout.md b/src/content/docs/04.workflow-components/13.timeout.md similarity index 100% rename from content/docs/04.workflow-components/13.timeout.md rename to src/content/docs/04.workflow-components/13.timeout.md diff --git a/content/docs/04.workflow-components/14.concurrency.md b/src/content/docs/04.workflow-components/14.concurrency.md similarity index 94% rename from content/docs/04.workflow-components/14.concurrency.md rename to src/content/docs/04.workflow-components/14.concurrency.md index 189263b85b5..46f82f4e91d 100644 --- a/content/docs/04.workflow-components/14.concurrency.md +++ b/src/content/docs/04.workflow-components/14.concurrency.md @@ -35,7 +35,7 @@ tasks: In the UI, the third execution is queued while the first two finish successfully. - + ## `behavior` property @@ -68,7 +68,7 @@ tasks: As you can see in the UI, the third execution failed as the first two executions were still running. - + :::alert{type="warning"} When an execution starts from a [Trigger](./07.triggers/index.md), the trigger locks until it finishes, preventing multiple executions from that trigger from running concurrently. This means the `behavior` property will not come into effect and instead no new executions will be started. @@ -80,7 +80,7 @@ Read more in the [Locked Triggers](./07.triggers/index.md#locked-triggers) secti The `Concurrency` tab on the `Flow` page lets you track and troubleshoot concurrency issues. [Introduced in Kestra 0.19.0](https://github.com/kestra-io/kestra/issues/4721#event-14422957135), it shows a progress bar with the number of active slots compared to the total slots available. Below that progress bar, you can see a table showing currently running and queued Executions, providing a clear overview of the flow's concurrency status. - + To see the concurrency behavior in action, you can configure a flow with a concurrency limit as follows: @@ -103,7 +103,7 @@ tasks: Next, trigger multiple Executions of that flow and watch the `Concurrency` tab showing the active slots and queued Executions. - + ## How to troubleshoot Concurrency issues diff --git a/content/docs/04.workflow-components/15.descriptions.md b/src/content/docs/04.workflow-components/15.descriptions.md similarity index 97% rename from content/docs/04.workflow-components/15.descriptions.md rename to src/content/docs/04.workflow-components/15.descriptions.md index 099074d52ea..25343b2aa36 100644 --- a/content/docs/04.workflow-components/15.descriptions.md +++ b/src/content/docs/04.workflow-components/15.descriptions.md @@ -22,7 +22,7 @@ You can add a `description` property on: All Markdown descriptions are rendered directly in the UI. - + Here is an example flow with descriptions in different components: diff --git a/content/docs/04.workflow-components/16.disabled.md b/src/content/docs/04.workflow-components/16.disabled.md similarity index 95% rename from content/docs/04.workflow-components/16.disabled.md rename to src/content/docs/04.workflow-components/16.disabled.md index 7895dcd21c4..bafc6c374d3 100644 --- a/content/docs/04.workflow-components/16.disabled.md +++ b/src/content/docs/04.workflow-components/16.disabled.md @@ -36,7 +36,7 @@ triggers: You will see that you cannot run the flow and that the trigger is ignored — no executions are created. - + When executing a disabled flow from a subflow: @@ -52,7 +52,7 @@ tasks: When you execute the parent flow, it immediately fails with the error message: `Cannot execute a flow which is disabled`. - + Similarly, try running a disabled flow via an API call: @@ -126,4 +126,4 @@ tasks: You can see in the UI that disabled tasks are greyed out: - + diff --git a/content/docs/04.workflow-components/17.states.md b/src/content/docs/04.workflow-components/17.states.md similarity index 98% rename from content/docs/04.workflow-components/17.states.md rename to src/content/docs/04.workflow-components/17.states.md index c2affa7f484..81d586b9eda 100644 --- a/content/docs/04.workflow-components/17.states.md +++ b/src/content/docs/04.workflow-components/17.states.md @@ -19,7 +19,7 @@ You can read more about executions in the [workflow components documentation](./ Each Kestra execution can transition through several states during its lifecycle. The following diagram illustrates the possible states an execution can be in: - + Here is a brief description of each state: 1. **CREATED**: The execution has been created but not yet started. This transient state means the execution is waiting to be processed. It usually transitions quickly to `RUNNING`, `CANCELLED`, or `QUEUED`. If you see executions stuck in this state, it may indicate a problem with the system. @@ -84,7 +84,7 @@ graph LR; Task run states represent the status of a single task run within an execution. - + Each task run can be in one of the following states: 1. **CREATED**: The task run has been created but not yet started. diff --git a/content/docs/04.workflow-components/18.sla.md b/src/content/docs/04.workflow-components/18.sla.md similarity index 100% rename from content/docs/04.workflow-components/18.sla.md rename to src/content/docs/04.workflow-components/18.sla.md diff --git a/content/docs/04.workflow-components/19.finally.md b/src/content/docs/04.workflow-components/19.finally.md similarity index 100% rename from content/docs/04.workflow-components/19.finally.md rename to src/content/docs/04.workflow-components/19.finally.md diff --git a/content/docs/04.workflow-components/20.afterexecution.md b/src/content/docs/04.workflow-components/20.afterexecution.md similarity index 97% rename from content/docs/04.workflow-components/20.afterexecution.md rename to src/content/docs/04.workflow-components/20.afterexecution.md index f44b923c0b0..f47289d78a6 100644 --- a/content/docs/04.workflow-components/20.afterexecution.md +++ b/src/content/docs/04.workflow-components/20.afterexecution.md @@ -75,7 +75,7 @@ afterExecution: After executing the above, you can see that the `finally` task has a status of RUNNING while the `afterExecution` task says FAILED. - + :::alert{type="info"} Best practice: Use `afterExecution` when you need to act on the final state of an execution. Use `finally` when you need to ensure cleanup happens regardless of state. diff --git a/content/docs/04.workflow-components/index.md b/src/content/docs/04.workflow-components/index.md similarity index 100% rename from content/docs/04.workflow-components/index.md rename to src/content/docs/04.workflow-components/index.md diff --git a/content/docs/04.workflow-components/task-cache.md b/src/content/docs/04.workflow-components/task-cache.md similarity index 100% rename from content/docs/04.workflow-components/task-cache.md rename to src/content/docs/04.workflow-components/task-cache.md diff --git a/content/docs/05.concepts/02.namespace-files.md b/src/content/docs/05.concepts/02.namespace-files.md similarity index 100% rename from content/docs/05.concepts/02.namespace-files.md rename to src/content/docs/05.concepts/02.namespace-files.md diff --git a/content/docs/05.concepts/03.revision.md b/src/content/docs/05.concepts/03.revision.md similarity index 94% rename from content/docs/05.concepts/03.revision.md rename to src/content/docs/05.concepts/03.revision.md index ba66543bc47..8cee1713f76 100644 --- a/content/docs/05.concepts/03.revision.md +++ b/src/content/docs/05.concepts/03.revision.md @@ -15,5 +15,5 @@ Flows are versioned by default. Whenever you make any changes to your flows, a n If you navigate to a specific flow and go to the **Revisions** tab, you will see a list of all revisions of that flow. You can then compare the differences between two revisions side-by-side or line-by-line and rollback to a previous revision if needed. - + diff --git a/content/docs/05.concepts/04.secret.md b/src/content/docs/05.concepts/04.secret.md similarity index 96% rename from content/docs/05.concepts/04.secret.md rename to src/content/docs/05.concepts/04.secret.md index 3cf1a746887..e850962e38f 100644 --- a/content/docs/05.concepts/04.secret.md +++ b/src/content/docs/05.concepts/04.secret.md @@ -23,17 +23,17 @@ You can leverage the `secret()` function to retrieve sensitive variables within From the **Secrets** tab, you can edit, delete, and copy your secret to your clipboard as a Pebble expression for use in a flow, such as `"{{ secret('API_TOKEN'') }}"`. - + ### Adding a new Secret from the UI If you are using a managed Kestra version, you can add **new Secrets** directly from the UI. In the left navigation menu, go to **Namespaces** and select the namespace to which you want to add a new secret. Next, add a new secret within the Secrets tab. - + Here, we add a new secret with a key `MY_SECRET`: - + ### Using Secrets in your flows diff --git a/content/docs/05.concepts/05.kv-store.md b/src/content/docs/05.concepts/05.kv-store.md similarity index 98% rename from content/docs/05.concepts/05.kv-store.md rename to src/content/docs/05.concepts/05.kv-store.md index 7de81139feb..9401103708c 100644 --- a/content/docs/05.concepts/05.kv-store.md +++ b/src/content/docs/05.concepts/05.kv-store.md @@ -75,11 +75,11 @@ The sections below provide detailed instructions on how to create and manage KV You can create, read, update, and delete KV pairs from the UI in the following way: 1. Navigate to the `Namespaces` page from the left navigation menu and select the namespace where you want to create the KV pair. -  +  2. Go to the `KV Store` tab. This is where you can see all the KV pairs associated with this namespace. -  +  3. Click on `New Key-Value` button in the top right corner to create a new KV pair. Enter a name for the `Key` and assign a suitable `Type` for the value — it can be a string, number, boolean, datetime, date, duration, or JSON. -  +  4. Enter the value in the `Value` field. 5. Optionally, you can configure a Time to Live (TTL) for the KV pair. The dropdown contains some standard durations. You can also select `Custom duration` to enter a custom duration as a string in ISO 8601 duration format. 6. Finally, `Save` the changes. Your new KV pair should now be displayed in the list of KV pairs for that namespace. @@ -88,7 +88,7 @@ You can create, read, update, and delete KV pairs from the UI in the following w You can edit, delete, or copy any KV pair by clicking on the associated button on the right side of each KV pair. The copy option copies the [Pebble expression of the KV pair](#read-kv-pairs-with-pebble) (i.e., `{{ kv('YOUR_KEY'') }}`) to use directly in your flow. - + ## CODE: How to Create, Read, Update and Delete KV pairs in your flow code diff --git a/content/docs/05.concepts/06.pebble.md b/src/content/docs/05.concepts/06.pebble.md similarity index 100% rename from content/docs/05.concepts/06.pebble.md rename to src/content/docs/05.concepts/06.pebble.md diff --git a/content/docs/05.concepts/07.blueprints.md b/src/content/docs/05.concepts/07.blueprints.md similarity index 95% rename from content/docs/05.concepts/07.blueprints.md rename to src/content/docs/05.concepts/07.blueprints.md index 0aa968903ad..8f85488d406 100644 --- a/content/docs/05.concepts/07.blueprints.md +++ b/src/content/docs/05.concepts/07.blueprints.md @@ -21,7 +21,7 @@ All Blueprints are validated and documented. You can easily customize and integr To see more, check out the [Blueprints library](/blueprints). - + ## Community Blueprints @@ -36,7 +36,7 @@ Blueprints are accessible from two places in the UI: 1. The left navigation sidebar 2. A dedicated tab in the code editor named "Source and blueprints", showing your source code and Blueprints side by side. - + ### How to find the right Blueprint diff --git a/content/docs/05.concepts/08.backfill.md b/src/content/docs/05.concepts/08.backfill.md similarity index 98% rename from content/docs/05.concepts/08.backfill.md rename to src/content/docs/05.concepts/08.backfill.md index d53aea3581b..053cfff2da8 100644 --- a/content/docs/05.concepts/08.backfill.md +++ b/src/content/docs/05.concepts/08.backfill.md @@ -42,7 +42,7 @@ You can use Backfill if it's configured differently, e.g., to not recover missed To backfill the missed executions, go to the **Triggers** tab on the Flow's detail page and click on the **Backfill executions** button. - + You can then select the start and end date for the backfill. Additionally, you can set custom labels for the backfill executions to help you identify them in the future. @@ -52,7 +52,7 @@ You can then select the start and end date for the backfill. Additionally, you c You can pause and resume the backfill process at any time, and by clicking on the **Details** button, you can see more details about that backfill process: - + :::alert{type="info"} Backfill executions will not be processed if the associated trigger is disabled. diff --git a/content/docs/05.concepts/10.replay.md b/src/content/docs/05.concepts/10.replay.md similarity index 95% rename from content/docs/05.concepts/10.replay.md rename to src/content/docs/05.concepts/10.replay.md index 63065162075..87697993e8e 100644 --- a/content/docs/05.concepts/10.replay.md +++ b/src/content/docs/05.concepts/10.replay.md @@ -13,7 +13,7 @@ Replay allows you to re-run a workflow execution from any chosen task run. By using Replay, you can re-run a workflow execution from any selected task run. To do that, simply go to the Gantt view of the chosen workflow execution (it doesn't need to be a Failed execution, it can be an execution in any state) and click on the task run you want to re-run. Additionally, you can re-run an execution or bulk executions from the **Executions** tab with the option to use the latest revision. - + ## Why Replay is useful @@ -143,22 +143,22 @@ tasks: Now, you can go to the previously failed Execution and click on the `to_parquet` task run to re-run it (either from the Gantt or from the Logs view). - + Now select the new revision of the flow code that contains the fix and confirm with the `OK` button. - + This re-runs the task with the new (corrected!) revision of the flow code. - + You can inspect the logs and verify that the task now completes successfully. The Attempt number increments to show that this is a new run of the task. - + The Overview tab will additionally show the new Attempt number and the new revision of the flow code that was used during Replay. - + The replay feature allowed you to re-run a failed task with the corrected version of the flow code. You didn't have to rerun tasks that had already completed successfully. This is a huge time-saver when iterating on your workflows! ⚡️ diff --git a/content/docs/05.concepts/11.storage.md b/src/content/docs/05.concepts/11.storage.md similarity index 100% rename from content/docs/05.concepts/11.storage.md rename to src/content/docs/05.concepts/11.storage.md diff --git a/content/docs/05.concepts/12.caching.md b/src/content/docs/05.concepts/12.caching.md similarity index 100% rename from content/docs/05.concepts/12.caching.md rename to src/content/docs/05.concepts/12.caching.md diff --git a/content/docs/05.concepts/editor.md b/src/content/docs/05.concepts/editor.md similarity index 100% rename from content/docs/05.concepts/editor.md rename to src/content/docs/05.concepts/editor.md diff --git a/content/docs/05.concepts/file-access.md b/src/content/docs/05.concepts/file-access.md similarity index 100% rename from content/docs/05.concepts/file-access.md rename to src/content/docs/05.concepts/file-access.md diff --git a/content/docs/05.concepts/index.md b/src/content/docs/05.concepts/index.md similarity index 100% rename from content/docs/05.concepts/index.md rename to src/content/docs/05.concepts/index.md diff --git a/content/docs/05.concepts/system-flows.md b/src/content/docs/05.concepts/system-flows.md similarity index 92% rename from content/docs/05.concepts/system-flows.md rename to src/content/docs/05.concepts/system-flows.md index 088781c4015..5e27bf8e3ff 100644 --- a/content/docs/05.concepts/system-flows.md +++ b/src/content/docs/05.concepts/system-flows.md @@ -31,11 +31,11 @@ kestra: To access System Flows, navigate to the **Namespaces** section in the UI. The `system` namespace is pinned at the top for quick access. - + From this section, you’ll find the _System Blueprints_ tab, which provides fully customizable templates that you can modify to suit your organization’s needs. - + :::alert{type="info"} Keep in mind that System Flows are not restricted to System Blueprints — any valid Kestra flow can become a System Flow if it's added to the `system` namespace. @@ -43,7 +43,7 @@ Keep in mind that System Flows are not restricted to System Blueprints — any v System Flows are intentionally hidden from the main UI, appearing only in the `system` namespace. The Dashboard, Flows, and Executions pages offer a multi-select filter with options for `User` (default) and `System` (visible by default only within the `system` namespace). This makes it easy to toggle between user-facing workflows and background system flows and their executions or view both simultaneously. - + In terms of permissions, `system` namespace is open by default, but using the namespace-level RBAC functionality in the Enterprise Edition, you can restrict access to the `system` namespace only to Admins, while assigning `company.*` namespaces to your general user base. diff --git a/content/docs/05.concepts/system-labels.md b/src/content/docs/05.concepts/system-labels.md similarity index 95% rename from content/docs/05.concepts/system-labels.md rename to src/content/docs/05.concepts/system-labels.md index 15dfb804260..a38f4bd3f5e 100644 --- a/content/docs/05.concepts/system-labels.md +++ b/src/content/docs/05.concepts/system-labels.md @@ -11,7 +11,7 @@ Special labels for system use only. System Labels and Hidden Labels are reserved for storing metadata used by administrators to manage and monitor Kestra. These labels are hidden in the UI by default. To view executions with a specific Hidden Label, you must explicitly filter for it using the `Labels` filter, such as `system.correlationId: 4DhfCBCDznBqipTAnd7zfm`. - + --- @@ -79,7 +79,7 @@ tasks: Once this label is set, the editor for this flow will be disabled in the UI. - + :::alert{type="info"} In the Enterprise Edition, updating a read-only flow server-side is restricted to service accounts or API keys. diff --git a/content/docs/06.enterprise/01.overview/01.enterprise-edition.md b/src/content/docs/06.enterprise/01.overview/01.enterprise-edition.md similarity index 100% rename from content/docs/06.enterprise/01.overview/01.enterprise-edition.md rename to src/content/docs/06.enterprise/01.overview/01.enterprise-edition.md diff --git a/content/docs/06.enterprise/01.overview/02.setup.md b/src/content/docs/06.enterprise/01.overview/02.setup.md similarity index 92% rename from content/docs/06.enterprise/01.overview/02.setup.md rename to src/content/docs/06.enterprise/01.overview/02.setup.md index de2a26afec4..6c524ee9e19 100644 --- a/content/docs/06.enterprise/01.overview/02.setup.md +++ b/src/content/docs/06.enterprise/01.overview/02.setup.md @@ -42,7 +42,7 @@ The first screen shows the main configuration of your instance. It displays: - which `internal storage` backend is configured (e.g., S3, GCS, Azure Blob Storage, Minio, or local storage) - which `secret` backend is configured (e.g., Vault, AWS Secrets Manager, Elasticsearch, or not set up yet) - + This step asks you to confirm whether your configuration is valid. If not, you can correct the configuration, restart the instance, and start the setup from scratch. @@ -56,19 +56,19 @@ If you choose to create a tenant, you will be asked to input the Tenant ID and T If you enabled a default tenant, you can skip this step. - + ## Step 3: Create your first user Now that you have your instance configured, you will create your first user. This user will have a [Super-Admin](../03.auth/rbac.md#super-admin) role for the instance and will be able to manage tenants, users, and roles. - + ## Step 4: Start Kestra UI Once your tenant and user are configured, Kestra will launch the UI and log you into your new tenant as the first user. - + diff --git a/content/docs/06.enterprise/01.overview/index.md b/src/content/docs/06.enterprise/01.overview/index.md similarity index 100% rename from content/docs/06.enterprise/01.overview/index.md rename to src/content/docs/06.enterprise/01.overview/index.md diff --git a/content/docs/06.enterprise/01.overview/standalone-server-installation.md b/src/content/docs/06.enterprise/01.overview/standalone-server-installation.md similarity index 100% rename from content/docs/06.enterprise/01.overview/standalone-server-installation.md rename to src/content/docs/06.enterprise/01.overview/standalone-server-installation.md diff --git a/content/docs/06.enterprise/02.governance/06.audit-logs.md b/src/content/docs/06.enterprise/02.governance/06.audit-logs.md similarity index 92% rename from content/docs/06.enterprise/02.governance/06.audit-logs.md rename to src/content/docs/06.enterprise/02.governance/06.audit-logs.md index f500e28127f..2f464b3956b 100644 --- a/content/docs/06.enterprise/02.governance/06.audit-logs.md +++ b/src/content/docs/06.enterprise/02.governance/06.audit-logs.md @@ -23,7 +23,7 @@ The audit log table in Kestra serves as a historical record that developers and You can access Audit Logs from the Administration section in the UI. That UI page provides a detailed table of recorded events, capturing the actions taken within the system: - + Each row in the table represents a distinct event with several columns providing specific details: @@ -38,11 +38,11 @@ Each row in the table represents a distinct event with several columns providing To see a full diff of a specific event, click on the icon at the end of each row to expand the details. The expanded view shows the full diff of the event side-by-side, including the `before` and `after` states of a given resource: - + Below is an example where we manually change the Execution state from `FAILED` to `SUCCESS`, and the diff shows the exact change made to the Execution: - + ## How to use the Details filter to search for specific Audit Log events @@ -50,21 +50,21 @@ The `Details` filter allows you to flexibly search for any Audit Log event using For example, you can filter for all events related to a specific namespace by typing `namespace:your_namespace`: - + To further filter for a specific event, you can click on the relevant tag in the `Details` column: - + ## How to filter for tenant-specific events Let's say you want to find out when a specific tenant was created. Simply type "Tenant" in the search bar to filter for events related to when the tenant was created, updated, or deleted. - + Alternatively, you can explicitly type in the `Details` filter `id:your_tenant_id` to filter for events related to that tenant: - + --- diff --git a/content/docs/06.enterprise/02.governance/07.namespace-management.md b/src/content/docs/06.enterprise/02.governance/07.namespace-management.md similarity index 94% rename from content/docs/06.enterprise/02.governance/07.namespace-management.md rename to src/content/docs/06.enterprise/02.governance/07.namespace-management.md index 3baa5fb8b39..1f9f0089f9f 100644 --- a/content/docs/06.enterprise/02.governance/07.namespace-management.md +++ b/src/content/docs/06.enterprise/02.governance/07.namespace-management.md @@ -36,11 +36,11 @@ tasks: This flow is assigned to the `company.marketing` namespace. However, if you navigate to the **Namespaces** page in the UI, the namespace hasn't been created yet. It's shown as greyed out in the UI because it's just a placeholder until you manually create it: - + You can only filter for existing namespaces. Once you are ready to turn a placeholder namespace into a fully-fledged namespace, you create it in one click: - + ### `requireExistingNamespace` @@ -54,7 +54,7 @@ kestra: You can also control this setting at the tenant level from the tenant settings. - + ======= @@ -70,11 +70,11 @@ Since Kestra supports [everything as code and from the UI](https://youtu.be/dU3p On the Namespaces page, select the namespace where you want to define the secrets and go to the **Secrets** tab. Here, you will see all existing secrets associated with this namespace. Click on **Add a secret** button on the top right corner of the page. - + Define the secret by entering its key and value. Save the secret by clicking on the **Save** button at the bottom. - + The secret key should now start appearing on the **Secrets** tab. You can edit the secret's value or delete the secret by clicking on the appropriate button towards the right of the secret row. You can reference the secret in the flow by using the key, for example, `"{{ secret('MYSQL_PASSWORD') }}"`. @@ -106,7 +106,7 @@ Plugin Defaults can also be defined at the namespace level. These plugin default On the Namespaces page, select the namespace where you want to define the plugin defaults and navigate to the **Plugin defaults** tab. You can add the plugin defaults here and save the changes by clicking on the **Save** button at the bottom of the page. - + You can reference secrets and variables defined with the same namespace in the plugin defaults. @@ -132,7 +132,7 @@ Variables defined at the namespace level can be used in any flow defined under t On the Namespaces page, select the namespace where you want to define the variables. Go to the **Variables** tab. You can now define the variables on this page. Save the changes by clicking the **Save** button at the bottom of the page. - + Here is an example flow where the namespace variable is used: @@ -151,7 +151,7 @@ tasks: When building new flows in a namespace, namespace variables are accessible from the **Variables** tab. Open the tab to view all available namespace variables and their associated values. - + ## Creating Namespaces @@ -327,8 +327,8 @@ As of Kestra 0.17, you can manage cross-namespace permissions in the Enterprise When you navigate to any Namespace and go to the Edit tab, you can explicitly configure which namespaces are allowed to access flows and other resources related to that namespace. By default, all namespaces are allowed: - + However, you can restrict that access if you want only specific namespaces (or no namespace at all) to trigger its corresponding resources. - + diff --git a/content/docs/06.enterprise/02.governance/allowed-plugins.md b/src/content/docs/06.enterprise/02.governance/allowed-plugins.md similarity index 100% rename from content/docs/06.enterprise/02.governance/allowed-plugins.md rename to src/content/docs/06.enterprise/02.governance/allowed-plugins.md diff --git a/content/docs/06.enterprise/02.governance/custom-blueprints.md b/src/content/docs/06.enterprise/02.governance/custom-blueprints.md similarity index 95% rename from content/docs/06.enterprise/02.governance/custom-blueprints.md rename to src/content/docs/06.enterprise/02.governance/custom-blueprints.md index 4da79c75263..cef865f7eb1 100644 --- a/content/docs/06.enterprise/02.governance/custom-blueprints.md +++ b/src/content/docs/06.enterprise/02.governance/custom-blueprints.md @@ -23,7 +23,7 @@ From the left navigation menu, go to **Blueprints**. Then, select the **Custom B Add a title, description, and the contents of the flow. You can add as many tags as you want. Then click on the **Create** button. - + You can edit Blueprints at any time, for example, to add new tasks or expand the documentation. diff --git a/content/docs/06.enterprise/02.governance/index.md b/src/content/docs/06.enterprise/02.governance/index.md similarity index 100% rename from content/docs/06.enterprise/02.governance/index.md rename to src/content/docs/06.enterprise/02.governance/index.md diff --git a/content/docs/06.enterprise/02.governance/logshipper.md b/src/content/docs/06.enterprise/02.governance/logshipper.md similarity index 99% rename from content/docs/06.enterprise/02.governance/logshipper.md rename to src/content/docs/06.enterprise/02.governance/logshipper.md index 1526c76496e..1e702a0c297 100644 --- a/content/docs/06.enterprise/02.governance/logshipper.md +++ b/src/content/docs/06.enterprise/02.governance/logshipper.md @@ -151,7 +151,7 @@ tasks: The batched logs directly populate your Datadog instance like in the following screenshot: - + ### AWS Cloudwatch @@ -185,7 +185,7 @@ tasks: The logs are viewable in the interface of the specified Log Group and can be examined like in the following screenshot: - + ### AWS S3 diff --git a/content/docs/06.enterprise/02.governance/read-only-secrets.md b/src/content/docs/06.enterprise/02.governance/read-only-secrets.md similarity index 93% rename from content/docs/06.enterprise/02.governance/read-only-secrets.md rename to src/content/docs/06.enterprise/02.governance/read-only-secrets.md index e8caa43a1d7..b5036828574 100644 --- a/content/docs/06.enterprise/02.governance/read-only-secrets.md +++ b/src/content/docs/06.enterprise/02.governance/read-only-secrets.md @@ -22,15 +22,15 @@ Read-only secrets can be configured globally in the configuration file as well a To enable for a specific Tenant, toggle the setting on in the **Dedicated secrets manager** configuration. - + To enable for a specific Namespace, toggle the setting on in the **Dedicated secrets manager** configuration of the **Edit** tab. - + Secrets will display a lock icon to indicate read-only status, and the **Create New Secret** button will no longer be visible. - + To configure globally, add `read-only: true` to the configuration of your external secret manager like in the examples below. @@ -122,19 +122,19 @@ The following steps are a full example of configuring Vault as your secret manag In Vault, we have a Secrets Engine named `business-unit` in the `admin` namespace that hosts the path to our database password that we want to use to [add a table and populate with data in Neon](../../15.how-to-guides/neon.md). - + In Kestra, we can now navigate to the Namespace we want to set up Vault as a secrets manager for and enter the configuration details: - + After saving, we can move to the Secrets tab and see which paths we have access to. Notice the lock icon indicating that read-only is successfully turned on. No new secrets can be created from Kestra, and existing secrets are not editable. - + In Vault, we know `my-app` is the secret that hosts the subkey we are looking for, in this case, `NEON_PASSWORD`. - + Now to use in our flow, we need to use the `secret()` function with the name of our secret `my-app` and the `subkey` parameter set to the key of the secret value we want to use, which in this case is `NEON_PASSWORD`. @@ -178,11 +178,11 @@ pluginDefaults: ``` ::: - + After saving the flow and executing, we can see that Kestra successfully accessed the correct value from Vault and added 100 rows to our Neon database. - + ## Filter Secrets by Tags diff --git a/content/docs/06.enterprise/02.governance/secrets-manager.md b/src/content/docs/06.enterprise/02.governance/secrets-manager.md similarity index 100% rename from content/docs/06.enterprise/02.governance/secrets-manager.md rename to src/content/docs/06.enterprise/02.governance/secrets-manager.md diff --git a/content/docs/06.enterprise/02.governance/secrets.md b/src/content/docs/06.enterprise/02.governance/secrets.md similarity index 100% rename from content/docs/06.enterprise/02.governance/secrets.md rename to src/content/docs/06.enterprise/02.governance/secrets.md diff --git a/content/docs/06.enterprise/02.governance/tenants.md b/src/content/docs/06.enterprise/02.governance/tenants.md similarity index 96% rename from content/docs/06.enterprise/02.governance/tenants.md rename to src/content/docs/06.enterprise/02.governance/tenants.md index adde6b9ccd4..9d0518f8212 100644 --- a/content/docs/06.enterprise/02.governance/tenants.md +++ b/src/content/docs/06.enterprise/02.governance/tenants.md @@ -28,7 +28,7 @@ Data stored inside the internal storage is also separated by tenants. End-users can use the tenant selection dropdown menu from the [UI](../08.ui/index.md) to see tenants they have access to. It allows users to switch between tenants easily. Each UI page includes the tenant ID in the URL (e.g., `https://demo.kestra.io/ui/yourTenantId/executions/namespace/flow/executionId`.) - + Most [API](../api-reference/index.md) endpoints also include the tenant identifier. The exception to that is instance-level endpoints such as `/configs`, `/license-info` or `/banners` that require Superadmin access. @@ -51,10 +51,10 @@ Tenants in Kestra can be managed in various ways: from the UI, CLI, API, or Terr ### Creating a Tenant from the UI Tenants can be created and managed directly through Kestra's user interface. Go to **Administration -> Tenants**. Then, click on the **Create** button: - + Fill in the form and click **Save**: - + The user who creates a tenant is automatically granted the Admin Role for that tenant. You may need to refresh the UI to see updated Roles. @@ -146,7 +146,7 @@ By default, each tenant uses the same [internal storage](../../configuration/ind To configure a dedicated storage and secrets backend per tenant, navigate to the respective tenant in the UI and click on the **Edit** button. Then, select the storage and secrets backend you want to use for that tenant: - + :::alert{type="warning"} diff --git a/content/docs/06.enterprise/02.governance/unit-tests.md b/src/content/docs/06.enterprise/02.governance/unit-tests.md similarity index 97% rename from content/docs/06.enterprise/02.governance/unit-tests.md rename to src/content/docs/06.enterprise/02.governance/unit-tests.md index 1e563a50e78..9f755a1377d 100644 --- a/content/docs/06.enterprise/02.governance/unit-tests.md +++ b/src/content/docs/06.enterprise/02.governance/unit-tests.md @@ -27,13 +27,13 @@ Once tests are created, they can all be viewed from the **Tests** tab with their --- - + --- The following diagram illustrates the structure of flows and unit tests together in Kestra: - + ## Configuration @@ -129,7 +129,7 @@ In the first test case, `extract_should_return_data`, the `fixtures` include tas The `assertions` property defines the conditions for success or failure. In the example, the test aims to ensure that the outputs from the `transform_to_uppercase` task are not null. After running the test, we can see the results for the `extract_should_return_data` test by expanding the results. - + The assertion passed as the `extract` task downloading data from the API returned product names and was not null. Additionally, since we did not include a fixture for the `transform_to_uppercase` task, we can see that the returned product names were also transformed successfully to uppercase in the assertion's actual result. @@ -137,11 +137,11 @@ Because we wrote the test suite with two test cases, both executed during the ru After running, we can see that the assertion was successful and the actual result `MY-PRODUCT-1` was successfully transformed and matches the expected result defined in the `assertions` property of the test. - + Execution details are not stored in the Executions page like normally run flows to protect cluttering that space with unneccesary execution details. To view an execution made from a test, you can open the test case and click on the link for the ExecutionId. - + ## Unit Test with Namespace File diff --git a/content/docs/06.enterprise/02.governance/worker-isolation.md b/src/content/docs/06.enterprise/02.governance/worker-isolation.md similarity index 100% rename from content/docs/06.enterprise/02.governance/worker-isolation.md rename to src/content/docs/06.enterprise/02.governance/worker-isolation.md diff --git a/content/docs/06.enterprise/03.auth/04.authentication.md b/src/content/docs/06.enterprise/03.auth/04.authentication.md similarity index 100% rename from content/docs/06.enterprise/03.auth/04.authentication.md rename to src/content/docs/06.enterprise/03.auth/04.authentication.md diff --git a/content/docs/06.enterprise/03.auth/api-tokens.md b/src/content/docs/06.enterprise/03.auth/api-tokens.md similarity index 89% rename from content/docs/06.enterprise/03.auth/api-tokens.md rename to src/content/docs/06.enterprise/03.auth/api-tokens.md index 48522170cef..3af5876bb52 100644 --- a/content/docs/06.enterprise/03.auth/api-tokens.md +++ b/src/content/docs/06.enterprise/03.auth/api-tokens.md @@ -29,15 +29,15 @@ Currently, we support API tokens as an authentication mechanism for the followin To create an API token, navigate to your profile in the bottom left corner of the Kestra UI and click on **+ Create API Token**. - + Once in your profile, click **+ Create API Token** in the **Manage your API Tokens** section. - + Fill in the form with the required information, including the `Name`, `Description`, and `Max age`. Once satisfied, click `Generate`: - + :::alert{type="info"} **Note:** you can configure the token to expire after a certain period of time or to never expire. Also, there is a toggle called `Extended` that automatically prolongs the token's expiration date by the specified number of days (`Max Age`) if the token is actively used. This toggle is disabled by default. @@ -45,7 +45,7 @@ Fill in the form with the required information, including the `Name`, `Descripti Once you confirm the API token creation, the token will be generated and displayed in the UI. Make sure to copy the token and store it in a secure location, as it will not be displayed again. - + ## How to create a Service Account API token @@ -53,11 +53,11 @@ To create an API token for a Service Account, navigate to the `Administration` s Then, go to the `API Tokens` tab and click the `Create` button: - + Fill in the form with the required information including the `Name`, `Description`, and `Max age`. Once satisfied, click `Generate`: - + :::alert{type="info"} **Note:** same as for a user token, you can configure the token to expire after a certain period of time or to never expire. Also, there is a toggle called `Extended` that will automatically prolong the token's expiration date by the specified number of days (`Max Age`) if the token is actively used. That toggle is disabled by default. @@ -65,7 +65,7 @@ Fill in the form with the required information including the `Name`, `Descriptio Once you confirm the API token creation via the **Generate** button, the token will be generated and displayed in the UI. Make sure to copy the token and store it in a secure location as it will not be displayed again. - + ## How to use an API token in an API request diff --git a/content/docs/06.enterprise/03.auth/api.md b/src/content/docs/06.enterprise/03.auth/api.md similarity index 100% rename from content/docs/06.enterprise/03.auth/api.md rename to src/content/docs/06.enterprise/03.auth/api.md diff --git a/content/docs/06.enterprise/03.auth/index.md b/src/content/docs/06.enterprise/03.auth/index.md similarity index 100% rename from content/docs/06.enterprise/03.auth/index.md rename to src/content/docs/06.enterprise/03.auth/index.md diff --git a/content/docs/06.enterprise/03.auth/invitations.md b/src/content/docs/06.enterprise/03.auth/invitations.md similarity index 94% rename from content/docs/06.enterprise/03.auth/invitations.md rename to src/content/docs/06.enterprise/03.auth/invitations.md index 763d579b117..d0d43fbb009 100644 --- a/content/docs/06.enterprise/03.auth/invitations.md +++ b/src/content/docs/06.enterprise/03.auth/invitations.md @@ -26,13 +26,13 @@ By default, if the [email server is configured in Kestra EE](../../configuration 4. Fill in the user's email address, and select the desired group or attach the role directly—optionally restricting the permission to one or more namespaces 5. Click the **Add** button—this will send an email to the user with an invitation link, or display the link you can share with the user manually. - + :::alert{type="info"} You can check the box to **Create user directly (skip invitation)** if one is not required. This action is recommended only with third-party authentication such as SSO or LDAP. ::: - + ## Accepting Invitations diff --git a/content/docs/06.enterprise/03.auth/rbac.md b/src/content/docs/06.enterprise/03.auth/rbac.md similarity index 96% rename from content/docs/06.enterprise/03.auth/rbac.md rename to src/content/docs/06.enterprise/03.auth/rbac.md index 0d3fb7a15c7..3733fb68678 100644 --- a/content/docs/06.enterprise/03.auth/rbac.md +++ b/src/content/docs/06.enterprise/03.auth/rbac.md @@ -19,7 +19,7 @@ assigning Roles to Users, Groups, and Service Accounts. The image below shows the relationship between Users, Groups, Service Accounts, Roles, and Bindings (visible on the Access page in the UI). - + ## Roles and Bindings @@ -88,7 +88,7 @@ Currently, Kestra only creates an **Admin** role by default. That role grants fu Apart from that, you can create additional Roles with custom permission combinations. You can create roles and select the permissions and actions in the **IAM - Roles** tab. - + ## Super Admin and Admin @@ -179,7 +179,7 @@ Note that you need to be a super admin yourself. You can grant or revoke the Super Admin privilege using the switch in the User Edit page. - + #### Through the CLI @@ -247,7 +247,7 @@ Once you have created your first role. You can attach that role to an entity thr The following example shows the creation of a Binding for a User. We are defining the User `john@doe.com` as an Admin for the `team.customer` namespace. - + :::::alert{type="info"} **Note:** Service Accounts are considered as Users when binding. ::: @@ -298,16 +298,16 @@ To add users to your Kestra instance, you can do one of the following: If a user wants to change their password, they can do it on their profile. This page can be accessed through the profile in the bottom left corner of the UI. :::collapse{title="Change password in the UI"} - + ::: #### Reset password (by a Super Admin) Kestra provides a "forgot password" functionality that your users can leverage to reset their password. This functionality is available on the login page, where users can click on the "Forgot password?" link. On top of that, a Super Admin can reset a user's password from the User Edit page by going to **Instance** - **Users**. - + - + ### Groups @@ -317,7 +317,7 @@ Each `Group` is a collection of `Owners`, `Users`, or `Service Accounts`. - Each `User` can be assigned to zero, one, or more `Groups`. - Each `Service Account` can also be assigned to zero, one, or more `Groups`. - + Groups are a useful mechanism for providing the same roles to multiple Users or Service Accounts at once by binding a role to a Group. Users with the `GROUP_MEMBERSHIP` permission can add members to groups and change their membership type. diff --git a/content/docs/06.enterprise/03.auth/scim/authentik.md b/src/content/docs/06.enterprise/03.auth/scim/authentik.md similarity index 86% rename from content/docs/06.enterprise/03.auth/scim/authentik.md rename to src/content/docs/06.enterprise/03.auth/scim/authentik.md index 72e579d1ad2..bad25d3e63f 100644 --- a/content/docs/06.enterprise/03.auth/scim/authentik.md +++ b/src/content/docs/06.enterprise/03.auth/scim/authentik.md @@ -32,11 +32,11 @@ As of Kestra version 0.23, Tenants are enabled by default. Please refer to the [ - **Description**: Provide a brief description of the integration. - **Provisioning Type**: Currently, only SCIM 2.0 is supported — leave the default selection and click `Save`. - + The above steps will generate a SCIM endpoint URL and a Secret Token that you will use to authenticate authentik with the SCIM integration in Kestra. Save those details, as they will be needed in the next steps. - + The endpoint should look as follows: @@ -50,7 +50,7 @@ The Secret Token will be a long string (approximately 200 characters) used to au Note that you can disable or completely remove the SCIM Integration at any time. When an integration is disabled, all incoming requests to that integration endpoint will be rejected. - + :::alert{type="info"} At first, you can disable the integration to configure your authentik SCIM integration, and then enable it once the configuration is complete. @@ -64,10 +64,10 @@ When creating a new Provisioning Integration, Kestra will automatically create t - `GROUPS`: `CREATE`, `READ` `UPDATE`, `DELETE` - `USERS`: `CREATE`, `READ`, `UPDATE` - `BINDINGS`: `CREATE`, `READ`, `UPDATE`, `DELETE` -  +  2. Service Account with an API Token which was previously displayed as a Secret Token for the integration: -  +  :::alert{type="info"} Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? This is because you cannot delete a user through our SCIM implementation. Users are global and SCIM provisioning is per tenant. When we receive a `DELETE` query for a user, we remove their tenant access but the user itself remains in the system. @@ -79,7 +79,7 @@ Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? Configuring SCIM 2.0 follows a process similar to SSO — you'll need to create a new `Application`. Then, in the second step, select `SCIM` as the Provider Type. - + In the `Protocol settings` section, enter the `URL` and `Secret Token` obtained from Kestra. @@ -87,26 +87,26 @@ In the `Protocol settings` section, enter the `URL` and `Secret Token` obtained If you are running authentik on a Mac machine with [docker-compose installer](https://docs.goauthentik.io/docs/installation/docker-compose), make sure to replace `localhost` in your Kestra's SCIM endpoint with `host.docker.internal` since otherwise the sync won't work. Your URL should look as follows: `http://host.docker.internal:8080/api/v1/dev/integrations/zIRjRAMGvkammpeLVuyJl/scim/v2`. ::: - + ## Test both SSO and SCIM by adding users and groups First, create `Users` and `Groups` in the `Directory` settings. - + Then assign your user(s) to an existing group. - + You can set a password for each authentik user to allow them to log in directly to Kestra with their username/email and password. - + Once groups and users are created, they should be visible in the Kestra UI under the `IAM` → `Users` and `Groups` sections. It’s best to log in as the default admin user and attach the desired `Role` to each group to ensure that the users have the necessary permissions. - + Then, to verify access, log in as one of those new authentik users in a separate browser or incognito mode and verify that the user has the permissions you expect. diff --git a/content/docs/06.enterprise/03.auth/scim/index.md b/src/content/docs/06.enterprise/03.auth/scim/index.md similarity index 97% rename from content/docs/06.enterprise/03.auth/scim/index.md rename to src/content/docs/06.enterprise/03.auth/scim/index.md index 15da2f691e5..4639adf1570 100644 --- a/content/docs/06.enterprise/03.auth/scim/index.md +++ b/src/content/docs/06.enterprise/03.auth/scim/index.md @@ -19,7 +19,7 @@ It simplifies user provisioning, de-provisioning, and group synchronization betw Kestra explicitly relies on the SCIM 2.0 protocol for directory synchronization. - + ## Benefits of a Directory Sync with SCIM diff --git a/content/docs/06.enterprise/03.auth/scim/keycloak.md b/src/content/docs/06.enterprise/03.auth/scim/keycloak.md similarity index 90% rename from content/docs/06.enterprise/03.auth/scim/keycloak.md rename to src/content/docs/06.enterprise/03.auth/scim/keycloak.md index c692386ce82..58c93b4d67e 100644 --- a/content/docs/06.enterprise/03.auth/scim/keycloak.md +++ b/src/content/docs/06.enterprise/03.auth/scim/keycloak.md @@ -32,11 +32,11 @@ As of Kestra version 0.23, Tenants are enabled by default. Please refer to the [ - **Description**: Provide a brief description of the integration. - **Provisioning Type**: currently, we only support SCIM 2.0 — leave the default selection and click `Save`. - + The steps above will generate a SCIM endpoint URL and a Secret Token that you will use to authenticate Keycloak with the SCIM integration in Kestra. Save those details as we will need them in the next steps. - + The endpoint should look as follows: @@ -50,7 +50,7 @@ The Secret Token is a long string (approx. 200 characters) used to authenticate Note that you can disable or completely remove the SCIM Integration at any time. When an integration is disabled, all incoming requests to that integration endpoint will be rejected. - + :::alert{type="info"} @@ -65,10 +65,10 @@ When creating a new Provisioning Integration, Kestra will automatically create t - `GROUPS`: `CREATE`, `READ` `UPDATE`, `DELETE` - `USERS`: `CREATE`, `READ`, `UPDATE` - `BINDINGS`: `CREATE`, `READ`, `UPDATE`, `DELETE` -  +  2. Service Account with an API Token which was previously displayed as the Secret Token for the integration: -  +  :::alert{type="info"} Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? This is because you cannot delete a user using our SCIM implementation. Users are global and SCIM provisioning is per tenant. When we receive a `DELETE` query for a user, we remove their tenant access but the user itself remains in the system. @@ -85,10 +85,10 @@ However, there are paid solutions such as [SCIM for Keycloak](https://scim-for-k 1. **Obtain a License**: - Create a new account on: https://scim-for-keycloak.de/ - Purchase a free license (no VAT number or credit card is required for a free license). -  +  2. **Install the SCIM Provider Plugin**: - Download the plugin JAR file from the `Downloads` section in your Account (e.g. `scim-for-keycloak-kc-25-2.2.1-free.jar`). -  +  - Place the JAR file in the `./providers` directory of your Keycloak installation (or in the current folder if Keycloak is deployed with Docker). - More information: [SCIM for Keycloak Installation](https://scim-for-keycloak.de/documentation/installation/install) 3. **Deploy Keycloak**: @@ -114,16 +114,16 @@ However, there are paid solutions such as [SCIM for Keycloak](https://scim-for-k - Run `docker-compose up` to start Keycloak. 4. **Configure the SCIM for Keycloak**: - To synchronize Users and Groups from Keycloak to Kestra, connect to the `SCIM Administration Console` for Keycloak with SCIM. -  +  - Enable SCIM for the Realm -  +  - Note that `Bulk` and `Password synchronization` operations are currently not supported by Kestra and must be disabled in Keycloak. 5. **Create a SCIM Client**: - Navigate to the `Remote SCIM Provider` section - Fill the `Base URL` field with your Kestra `SCIM Endpoint`: -  +  - Fill the `Authentication` with your Kestra `Secret Token`: -  +  6. **Enable Provisioning**: - Now that everything is configured, you can toggle the `Enabled` field on in the Kestra Provisioning Integration to start syncing users and groups from Keycloak to Kestra. diff --git a/content/docs/06.enterprise/03.auth/scim/microsoft-entra-id.md b/src/content/docs/06.enterprise/03.auth/scim/microsoft-entra-id.md similarity index 95% rename from content/docs/06.enterprise/03.auth/scim/microsoft-entra-id.md rename to src/content/docs/06.enterprise/03.auth/scim/microsoft-entra-id.md index 8f1aacb06b8..0934d4b83c9 100644 --- a/content/docs/06.enterprise/03.auth/scim/microsoft-entra-id.md +++ b/src/content/docs/06.enterprise/03.auth/scim/microsoft-entra-id.md @@ -28,11 +28,11 @@ kestra: - **Description**: Provide a brief description of the integration. - **Provisioning Type**: currently, we only support SCIM 2.0 — leave the default selection and click `Save`. - + The above steps will generate a SCIM endpoint URL and a Secret Token that you will use to authenticate Microsoft Entra ID with the SCIM integration in Kestra. Save those details as they will be needed in the next steps. - + The endpoint should look as follows: @@ -46,7 +46,7 @@ The Secret Token is a long string (approx. 200 characters) used to authenticate Note that you can disable or completely remove the SCIM Integration at any time. When an integration is disabled, all incoming requests to that integration endpoint will be rejected. - + :::alert{type="info"} @@ -61,10 +61,10 @@ When creating a new Provisioning Integration, Kestra will automatically create t - `GROUPS`: `CREATE`, `READ` `UPDATE`, `DELETE` - `USERS`: `CREATE`, `READ`, `UPDATE` - `BINDINGS`: `CREATE`, `READ`, `UPDATE`, `DELETE` -  +  2. Service Account with an API Token which was previously displayed as the Secret Token for the integration: -  +  :::alert{type="info"} Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? This is because you cannot delete a user through our SCIM implementation. Users are global and SCIM provisioning is per tenant. When we receive a `DELETE` query for a user, we remove their tenant access but the user itself remains in the system. @@ -77,14 +77,14 @@ Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? ### 1. Register Kestra as an Enterprise Application: - Navigate to Microsoft Entra ID → Enterprise Applications. - Click on the `+ New application` button to create a new custom application. You can name the app "KestraSCIM" or any other relevant name. -  +  ### 2. Configure SCIM Provisioning: - Go to the newly created Kestra application. - Select "Provisioning" and set the Provisioning Mode to "Automatic". - Enter the SCIM endpoint URL and the Secret Token provided by Kestra. Paste Kestra's SCIM endpoint URL into the Tenant URL field and the Secret Token into the Secret Token field. - Finally, click on `Test Connection` and on the `Save` button. -  +  ### 3. Map User and Group Attributes: diff --git a/content/docs/06.enterprise/03.auth/scim/okta.md b/src/content/docs/06.enterprise/03.auth/scim/okta.md similarity index 94% rename from content/docs/06.enterprise/03.auth/scim/okta.md rename to src/content/docs/06.enterprise/03.auth/scim/okta.md index 8bad74ab123..f14302296d2 100644 --- a/content/docs/06.enterprise/03.auth/scim/okta.md +++ b/src/content/docs/06.enterprise/03.auth/scim/okta.md @@ -32,11 +32,11 @@ As of Kestra version 0.23, Tenants are enabled by default. Please refer to the [ - **Description**: Provide a brief description of the integration. - **Provisioning Type**: Currently, only SCIM 2.0 is supported — leave the default selection and click `Save`. - + The above steps will generate a SCIM endpoint URL and a Secret Token that you will use to authenticate Okta with the SCIM integration in Kestra. Save those details as we will need them in the next steps. - + The endpoint should look as follows: @@ -50,7 +50,7 @@ The Secret Token is a long string (approx. 200 characters) used to authenticate Note that you can disable or completely remove the SCIM Integration at any time. When an integration is disabled, all incoming requests for that integration endpoint will be rejected. - + :::alert{type="info"} @@ -65,10 +65,10 @@ When creating a new Provisioning Integration, Kestra will automatically create t - `GROUPS`: `CREATE`, `READ` `UPDATE`, `DELETE` - `USERS`: `CREATE`, `READ`, `UPDATE` - `BINDINGS`: `CREATE`, `READ`, `UPDATE`, `DELETE` -  +  2. Service Account with an API Token which was previously displayed as the Secret Token for the integration: -  +  :::alert{type="info"} Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? This is because you cannot delete a user through our SCIM implementation. Users are global and SCIM provisioning is per tenant. When we receive a `DELETE` query for a user, we remove their tenant access but the user itself remains in the system. @@ -90,7 +90,7 @@ Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? - Sign-in redirect URIs → http:///oauth/callback/okta - Sign-out redirect URIs → http:// /logout - Once application is created, select it in the Applications view and take note of the client ID and client secret. -  +  2. **Configure Okta in Kestra**: - With the above client ID and secret, add the following in your Kestra Micronaut configuration: @@ -117,7 +117,7 @@ Why the `SCIMProvisioner` role doesn't have the `DELETE` permission for `USERS`? - Select the integration you have just created, then enter the `Provisioning` tab. - Fill in the SCIM 2.0 Base URL field with the endpoint URL you obtained from Kestra. Enter the Secret Token generated in Kestra into the `OAuth Bearer Token` field. - Finally, click `Test API Credentials` to verify the connection. -  +  4. **Map Attributes**: - Select “Push Groups” and choose the Groups you wish to push to Kestra. diff --git a/content/docs/06.enterprise/03.auth/service-accounts.md b/src/content/docs/06.enterprise/03.auth/service-accounts.md similarity index 93% rename from content/docs/06.enterprise/03.auth/service-accounts.md rename to src/content/docs/06.enterprise/03.auth/service-accounts.md index 7c63387e6c5..7f19c58f3a2 100644 --- a/content/docs/06.enterprise/03.auth/service-accounts.md +++ b/src/content/docs/06.enterprise/03.auth/service-accounts.md @@ -24,11 +24,11 @@ In contrast to regular users, Service Accounts don't have a password and they do To create a new service account, go to **Service Accounts** tab on the **IAM** page under the **Administration** section and click the **Create** button. Fill in the form with the required information, including the name and description and click **Save**: - + Once you have created a service account, you can add a Role that will grant it permissions to specific resources. To do this, switch to the **Access** tab and click the **Add** button and select the role you want to assign to the service account. - + Finally, you can generate an API token for the service account by clicking the **Create** button. This will generate a token that you can use to authenticate the service account with Kestra from external applications such as CI/CD pipelines (e.g., in Terraform provider configuration or GitHub Actions secrets). @@ -38,13 +38,13 @@ Finally, you can generate an API token for the service account by clicking the * Once you confirm the API token creation via the **Generate** button, the token will be generated and displayed in the UI. Make sure to copy the token and store it in a secure location as it will not be displayed again. - + ## Users vs. Service Accounts vs. API Tokens You can create an **API token** for a regular user as well. While Service Accounts are recommended for programmatic API access to Kestra from CI/CD or other external applications, it's often useful to create an API token for a regular user, so that programmatic actions performed by that user can be tracked and audited. - + Therefore, the difference between a service account and a user is that a service account is designed for programmatic access and doesn't have a password or personal information attached to it. Instead, it is authenticated exclusively using an API token. A user, on the other hand, can interact with both the Kestra UI and the API, and can be authenticated using a password or an API token. @@ -95,4 +95,4 @@ As an Admin of your Kestra environment, you can test the access of Service Accou **Impersonate** is available through the IAM -> Service Accounts tab. Select any Service Account to impersonate, ensuring permissions and access are correctly implemented across accounts. - + diff --git a/content/docs/06.enterprise/03.auth/sso/authentik.md b/src/content/docs/06.enterprise/03.auth/sso/authentik.md similarity index 89% rename from content/docs/06.enterprise/03.auth/sso/authentik.md rename to src/content/docs/06.enterprise/03.auth/sso/authentik.md index d3422b2dd50..70275b55546 100644 --- a/content/docs/06.enterprise/03.auth/sso/authentik.md +++ b/src/content/docs/06.enterprise/03.auth/sso/authentik.md @@ -14,28 +14,28 @@ In conjunction with SSO, check out the [authentik SCIM provisioning guide](../sc Authentik provides a simple docker-compose installer for testing purposes. Follow [the instructions](https://docs.goauthentik.io/docs/installation/docker-compose) and click on the [initial setup URL](http://docker.for.mac.localhost:9000/if/flow/initial-setup/) to create your first user. - + ### Create Application and SSO Provider in authentik On the left-hand side, select **Applications → Applications**. For simplicity, we’ll use the **Create with Wizard** button, as this will create both an application and a provider. - + On the **Application Details** screen, fill in the application `name` and `slug`. Set both here to `kestra` and click `Next`. - + On the **Provider Type** screen, select **OAuth2/OIDC** and click **Next**. - + On the **Provider Configuration** screen: 1. In the **Authentication flow** field, select “default-authentication-flow (Welcome to authentik!)”. 2. In the **Authorization flow** field, select “default-provider-authorization-explicit-consent (Authorize Application)”. - + 3. Keep the Client type as **Confidential**. Under the **Redirect URIs/Origins (RegEx)**, enter your Kestra host's `/oauth/callback/authentik` endpoint in the format `http:// : /oauth/callback/authentik` (e.g., http://localhost:8080/oauth/callback/authentik) and then `Submit` the Application. - + Note the `Client ID` and `Client Secret` as you will need these to configure Kestra in the next step. diff --git a/content/docs/06.enterprise/03.auth/sso/google-oidc.md b/src/content/docs/06.enterprise/03.auth/sso/google-oidc.md similarity index 95% rename from content/docs/06.enterprise/03.auth/sso/google-oidc.md rename to src/content/docs/06.enterprise/03.auth/sso/google-oidc.md index a24c09a729d..aebcbb33422 100644 --- a/content/docs/06.enterprise/03.auth/sso/google-oidc.md +++ b/src/content/docs/06.enterprise/03.auth/sso/google-oidc.md @@ -37,7 +37,7 @@ Refer to the [Google OIDC setup documentation](https://cloud.google.com/identity - Click on **Add a Provider**. - From the list, choose **OpenID Connect**. - + 3. **Configure the OIDC Provider**: - **Grant type**: Select the Code Flow grant type. @@ -47,7 +47,7 @@ Refer to the [Google OIDC setup documentation](https://cloud.google.com/identity - **Issuer URL**: Provide the **Issuer URL** (e.g., `https://accounts.google.com`). - **Scopes**: Specify any additional scopes required by your application. - + 4. **Save the Configuration**: - Click **"Save"** to add the OIDC provider to your Identity Platform configuration. diff --git a/content/docs/06.enterprise/03.auth/sso/index.md b/src/content/docs/06.enterprise/03.auth/sso/index.md similarity index 100% rename from content/docs/06.enterprise/03.auth/sso/index.md rename to src/content/docs/06.enterprise/03.auth/sso/index.md diff --git a/content/docs/06.enterprise/03.auth/sso/keycloak.md b/src/content/docs/06.enterprise/03.auth/sso/keycloak.md similarity index 92% rename from content/docs/06.enterprise/03.auth/sso/keycloak.md rename to src/content/docs/06.enterprise/03.auth/sso/keycloak.md index 6d8ae8e82dc..d0157d7c43b 100644 --- a/content/docs/06.enterprise/03.auth/sso/keycloak.md +++ b/src/content/docs/06.enterprise/03.auth/sso/keycloak.md @@ -18,12 +18,12 @@ You can follow the steps described in the [Keycloak tutorial documentation](http Once in Keycloak, create a new client: - - + + Set `https://{{ yourKestraInstanceURL }}/oauth/callback/keycloak` as the valid redirect URI and `https://{{ yourKestraInstanceURL }}/logout` as the valid post-logout redirect URI. - + ## Kestra Configuration @@ -45,8 +45,8 @@ micronaut: You can retrieve the `clientId` and `clientSecret` via Keycloak user interface - - + + Don't forget to set a default role in your [Kestra configuration](../../../configuration/index.md) to streamline the process of onboarding new users. diff --git a/content/docs/06.enterprise/03.auth/sso/ldap.md b/src/content/docs/06.enterprise/03.auth/sso/ldap.md similarity index 98% rename from content/docs/06.enterprise/03.auth/sso/ldap.md rename to src/content/docs/06.enterprise/03.auth/sso/ldap.md index 11445b7a881..7e1d5baf576 100644 --- a/content/docs/06.enterprise/03.auth/sso/ldap.md +++ b/src/content/docs/06.enterprise/03.auth/sso/ldap.md @@ -59,7 +59,7 @@ Once LDAP is configured, when a user logs into Kestra for the first time, their If they are a part of any groups specified in the directory, those groups will be added to Kestra. If the group already exists in Kestra, they will be automatically added. If a user is added to a group after their initial login, they must log out and log back in for the new group assignment to sync, as synchronization occurs only at login. Any user authenticated via LDAP will show `LDAP` as their Authentication method in the **IAM - Users** tab in Kestra. - + Any updates to a user and their group access on the LDAP server will update in Kestra at the next synchronization (typically at the next login). diff --git a/content/docs/06.enterprise/03.auth/sso/microsoft-oidc.md b/src/content/docs/06.enterprise/03.auth/sso/microsoft-oidc.md similarity index 100% rename from content/docs/06.enterprise/03.auth/sso/microsoft-oidc.md rename to src/content/docs/06.enterprise/03.auth/sso/microsoft-oidc.md diff --git a/content/docs/06.enterprise/03.auth/sso/okta.md b/src/content/docs/06.enterprise/03.auth/sso/okta.md similarity index 90% rename from content/docs/06.enterprise/03.auth/sso/okta.md rename to src/content/docs/06.enterprise/03.auth/sso/okta.md index b21c198d46e..b42952062ab 100644 --- a/content/docs/06.enterprise/03.auth/sso/okta.md +++ b/src/content/docs/06.enterprise/03.auth/sso/okta.md @@ -20,36 +20,36 @@ This guide covers setup with Okta from a high level, refer to the [Okta OIDC set Log in to your Okta account and select **Applications** from the left side menu. - + Next, select **Create App Integration**, select **OIDC - OpenID Connect** as the sign-in method and **Web Application** as the application type. Select **Next**, and you will be taken to configure the general settings of the new web app integration. - + ## Step 2: Configure the Web App Integration In the General Settings, give your App integration a name and set your grant type. For this example, we are using Authorization Code. You can open **Advanced Settings** to configure more sensitive grants. Okta has several direct-auth API grants, such as OTP, OOB, MFA OTP, and MFA OOB that you can select only if necessary. - + Here, you also set the **Sign-in redirect URIs** and **Sign-out redirect URIs** for your App integration. For this example connecting to Kestra, we set a Sign-in redirect URI as `http://localhost:8080/oauth/callback/okta` and sign-out as `http://localhost:8080/logout`, but you can customize this to your environment. Further down the page, you can configure optional **Trusted Origins**, and then choose the **Assignments** and the access settings for the App integration. We'll set the access to everyone in the organization, but you can set stricter access to only certain selected groups or skip for now. Lastly, we uncheck the setting to enable immediate access with Federation Broker Mode because we will give manual app access for this basic example. Finally, hit **Save**. - + ## Step 3: Add test user to Okta app integration To create a test user in your Okta Directory to test your app integration, in your Okta Admin Dashboard, navigate to **Directory > People**. Select **Add Person**. - + Enter user test details, including a password, and save the test user. In the **Directory**, select the new user, and navigate to the **Applications** tab for the user and choose **Assign Applications**. - + Select the Kestra application name you created and enter the added details for the user and hit **Save**. @@ -57,11 +57,11 @@ Select the Kestra application name you created and enter the added details for t Now that Okta is set up as an OIDC provider, we need to link it to Kestra. After saving your settings in the previous step, Okta will automatically redirect you to your integration. Here, you can collect your client credentials to connect to Kestra, **Client ID** and **Client Secret**. - + After copying your **Client ID** and **Client Secret**, switch from the **General** tab to the **Sign On** tab. Here, you can configure your **OpenID Connect ID Token**. For this example, we will edit the issuer from Dynamic to our Okta URL. Click **Save** and copy the URL to be used in our [Kestra configuration](../../../configuration/index.md) along with the Client ID and Client Secret. - + 1. **Navigate to the Kestra Configuration File**: - Locate the [Kestra configuration](../../../configuration/index.md) file. @@ -87,8 +87,8 @@ After copying your **Client ID** and **Client Secret**, switch from the **Genera On restart, you will now see Okta as an available login method. - + After logging in with the created user, navigate to the **Administration > IAM** tab, and you can see in the **Users** tab that the user can sign in with basic authentication as well as Okta. - + diff --git a/content/docs/06.enterprise/04.scalability/apps.md b/src/content/docs/06.enterprise/04.scalability/apps.md similarity index 98% rename from content/docs/06.enterprise/04.scalability/apps.md rename to src/content/docs/06.enterprise/04.scalability/apps.md index f054d93c097..32aa37ef576 100644 --- a/content/docs/06.enterprise/04.scalability/apps.md +++ b/src/content/docs/06.enterprise/04.scalability/apps.md @@ -60,7 +60,7 @@ In short, Apps make it easy to turn your Kestra workflows into simple applicatio To create a new app, go to the `Apps` page in the main UI and click the `+ Create` button. Add your app configuration as code and click on `Save`. Like Flows, Apps also have different editor views. You can configure your App while simultaneously viewing documentation, previewing your App layout, or searching the App blueprint repository. - + ### App to run a Hello World flow @@ -107,7 +107,7 @@ Then, add your app configuration to create a form that requests compute resource Like flows, Apps can also be created using the no-code editor. Every element available in code — such as blocks, properties, and configuration options — is fully supported in the no-code interface. When you build or update an App in the no-code editor, those changes are immediately reflected in the code view, preserving the declarative YAML definition behind the scenes. This ensures consistency between visual and code-first approaches, allowing teams to switch seamlessly between them without losing control, readability, or versioning. - + --- @@ -115,7 +115,7 @@ Like flows, Apps can also be created using the no-code editor. Every element ava The App Catalog is where users can find available apps. You can filter apps by name, type, namespace, or tags. From this page, you can also create new apps, edit existing ones, and temporarily disable or delete apps. - + Kestra provides a direct access URL to the Apps Catalog via a dedicated URL in the format `http://your_host/ui/your_tenant/apps/catalog`. This URL can be accessed by any Kestra user who has at least `APP`-Read and `APPEXECUTION`-Read permissions in that Kestra tenant (adding all `APPEXECUTION` permissions is recommended). @@ -123,7 +123,7 @@ The catalog page requires authentication, so the Apps Catalog is never publicly ```yaml -access: +access: catalog: true type: PRIVATE groups: diff --git a/content/docs/06.enterprise/04.scalability/index.md b/src/content/docs/06.enterprise/04.scalability/index.md similarity index 100% rename from content/docs/06.enterprise/04.scalability/index.md rename to src/content/docs/06.enterprise/04.scalability/index.md diff --git a/content/docs/06.enterprise/04.scalability/task-runners.md b/src/content/docs/06.enterprise/04.scalability/task-runners.md similarity index 100% rename from content/docs/06.enterprise/04.scalability/task-runners.md rename to src/content/docs/06.enterprise/04.scalability/task-runners.md diff --git a/content/docs/06.enterprise/04.scalability/worker-group.md b/src/content/docs/06.enterprise/04.scalability/worker-group.md similarity index 94% rename from content/docs/06.enterprise/04.scalability/worker-group.md rename to src/content/docs/06.enterprise/04.scalability/worker-group.md index c6bab9cedd3..21742ec0f34 100644 --- a/content/docs/06.enterprise/04.scalability/worker-group.md +++ b/src/content/docs/06.enterprise/04.scalability/worker-group.md @@ -24,17 +24,17 @@ Please note that Worker Groups are not yet available in Kestra Cloud, only in Ke To create a new Worker Group, navigate to the **Instance** page under the **Administration** section in the UI, go to the **Worker Groups** tab, and click on the `+ Add Worker Group` button. Then, set a **Key**, a **Description**, and optionally **Allowed Tenants** for that worker group. You can also accomplish this via API, CLI, or Terraform. - + ## Starting Workers for a Worker Group Once a worker group key is created, you can start a worker with the `kestra server worker --worker-group {workerGroupKey}` flag to assign it to that worker group. You can also assign a default worker group at the namespace and tenant level. - + The Worker Groups UI tracks the health of worker groups, showing how many workers are polling for tasks within each worker group. This gives you visibility into which worker groups are active and the number of active workers. - + :::alert{type="info"} In order to run the command at startup, you need to run each component independently and use the command for the worker component startup. To set this up, read more about running [Kestra with separated server components](../../server-cli/index.md#kestra-with-server-components-in-different-services). @@ -119,13 +119,13 @@ When Fallback behavior is set in multiple places, Kestra resolves which action t Namespaces can be configured to have a default `fallback` behavior. It can be configured by creating a namespace manaully or modifying in the **Edit** tab of the namespace. - + ### Fallback Behavior at the Tenant Level Tenants can be configured to have a default `fallback` behavior. It can be configured when creating a tenant on in the tenant's properties. - + ## When to use Worker Groups @@ -170,7 +170,7 @@ You can use a Worker Group to designate a worker to execute **any** task on a re The Distant Worker use case requires a connection to the Kestra metastore, and it solves for scenarios of always-on, intensive workloads and workloads that need to execute workloads on an external environment. - + ### Task Runners @@ -178,7 +178,7 @@ If you are using scripting tasks, you can set up Worker Group of Task Runners to This is particularly useful for script task workloads that have bursts in resource demand. - + ### Data Isolation @@ -186,7 +186,7 @@ Worker Groups strongly fits **Data Isolation** use cases. Multi-tenancy requirem In the below architecture, it is not possible to execute tasks on worker 1 from tenant 3. - + :::alert{type="warning"} Even if you are using worker groups, we strongly recommend having at least one worker in the default worker group. diff --git a/content/docs/06.enterprise/05.instance/announcements.md b/src/content/docs/06.enterprise/05.instance/announcements.md similarity index 80% rename from content/docs/06.enterprise/05.instance/announcements.md rename to src/content/docs/06.enterprise/05.instance/announcements.md index bfc0c53e33d..ae56beca445 100644 --- a/content/docs/06.enterprise/05.instance/announcements.md +++ b/src/content/docs/06.enterprise/05.instance/announcements.md @@ -19,7 +19,7 @@ Announcements allow you to notify your users about any important events such as To add a custom in-app banner, go to the **Administration → Instance → Announcements** tab. - + As a user with an Admin role, you can configure the following within each announcement: @@ -27,7 +27,7 @@ As a user with an Admin role, you can configure the following within each announ - `Type`: the type of banner to display (`info`, `warning`, `error`) - The `start` and `end` date during which the announcement should be displayed. - + - + diff --git a/content/docs/06.enterprise/05.instance/dashboard.md b/src/content/docs/06.enterprise/05.instance/dashboard.md similarity index 98% rename from content/docs/06.enterprise/05.instance/dashboard.md rename to src/content/docs/06.enterprise/05.instance/dashboard.md index 73a943d1815..49734932bc1 100644 --- a/content/docs/06.enterprise/05.instance/dashboard.md +++ b/src/content/docs/06.enterprise/05.instance/dashboard.md @@ -26,7 +26,7 @@ The **Overview** tab gives a high-level snapshot of your instance’s operationa - Check real-time metrics like uptime and service liveness. - Access detailed configurations for each service (e.g., version, hostname, heartbeat intervals). - + ## Monitoring Services diff --git a/content/docs/06.enterprise/05.instance/index.md b/src/content/docs/06.enterprise/05.instance/index.md similarity index 100% rename from content/docs/06.enterprise/05.instance/index.md rename to src/content/docs/06.enterprise/05.instance/index.md diff --git a/content/docs/06.enterprise/05.instance/maintenance-mode.md b/src/content/docs/06.enterprise/05.instance/maintenance-mode.md similarity index 96% rename from content/docs/06.enterprise/05.instance/maintenance-mode.md rename to src/content/docs/06.enterprise/05.instance/maintenance-mode.md index 45be4f5a845..0a2ae09fda3 100644 --- a/content/docs/06.enterprise/05.instance/maintenance-mode.md +++ b/src/content/docs/06.enterprise/05.instance/maintenance-mode.md @@ -26,6 +26,6 @@ Maintenance Mode addresses a common challenge faced by organizations running num Maintenance Mode is accessible via the **Instance** tab of the **Administration** section of the Kestra UI. You can switch to maintenance mode in the **Overview** tab by clicking the **enter maintenance mode** button. This triggers a confirmation prompt and displays information regarding the transition into maintenance mode. - + After completing all maintenance operations, you can exit maintenance mode with the same button and confirm that you want to switch back to a live state of your Kestra instance. diff --git a/content/docs/06.enterprise/05.instance/versioned-plugins.md b/src/content/docs/06.enterprise/05.instance/versioned-plugins.md similarity index 95% rename from content/docs/06.enterprise/05.instance/versioned-plugins.md rename to src/content/docs/06.enterprise/05.instance/versioned-plugins.md index a9be3f64e6f..2235f51cc26 100644 --- a/content/docs/06.enterprise/05.instance/versioned-plugins.md +++ b/src/content/docs/06.enterprise/05.instance/versioned-plugins.md @@ -77,26 +77,26 @@ Below is an video demonstration walking through each step from installation to a Here are the steps again, listed one by one. Both Kestra official plugins and custom plugins can be installed from the UI. Navigate to the **Administration > Instance** section and then **Versioned Plugins**. You can click **+ Install** and open up the full library of available plugins. - + From the list, search and select the plugin to install and select the version. - + After installing plugins, the full list of versioned plugins is displayed. Kestra alerts you that a newer version of your plugin is available and allows you to upgrade by installing the latest version. When upgrading, the previous version of the plugin is preserved, and a separate, fresh installation of the latest version is added. - + For a custom plugin, after clicking **+ Install**, switch from Official plugin to Custom plugin. You need to specify two identifiers for each custom plugin installation: - Group ID: The group identifier of the plugin to be installed. - Artifact ID: The artifact identifier of the plugin to be installed. - + Instead of installing a new plugin, you can **Upload** a plugin by choosing a valid Java archive file (`.jar`). - + ### From the API diff --git a/content/docs/06.enterprise/06.ee-faq/index.md b/src/content/docs/06.enterprise/06.ee-faq/index.md similarity index 100% rename from content/docs/06.enterprise/06.ee-faq/index.md rename to src/content/docs/06.enterprise/06.ee-faq/index.md diff --git a/content/docs/06.enterprise/index.md b/src/content/docs/06.enterprise/index.md similarity index 100% rename from content/docs/06.enterprise/index.md rename to src/content/docs/06.enterprise/index.md diff --git a/content/docs/07.architecture/01.main-components.md b/src/content/docs/07.architecture/01.main-components.md similarity index 100% rename from content/docs/07.architecture/01.main-components.md rename to src/content/docs/07.architecture/01.main-components.md diff --git a/content/docs/07.architecture/02.server-components.md b/src/content/docs/07.architecture/02.server-components.md similarity index 100% rename from content/docs/07.architecture/02.server-components.md rename to src/content/docs/07.architecture/02.server-components.md diff --git a/content/docs/07.architecture/03.deployment-architecture.md b/src/content/docs/07.architecture/03.deployment-architecture.md similarity index 92% rename from content/docs/07.architecture/03.deployment-architecture.md rename to src/content/docs/07.architecture/03.deployment-architecture.md index a203e98dba3..efabd7ecf5a 100644 --- a/content/docs/07.architecture/03.deployment-architecture.md +++ b/src/content/docs/07.architecture/03.deployment-architecture.md @@ -17,7 +17,7 @@ You can find three example deployment architectures below. ## Small-sized deployment - + For small-sized deployments, you can use the Kestra _standalone server_, an all-in-one server component that allows you to run all Kestra server components in a single process. This deployment architecture has no scaling capability. @@ -29,7 +29,7 @@ In this case, a database is the only dependency. This allows running Kestra with ## Medium-sized deployment - + For medium-sized deployments, where high availability is not a strict requirement, you can use a database (Postgres or MySQL) as the only dependency. This allows you to run Kestra with a minimal stack to maintain. For now, we have two databases available for this kind of architecture, as H2 is not a good fit when running distributed components: @@ -42,7 +42,7 @@ In this deployment mode, unless all components run on the same host, you must us ## High-availability deployment - + To support higher throughput, and full horizontal and vertical scaling of the Kestra cluster, we can replace the database with Kafka and Elasticsearch. In this case, all the server components can be scaled without any single point of failure. diff --git a/content/docs/07.architecture/10.multi-tenancy.md b/src/content/docs/07.architecture/10.multi-tenancy.md similarity index 94% rename from content/docs/07.architecture/10.multi-tenancy.md rename to src/content/docs/07.architecture/10.multi-tenancy.md index 88d654dff4c..f7d7e430829 100644 --- a/content/docs/07.architecture/10.multi-tenancy.md +++ b/src/content/docs/07.architecture/10.multi-tenancy.md @@ -21,7 +21,7 @@ Data stored inside the [Internal Storage](./09.internal-storage.md) is also isol End-users can use the tenant selection dropdown menu from the [UI](../08.ui/index.md) to see tenants they have access to. It allows users to switch between tenants easily. Each UI page also includes the tenant ID in the URL (e.g., `https://demo.kestra.io/ui/yourTenantId/executions/namespace/flow/executionId`.) - + Most of [API](../api-reference/index.md) endpoints also include the tenant identifier. The exception to that are instance-level endpoints such as `/configs`, `/license-info` or `/banners` that require a `Superadmin` access. diff --git a/content/docs/07.architecture/data-components.md b/src/content/docs/07.architecture/data-components.md similarity index 100% rename from content/docs/07.architecture/data-components.md rename to src/content/docs/07.architecture/data-components.md diff --git a/content/docs/07.architecture/index.md b/src/content/docs/07.architecture/index.md similarity index 97% rename from content/docs/07.architecture/index.md rename to src/content/docs/07.architecture/index.md index ab53b18a1f0..75cace779a5 100644 --- a/content/docs/07.architecture/index.md +++ b/src/content/docs/07.architecture/index.md @@ -8,7 +8,7 @@ Kestra's architecture is designed to be scalable, flexible, and fault-tolerant. The following diagram shows the main components of Kestra using the JDBC backend. - + Here are the components and their interactions: @@ -43,7 +43,7 @@ The JDBC Backend can be scaled too, either through clustering or sharding, to ha The following diagram shows the main components of Kestra using the [Kafka](https://kafka.apache.org/) and [Elasticsearch](https://www.elastic.co/elasticsearch) backend. - + :::alert{type="info"} Note that this architecture is only available in the [Enterprise Edition](../06.enterprise/01.overview/01.enterprise-edition.md) of Kestra. diff --git a/content/docs/08.ui/00.dashboard.md b/src/content/docs/08.ui/00.dashboard.md similarity index 98% rename from content/docs/08.ui/00.dashboard.md rename to src/content/docs/08.ui/00.dashboard.md index fa6b56b690a..69ef6af4eb7 100644 --- a/content/docs/08.ui/00.dashboard.md +++ b/src/content/docs/08.ui/00.dashboard.md @@ -13,7 +13,7 @@ Once you have executed a flow, you will see your flow executions in the dashboar The Dashboard page displays both the **default dashboard** and any **custom dashboards** you've created. To switch between dashboards, use the hamburger menu. If you have over 10 dashboards, type the dashboard name in the search bar to quickly find it. The same menu also lets you edit or delete existing dashboards. - + Dashboards provide a load of useful data right at your finger tips, including: - Executions over time @@ -166,7 +166,7 @@ To see all available properties to configure a custom dashboard as code, see exa Table data can be exported as a CSV file by hovering over the top-right corner and clicking the download icon. This enables dashboard users to build custom queries in Dashboards and to export data with one click without having to worry about pagination. - + ## Querying data diff --git a/content/docs/08.ui/01.flows.md b/src/content/docs/08.ui/01.flows.md similarity index 88% rename from content/docs/08.ui/01.flows.md rename to src/content/docs/08.ui/01.flows.md index 154ddffcf81..d81ef723611 100644 --- a/content/docs/08.ui/01.flows.md +++ b/src/content/docs/08.ui/01.flows.md @@ -10,11 +10,11 @@ On the **Flows** page, you see a list of flows which you can edit and execute. Y By clicking on a flow id or on the eye icon, you can open a flow. - + A **Flow** page has multiple tabs that allow you to: see the flow topology, all flow executions, edit the flow, view its revisions, logs, metrics, and dependencies. You are also able to edit namespace files in the Flow editor as well. - + ## Filters @@ -42,55 +42,55 @@ Additionally, from the **Actions** menu, you can export your flow as a YAML file The flow code View allows you to edit your workflows with YAML. Autocomplete makes writing workflows simple. As new tasks are added, they will automatically appear in the no-code, docmentation and topology view. - + ### No-code View The no-code View allows you to edit your workflows directly from the UI. As you modify your flow, YAML code will be generated in real time in the flow code view allowing you to swap between thw two seamlessly. - + ### Topology View The topology View allows you to visualize the structure of your flow. This is especially useful when you have complex flows with multiple branches of logic. From the bottom left corner of the Topology View, you can zoom in, zoom out, and export your flow topology as a `.png` file. - + ### Documentation View The documentation view displays Kestra's documentation right inside of the editor. As you move your type cursor around the editor, the documentation page updates to reflect the specific task type documentation. - + :::alert{type="warning"} Note that if you use the [Brave browser](https://brave.com/), you may need to disable the Brave Shields to make the editor work as expected. Specifically, to view the task documentation, you need to set the `Block cookies` option to `Disabled` in the Shields settings: `brave://settings/shields`. - + ::: ## Files View The **Files** view allows you to create, edit and delete Namespaces Files. Multiple files can be opened at the same time, as well as displayed side by side using multiple panels. - + ### Blueprints View The **Blueprints** view gives you example flows to copy directly into your flow. Blueprints are especially useful if you're using a new plugin where you want to work off of an existing example. - + ### Namespace Context In the **Namespace Context** view, you can directly access your Variables, KV pairs, and Secrets managed at the namespace level. You can also render expressions that fall within those categories. - + ## Revisions You can view the history of your flow code changes under the **Revisions** tab. For more details, see [Revisions](../05.concepts/03.revision.md). - + ## Dependencies @@ -98,7 +98,7 @@ You can view the history of your flow code changes under the **Revisions** tab. The **Dependencies** page shows the relationship dependencies between other flows and the selected flow. It gives you an easy way to navigate between them as well. - + :::alert{type="info"} The **Dependencies View** on the **Namespaces** page shows all the flows in the namespace and how they each relate to one another, if at all, whereas the Flow Dependencies view is only for the selected flow. diff --git a/content/docs/08.ui/02.executions.md b/src/content/docs/08.ui/02.executions.md similarity index 80% rename from content/docs/08.ui/02.executions.md rename to src/content/docs/08.ui/02.executions.md index d261ca251eb..fb8384452b2 100644 --- a/content/docs/08.ui/02.executions.md +++ b/src/content/docs/08.ui/02.executions.md @@ -9,11 +9,11 @@ On the **Executions** page, you see a list of all your completed flow executions You can select multiple checkboxes to choose executions for bulk actions, such as Restart, Kill, Pause, or Force Run. Alternatively, you can click an execution ID or the magnifying glass icon to open an execution for further examination. - + An **Execution** page displays the details of a flow execution, starting with an overview and options to focus on more specific aspects of an execution such as logs, outputs, and metrics. Beneath the tabs, you can see a status history of your execution with timestamps as it proceeds from `CREATED` to `RUNNING` to `SUCCESS` (or any other possible state). - + ## Filters @@ -25,31 +25,31 @@ From the main Executions page, you can filter the displayed executions on fields The **Gantt** tab visualizes each task's duration. From this interface, you can replay a specific task, see task source code, change task status, or look at task metrics and outputs. - + ## Logs The **Logs** tab gives access to a task's logs. You can filter by log level, copy logs into your clipboard, or download logs as a file. - + ## Topology Similar to the Editor view, you can see your execution's topology. **Topology** provides a graphical view to access specific task logs, replay certain tasks, or change task status. - + ## Outputs The **Outputs** tab presents the execution's generated outputs. All tasks and their corresponding outputs are accesible from this page for examination and debugging. - + The **Debug Expression** button allows you to evaluate [expressions](../expressions/index.md) on those task outputs. It's a great way to ensure your actual output aligns with your expected output, and if not, it provides a place to debug your flows. > Note: You have to select one task to be able to use the **Debug Expression** button. - + For example, you can use the **Debug Expression** feature to deep-dive into your tasks' outputs and play directly with expressions. @@ -57,7 +57,7 @@ For example, you can use the **Debug Expression** feature to deep-dive into your The Metrics tab shows every metric exposed by tasks after execution. For example, a [BigQuery load task](/plugins/plugin-gcp/bigquery/io.kestra.plugin.gcp.bigquery.load) might show the amount of files inputted, rows inserted, and how long the operation took to complete. - + ## Dependencies @@ -65,4 +65,4 @@ The Metrics tab shows every metric exposed by tasks after execution. For example The Dependencies tab shows the relationship dependencies between other flows and the selected execution. It also displays extra execution metadata such as state. - + diff --git a/content/docs/08.ui/03.logs.md b/src/content/docs/08.ui/03.logs.md similarity index 100% rename from content/docs/08.ui/03.logs.md rename to src/content/docs/08.ui/03.logs.md diff --git a/content/docs/08.ui/04.namespaces/ee.md b/src/content/docs/08.ui/04.namespaces/ee.md similarity index 82% rename from content/docs/08.ui/04.namespaces/ee.md rename to src/content/docs/08.ui/04.namespaces/ee.md index ad2d9b77a87..32abd1f7844 100644 --- a/content/docs/08.ui/04.namespaces/ee.md +++ b/src/content/docs/08.ui/04.namespaces/ee.md @@ -21,7 +21,7 @@ There's a number of extra namespace pages available in the enterprise edition: Manage the namespace description, [worker groups](../../06.enterprise/04.scalability/worker-group.md), and permissions. - + ## Variables @@ -29,13 +29,13 @@ Variables defined at the namespace level can be used in any flow defined under t Read more about [Variables](../../06.enterprise/02.governance/07.namespace-management.md#variables). - + ## Plugin defaults Plugin defaults can also be defined at the namespace level. These plugin defaults are then applied for all tasks of the corresponding type defined in the flows under the same namespace. - + Read more about [Plugin defaults](../../06.enterprise/02.governance/07.namespace-management.md#plugin-defaults). @@ -43,7 +43,7 @@ Read more about [Plugin defaults](../../06.enterprise/02.governance/07.namespace Configure Secrets directly from the UI. These secrets are available to all flows inside of the namespace. - + Read more about [Secrets](../../06.enterprise/02.governance/secrets.md). @@ -51,6 +51,6 @@ Read more about [Secrets](../../06.enterprise/02.governance/secrets.md). Audit Logs record all activities performed in your Kestra instance by users and service accounts. You can view all of the audit logs related to the selected namespace in this view. - + Read more about [Audit Logs](../../06.enterprise/02.governance/06.audit-logs.md). \ No newline at end of file diff --git a/content/docs/08.ui/04.namespaces/index.md b/src/content/docs/08.ui/04.namespaces/index.md similarity index 89% rename from content/docs/08.ui/04.namespaces/index.md rename to src/content/docs/08.ui/04.namespaces/index.md index 60ad322f103..b1b13cb548d 100644 --- a/content/docs/08.ui/04.namespaces/index.md +++ b/src/content/docs/08.ui/04.namespaces/index.md @@ -21,19 +21,19 @@ Below is an interactive demo through the Namespace UI from Kestra version 0.23: This is the default landing page of the Namespace. This page contains the dashboards and summary about the executions of different flows in this namespace. - + ## Editor The built-in editor is where you can add/edit namespace files. This access makes it easier to edit just your namespace files without needing to select a flow inside of the namespace. - + ## Flows The Flows tab shows all the flows in the namespace. It gives a summary about each of the flows including the flow ID, labels, last execution date and last execution status, and the execution statistics. By selecting the details button on the right of the flow, you can navigate to that flow's page. - + ## Dependencies @@ -41,13 +41,13 @@ The Dependencies tab shows all the flows and which ones are dependent on each ot This is similar to the Dependencies page in the Flow Editor, but this page shows you how all flows within a namespace relate even if some of them don't depend on any others. - + ## KV Store From the KV Store tab, manage the key-values pairs associated with a namespace. More details, check out the [KV Store concept guide](../../05.concepts/05.kv-store.md). - + diff --git a/content/docs/08.ui/05.blueprints.md b/src/content/docs/08.ui/05.blueprints.md similarity index 89% rename from content/docs/08.ui/05.blueprints.md rename to src/content/docs/08.ui/05.blueprints.md index 906a13956a2..d7122f26462 100644 --- a/content/docs/08.ui/05.blueprints.md +++ b/src/content/docs/08.ui/05.blueprints.md @@ -15,7 +15,7 @@ Blueprints are a curated, organized, and searchable catalog of ready-to-use exam All Blueprints are validated and documented. You can easily customize and integrate them into your new or existing flows with a single click on the **Use** button. - + ## Custom Blueprints @@ -28,6 +28,6 @@ You can also create custom blueprints shared within your organization. Custom blueprints require a [commercial license](/pricing). ::: - + Check the [Blueprints documentation](../05.concepts/07.blueprints.md) for more details. diff --git a/content/docs/08.ui/06.settings.md b/src/content/docs/08.ui/06.settings.md similarity index 97% rename from content/docs/08.ui/06.settings.md rename to src/content/docs/08.ui/06.settings.md index 63b07baccb0..1ac90f5ddd1 100644 --- a/content/docs/08.ui/06.settings.md +++ b/src/content/docs/08.ui/06.settings.md @@ -8,7 +8,7 @@ Configure Settings for Kestra. **Settings** are accessible from the bottom left environment menu. You are able to configure the Kestra UI. These configuration options are on a per-user basis. - + ## Main Configuration diff --git a/content/docs/08.ui/07.administration/00.triggers.md b/src/content/docs/08.ui/07.administration/00.triggers.md similarity index 91% rename from content/docs/08.ui/07.administration/00.triggers.md rename to src/content/docs/08.ui/07.administration/00.triggers.md index a634eb3abce..68e9516300c 100644 --- a/content/docs/08.ui/07.administration/00.triggers.md +++ b/src/content/docs/08.ui/07.administration/00.triggers.md @@ -7,7 +7,7 @@ Manage Triggers in Kestra. The **Triggers** page provides a concise overview of all schedule-based triggers and their status, allowing you to disable, re-enable, or unlock triggers. This page does not show triggers not handled by the [Kestra Scheduler](../../07.architecture/06.scheduler.md). These include [Flow Triggers](../../04.workflow-components/07.triggers/02.flow-trigger.md) and [Webhook Triggers](../../04.workflow-components/07.triggers/03.webhook-trigger.md); they are handled by the [Executor](../../07.architecture/04.executor.md) and [Webserver](../../07.architecture/08.webserver.md) respectively. They are viewable from a flow's **Triggers** tab. - + :::alert{type="warning"} The API-side state of a trigger takes precedence over the state defined in the flow code. The state shown on this page is the authoritative source of truth for any trigger. Thus, if a trigger is marked as `disabled: true` in the source code but the UI toggle is on, the trigger is considered active despite being disabled in the code. diff --git a/content/docs/08.ui/07.administration/01.workers.md b/src/content/docs/08.ui/07.administration/01.workers.md similarity index 74% rename from content/docs/08.ui/07.administration/01.workers.md rename to src/content/docs/08.ui/07.administration/01.workers.md index 5b96bf5afc0..a0b0a178ecb 100644 --- a/content/docs/08.ui/07.administration/01.workers.md +++ b/src/content/docs/08.ui/07.administration/01.workers.md @@ -7,4 +7,4 @@ Manage Workers in Kestra. On the **Instance** page, navigate to **Overview** tab. On this page, you can see the list of available [workers](../../07.architecture/05.worker.md) by filtering `Worker` from the **service_type** filter. - + diff --git a/content/docs/08.ui/07.administration/02.system-overview.md b/src/content/docs/08.ui/07.administration/02.system-overview.md similarity index 91% rename from content/docs/08.ui/07.administration/02.system-overview.md rename to src/content/docs/08.ui/07.administration/02.system-overview.md index 0bee4ba79b8..d4615a768e5 100644 --- a/content/docs/08.ui/07.administration/02.system-overview.md +++ b/src/content/docs/08.ui/07.administration/02.system-overview.md @@ -10,11 +10,11 @@ The **System Overview** page provides a dashboard of Kestra usage statistics, in The main goal of that section is to keep security in mind — you can either **consider upgrading** to the Enterprise Edition or **activate basic authentication** for a single user directly from the UI. Below is how this page looks like in the Open Source Edition: - + Additionally, below is how it looks like in the Enterprise Edition where you can view license and usage details and manage your Internal Storage and Secret Manager plugins: - + On the **System Overview** page, you manage the available **Secrets Manager** and **Internal Storage** plugins at the system level -- for example, which JAR file versions are installed and usable. However, you don’t configure actual connections (e.g., to an S3 bucket or AWS Secrets Manager) here. That configuration happens on the [Tenant/Namespace](../../06.enterprise/02.governance/tenants.md#dedicated-storage-and-secrets-backend-per-tenant) pages, where you define the specific connection details for your environment. Unlike the System Overview, these pages don’t control plugin versions; they only allow you to configure and use the storage or secrets plugins already made available at the system level. diff --git a/content/docs/08.ui/07.administration/03.users.md b/src/content/docs/08.ui/07.administration/03.users.md similarity index 79% rename from content/docs/08.ui/07.administration/03.users.md rename to src/content/docs/08.ui/07.administration/03.users.md index 9861dfcba5f..7bc47ac97d3 100644 --- a/content/docs/08.ui/07.administration/03.users.md +++ b/src/content/docs/08.ui/07.administration/03.users.md @@ -14,10 +14,10 @@ On the **Users** page, you see the list of users. By clicking on a user id or on the magnifying glass icon, you can open the page of a user. - + The **Create** button allows creating a new user and managing that user's access to Kestra. - + Users can be attached to Groups and/or Namespaces. diff --git a/content/docs/08.ui/07.administration/04.service-accounts.md b/src/content/docs/08.ui/07.administration/04.service-accounts.md similarity index 81% rename from content/docs/08.ui/07.administration/04.service-accounts.md rename to src/content/docs/08.ui/07.administration/04.service-accounts.md index 40a4b3b56eb..f0a37e63e32 100644 --- a/content/docs/08.ui/07.administration/04.service-accounts.md +++ b/src/content/docs/08.ui/07.administration/04.service-accounts.md @@ -12,23 +12,23 @@ This feature requires a [commercial license](/pricing). To create a new service account, go to the Service Accounts page under the Administration section and click on the **Create** button. Fill in the form with the required information including the name and description and click **Save**: - + Once you have created a service account, you can add a Role that will grant the service account permissions to specific resources. To do this, click on the **Access** tab followed by clicking the **Add** button on the top right corner and selecting the role you want to assign to the service account. - + Finally, you can generate an API token for the service account by clicking on the **API Tokens** tab followed by the **Create** button on the top right corner. This generates a token that you can use to authenticate the service account with Kestra from external applications such as CI/CD pipelines (e.g., in Terraform provider configuration or GitHub Actions secrets). - + Note how you can configure the token to expire after a certain period of time or to never expire. Also, there is a toggle called `Extended` that automatically prolongs the token's expiration date by the specified number of days (`Max Age`) if the token is actively used. That toggle is disabled by default. Once you confirm the API token creation via the **Generate** button, the token is generated and displayed in the UI. Make sure to copy the token and store it in a secure location as it will not be displayed again. - + :::alert{type="info"} Note that you can create an **API token** also as a regular **User**. While Service Accounts are generally recommended for programmatic API access to Kestra from CI/CD or other external applications, often it's useful to create an API token for a regular user, so that programmatic actions performed by that user can be tracked and audited. - + ::: \ No newline at end of file diff --git a/content/docs/08.ui/07.administration/05.groups.md b/src/content/docs/08.ui/07.administration/05.groups.md similarity index 82% rename from content/docs/08.ui/07.administration/05.groups.md rename to src/content/docs/08.ui/07.administration/05.groups.md index 70ffca3fcee..4b9f373888b 100644 --- a/content/docs/08.ui/07.administration/05.groups.md +++ b/src/content/docs/08.ui/07.administration/05.groups.md @@ -14,11 +14,11 @@ On the **Groups** page, you see the list of groups. By clicking on a group id or on the magnifying glass icon, you can open the page of a group. - + The **Create** button allows creating a new group and managing its access to Kestra. - + It's a collection of users who require the same set of permissions. It's useful to assign the same permissions to multiple users who belong to the same team or project. diff --git a/content/docs/08.ui/07.administration/06.roles.md b/src/content/docs/08.ui/07.administration/06.roles.md similarity index 73% rename from content/docs/08.ui/07.administration/06.roles.md rename to src/content/docs/08.ui/07.administration/06.roles.md index a194a3979a6..23a2269f9c8 100644 --- a/content/docs/08.ui/07.administration/06.roles.md +++ b/src/content/docs/08.ui/07.administration/06.roles.md @@ -14,15 +14,15 @@ On the **Roles** page, you see the list of roles. By clicking on a role id or on the magnifying glass icon, you can open the page of a role. - + The **Create** button allows creating a new role. - + Roles manage CRUD (CREATE, READ, UPDATE, DELETE) access to Kestra resources such as flows, executions, or secrets. They can be attached to groups or users. - + diff --git a/content/docs/08.ui/07.administration/07.audit-logs.md b/src/content/docs/08.ui/07.administration/07.audit-logs.md similarity index 89% rename from content/docs/08.ui/07.administration/07.audit-logs.md rename to src/content/docs/08.ui/07.administration/07.audit-logs.md index 2915ba7471d..418f56cb4bc 100644 --- a/content/docs/08.ui/07.administration/07.audit-logs.md +++ b/src/content/docs/08.ui/07.administration/07.audit-logs.md @@ -16,5 +16,5 @@ On the **Audit Logs** page, you have access to all Kestra audit logs. By reviewing audit logs, system administrators can track user activity, and security teams can investigate breaches and ensure compliance with regulatory requirements. - + diff --git a/content/docs/08.ui/07.administration/08.tenants.md b/src/content/docs/08.ui/07.administration/08.tenants.md similarity index 65% rename from content/docs/08.ui/07.administration/08.tenants.md rename to src/content/docs/08.ui/07.administration/08.tenants.md index 03132511ecb..7635249e5d3 100644 --- a/content/docs/08.ui/07.administration/08.tenants.md +++ b/src/content/docs/08.ui/07.administration/08.tenants.md @@ -14,13 +14,13 @@ A tenant represents an isolated environment within a single Kestra instance. Read more about [Tenants](../../06.enterprise/02.governance/tenants.md). - + ## Create When you create a tenant, you can give it an ID, name, and Worker Group. Other properties can be configured afterwards. - + ## Edit @@ -36,11 +36,11 @@ When you select a Tenant, there are a number of pages: Below is an image of the view where you can edit the same - + ### Users - + You can create and edit users inside of your tenant. Once a user has been created, you can also: - Select the type of authentication they can use (e.g., SSO) @@ -59,60 +59,60 @@ When you create a user, you can give them: Once you've saved them, you can access the other tabs. - + #### Authentication Under **Authentication**, you can set the users password, or authentication type. For example, if you have [Single Sign-On (SSO)](../../06.enterprise/03.auth/sso/index.md) configured, you can select that as the authentication method. - + #### API Token You can also generate [API Tokens](../../06.enterprise/03.auth/api-tokens.md) for users for authenticating with the [Kestra API](../../api-reference/enterprise.md). - + When you create an API Token, you can give it a name, description, as well as an age. - + You are only be able to copy the API Token at the time of creation. - + ### Service Accounts Similar to Users, you can create [Service Accounts](../../06.enterprise/03.auth/service-accounts.md). The difference is you can't select an Authentication Method - instead you must use an API Token. - + ### Groups You can create [groups](../../06.enterprise/03.auth/rbac.md#groups) to make it easier to assign multiple users specific access at the same time. - + When you create a group, you can give it a name and a description. - + Once created, you can assign users to groups. - + ### Access This is where you can assign users to your roles. - + ### Roles You can also create new roles in your tenant and adjust the permissions existing roles have. - + When you create a new role, you can select the appropriate permissions and which level they should be. More information on RBAC, check out the [permissions](../../06.enterprise/03.auth/rbac.md#permissions) documentation. - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/08.ui/07.administration/index.md b/src/content/docs/08.ui/07.administration/index.md similarity index 100% rename from content/docs/08.ui/07.administration/index.md rename to src/content/docs/08.ui/07.administration/index.md diff --git a/content/docs/08.ui/08.task-runs.md b/src/content/docs/08.ui/08.task-runs.md similarity index 85% rename from content/docs/08.ui/08.task-runs.md rename to src/content/docs/08.ui/08.task-runs.md index 0262f5a5bcc..47bdb1824a8 100644 --- a/content/docs/08.ui/08.task-runs.md +++ b/src/content/docs/08.ui/08.task-runs.md @@ -14,4 +14,4 @@ On the **Task Runs** page, you see the list of task runs and some charts. This page only exists when using the Elasticsearch repository, as it requires a full-text search engine. - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/08.ui/09.bookmarks.md b/src/content/docs/08.ui/09.bookmarks.md similarity index 87% rename from content/docs/08.ui/09.bookmarks.md rename to src/content/docs/08.ui/09.bookmarks.md index 65c91e67bc4..279303d0811 100644 --- a/content/docs/08.ui/09.bookmarks.md +++ b/src/content/docs/08.ui/09.bookmarks.md @@ -10,4 +10,4 @@ The bookmark feature allows you to star any page, instantly adding it to the Sta You can easily customize your bookmarks by renaming or removing them directly from the left panel, ensuring a personalized and simple browsing experience. - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/08.ui/10.playground.md b/src/content/docs/08.ui/10.playground.md similarity index 100% rename from content/docs/08.ui/10.playground.md rename to src/content/docs/08.ui/10.playground.md diff --git a/content/docs/08.ui/index.md b/src/content/docs/08.ui/index.md similarity index 96% rename from content/docs/08.ui/index.md rename to src/content/docs/08.ui/index.md index 4e6f6e7e7e1..8dca666cb8f 100644 --- a/content/docs/08.ui/index.md +++ b/src/content/docs/08.ui/index.md @@ -7,7 +7,7 @@ Kestra comes with a rich web user interface located by default on port 8080. When you first navigate to the Kestra UI, you will see the **Welcome** page. - + On this page, click on **Create my first flow** to open the Kestra __Guided Tour__, which will guide you through creating and executing your first flow step by step. diff --git a/content/docs/09.administrator-guide/00.requirements.md b/src/content/docs/09.administrator-guide/00.requirements.md similarity index 100% rename from content/docs/09.administrator-guide/00.requirements.md rename to src/content/docs/09.administrator-guide/00.requirements.md diff --git a/content/docs/09.administrator-guide/03.monitoring.md b/src/content/docs/09.administrator-guide/03.monitoring.md similarity index 99% rename from content/docs/09.administrator-guide/03.monitoring.md rename to src/content/docs/09.administrator-guide/03.monitoring.md index 165b8007301..c72b20c876b 100644 --- a/content/docs/09.administrator-guide/03.monitoring.md +++ b/src/content/docs/09.administrator-guide/03.monitoring.md @@ -61,7 +61,7 @@ triggers: Adding this single flow will ensure that you receive a Slack alert on any flow failure in the `company.analytics` namespace. Here is an example alert notification: - + :::alert{type="warning"} Note that if you want this alert to be sent on failure across multiple namespaces, you will need to add an ``OrCondition`` to the ``conditions`` list. See the example below: @@ -270,7 +270,7 @@ Kestra uses Elasticsearch to store all executions and metrics. Therefore, you ca We'd love to see what dashboards you will build. Feel free to share a screenshot or a template of your dashboard with [the community](/slack). Meanwhile, here is an example of a Grafana dashboard that we use internally to monitor Kestra - feel free to use it as a starting point for your own dashboard: - + :::collapse{title="Grafana Dashboard JSON"} ```json diff --git a/content/docs/09.administrator-guide/16.troubleshooting.md b/src/content/docs/09.administrator-guide/16.troubleshooting.md similarity index 100% rename from content/docs/09.administrator-guide/16.troubleshooting.md rename to src/content/docs/09.administrator-guide/16.troubleshooting.md diff --git a/content/docs/09.administrator-guide/backup-and-restore.md b/src/content/docs/09.administrator-guide/backup-and-restore.md similarity index 100% rename from content/docs/09.administrator-guide/backup-and-restore.md rename to src/content/docs/09.administrator-guide/backup-and-restore.md diff --git a/content/docs/09.administrator-guide/basic-auth-troubleshooting.md b/src/content/docs/09.administrator-guide/basic-auth-troubleshooting.md similarity index 100% rename from content/docs/09.administrator-guide/basic-auth-troubleshooting.md rename to src/content/docs/09.administrator-guide/basic-auth-troubleshooting.md diff --git a/content/docs/09.administrator-guide/dind-behind-proxy.md b/src/content/docs/09.administrator-guide/dind-behind-proxy.md similarity index 100% rename from content/docs/09.administrator-guide/dind-behind-proxy.md rename to src/content/docs/09.administrator-guide/dind-behind-proxy.md diff --git a/content/docs/09.administrator-guide/high-availability.md b/src/content/docs/09.administrator-guide/high-availability.md similarity index 100% rename from content/docs/09.administrator-guide/high-availability.md rename to src/content/docs/09.administrator-guide/high-availability.md diff --git a/content/docs/09.administrator-guide/index.md b/src/content/docs/09.administrator-guide/index.md similarity index 100% rename from content/docs/09.administrator-guide/index.md rename to src/content/docs/09.administrator-guide/index.md diff --git a/content/docs/09.administrator-guide/mitm-proxy-configuration.md b/src/content/docs/09.administrator-guide/mitm-proxy-configuration.md similarity index 100% rename from content/docs/09.administrator-guide/mitm-proxy-configuration.md rename to src/content/docs/09.administrator-guide/mitm-proxy-configuration.md diff --git a/content/docs/09.administrator-guide/open-telemetry.md b/src/content/docs/09.administrator-guide/open-telemetry.md similarity index 98% rename from content/docs/09.administrator-guide/open-telemetry.md rename to src/content/docs/09.administrator-guide/open-telemetry.md index 2b4e3902a35..c18c7914556 100644 --- a/content/docs/09.administrator-guide/open-telemetry.md +++ b/src/content/docs/09.administrator-guide/open-telemetry.md @@ -84,7 +84,7 @@ The following screenshot shows three correlated traces: - One created from an execution of a flow named `opentelemetry_parent` which has spans for tasks including a `Subflow` - One created from the `opentelemetry_basic` flow execution - + ### Disabling traces diff --git a/content/docs/09.administrator-guide/prometheus-metrics.md b/src/content/docs/09.administrator-guide/prometheus-metrics.md similarity index 100% rename from content/docs/09.administrator-guide/prometheus-metrics.md rename to src/content/docs/09.administrator-guide/prometheus-metrics.md diff --git a/content/docs/09.administrator-guide/purge.md b/src/content/docs/09.administrator-guide/purge.md similarity index 100% rename from content/docs/09.administrator-guide/purge.md rename to src/content/docs/09.administrator-guide/purge.md diff --git a/content/docs/09.administrator-guide/security-hardening.md b/src/content/docs/09.administrator-guide/security-hardening.md similarity index 100% rename from content/docs/09.administrator-guide/security-hardening.md rename to src/content/docs/09.administrator-guide/security-hardening.md diff --git a/content/docs/09.administrator-guide/ssl-configuration.md b/src/content/docs/09.administrator-guide/ssl-configuration.md similarity index 100% rename from content/docs/09.administrator-guide/ssl-configuration.md rename to src/content/docs/09.administrator-guide/ssl-configuration.md diff --git a/content/docs/09.administrator-guide/upgrades.md b/src/content/docs/09.administrator-guide/upgrades.md similarity index 98% rename from content/docs/09.administrator-guide/upgrades.md rename to src/content/docs/09.administrator-guide/upgrades.md index bd56340a468..db6fb75101c 100644 --- a/content/docs/09.administrator-guide/upgrades.md +++ b/src/content/docs/09.administrator-guide/upgrades.md @@ -74,7 +74,7 @@ You can also create a custom image with your own plugins and dependencies, as ex If you use a manual standalone installation with Java, you can download the Kestra binary for a specific version from the Assets menu of a specific [Release](https://github.com/kestra-io/kestra/releases) page. The image below shows how you can download the binary for the 0.14.1 release. - + Once you’ve downloaded the binary, start Kestra with the following command: @@ -135,7 +135,7 @@ You can get notified about new releases in the following ways: 4. Subscribe to the [Kestra newsletter](/blogs) 5. Subscribe to Release notifications on the [main GitHub repository](https://github.com/kestra-io/kestra), as shown in the image below: - + ## Database Migrations diff --git a/content/docs/09.administrator-guide/usage.md b/src/content/docs/09.administrator-guide/usage.md similarity index 100% rename from content/docs/09.administrator-guide/usage.md rename to src/content/docs/09.administrator-guide/usage.md diff --git a/content/docs/09.administrator-guide/webserver-url.md b/src/content/docs/09.administrator-guide/webserver-url.md similarity index 100% rename from content/docs/09.administrator-guide/webserver-url.md rename to src/content/docs/09.administrator-guide/webserver-url.md diff --git a/content/docs/11.migration-guide/0.11.0/core-script-tasks.md b/src/content/docs/11.migration-guide/0.11.0/core-script-tasks.md similarity index 100% rename from content/docs/11.migration-guide/0.11.0/core-script-tasks.md rename to src/content/docs/11.migration-guide/0.11.0/core-script-tasks.md diff --git a/content/docs/11.migration-guide/0.11.0/index.md b/src/content/docs/11.migration-guide/0.11.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.11.0/index.md rename to src/content/docs/11.migration-guide/0.11.0/index.md diff --git a/content/docs/11.migration-guide/0.11.0/templates.md b/src/content/docs/11.migration-guide/0.11.0/templates.md similarity index 96% rename from content/docs/11.migration-guide/0.11.0/templates.md rename to src/content/docs/11.migration-guide/0.11.0/templates.md index 13c4854c09f..15fd1b23415 100644 --- a/content/docs/11.migration-guide/0.11.0/templates.md +++ b/src/content/docs/11.migration-guide/0.11.0/templates.md @@ -163,7 +163,7 @@ tasks: You can look at both a flow with a template task and a flow with a subflow task side by side to see the difference in syntax: - + If you still have questions about migrating from templates to subflows, reach out via our [Community Slack](/slack). @@ -236,8 +236,8 @@ From the template, you can access all execution context variables. However, this If enabled, you can inspect Templates on the **Templates** page. - + A **Template** page allows to edit the template via a YAML editor. - + diff --git a/content/docs/11.migration-guide/0.12.0/index.md b/src/content/docs/11.migration-guide/0.12.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.12.0/index.md rename to src/content/docs/11.migration-guide/0.12.0/index.md diff --git a/content/docs/11.migration-guide/0.12.0/listeners.md b/src/content/docs/11.migration-guide/0.12.0/listeners.md similarity index 98% rename from content/docs/11.migration-guide/0.12.0/listeners.md rename to src/content/docs/11.migration-guide/0.12.0/listeners.md index 18ef13f68f0..438caefebbf 100644 --- a/content/docs/11.migration-guide/0.12.0/listeners.md +++ b/src/content/docs/11.migration-guide/0.12.0/listeners.md @@ -132,7 +132,7 @@ Anytime you execute that `demo` flow, the Slack notification will be sent, thank You can look at both a flow with a listener and a flow with a Flow trigger side by side to see the syntax difference: - + If you still have questions about migrating from listeners to flow triggers, reach out via our [Community Slack](/slack). diff --git a/content/docs/11.migration-guide/0.13.0/default-tenant.md b/src/content/docs/11.migration-guide/0.13.0/default-tenant.md similarity index 100% rename from content/docs/11.migration-guide/0.13.0/default-tenant.md rename to src/content/docs/11.migration-guide/0.13.0/default-tenant.md diff --git a/content/docs/11.migration-guide/0.13.0/index.md b/src/content/docs/11.migration-guide/0.13.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.13.0/index.md rename to src/content/docs/11.migration-guide/0.13.0/index.md diff --git a/content/docs/11.migration-guide/0.14.0/group-list.md b/src/content/docs/11.migration-guide/0.14.0/group-list.md similarity index 100% rename from content/docs/11.migration-guide/0.14.0/group-list.md rename to src/content/docs/11.migration-guide/0.14.0/group-list.md diff --git a/content/docs/11.migration-guide/0.14.0/index.md b/src/content/docs/11.migration-guide/0.14.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.14.0/index.md rename to src/content/docs/11.migration-guide/0.14.0/index.md diff --git a/content/docs/11.migration-guide/0.14.0/recursive-rendering.md b/src/content/docs/11.migration-guide/0.14.0/recursive-rendering.md similarity index 100% rename from content/docs/11.migration-guide/0.14.0/recursive-rendering.md rename to src/content/docs/11.migration-guide/0.14.0/recursive-rendering.md diff --git a/content/docs/11.migration-guide/0.15.0/index.md b/src/content/docs/11.migration-guide/0.15.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.15.0/index.md rename to src/content/docs/11.migration-guide/0.15.0/index.md diff --git a/content/docs/11.migration-guide/0.15.0/inputs-name.md b/src/content/docs/11.migration-guide/0.15.0/inputs-name.md similarity index 100% rename from content/docs/11.migration-guide/0.15.0/inputs-name.md rename to src/content/docs/11.migration-guide/0.15.0/inputs-name.md diff --git a/content/docs/11.migration-guide/0.15.0/micronaut4.md b/src/content/docs/11.migration-guide/0.15.0/micronaut4.md similarity index 100% rename from content/docs/11.migration-guide/0.15.0/micronaut4.md rename to src/content/docs/11.migration-guide/0.15.0/micronaut4.md diff --git a/content/docs/11.migration-guide/0.15.0/schedule-conditions.md b/src/content/docs/11.migration-guide/0.15.0/schedule-conditions.md similarity index 100% rename from content/docs/11.migration-guide/0.15.0/schedule-conditions.md rename to src/content/docs/11.migration-guide/0.15.0/schedule-conditions.md diff --git a/content/docs/11.migration-guide/0.15.0/subflow-outputs.md b/src/content/docs/11.migration-guide/0.15.0/subflow-outputs.md similarity index 97% rename from content/docs/11.migration-guide/0.15.0/subflow-outputs.md rename to src/content/docs/11.migration-guide/0.15.0/subflow-outputs.md index 65e73108a1d..d90ae8ff355 100644 --- a/content/docs/11.migration-guide/0.15.0/subflow-outputs.md +++ b/src/content/docs/11.migration-guide/0.15.0/subflow-outputs.md @@ -101,7 +101,7 @@ You can see that outputs are defined as a list of key-value pairs. The `id` is t You will see the output of the flow on the **Executions** page in the **Overview** tab. - + Here is how you can access the flow output in the parent flow: @@ -131,5 +131,5 @@ Note how the `outputs` are set twice within the `"{{outputs.subflow.outputs.fina Here is what you will see in the Outputs tab of the **Executions** page in the parent flow: - + diff --git a/content/docs/11.migration-guide/0.17.0/index.md b/src/content/docs/11.migration-guide/0.17.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.17.0/index.md rename to src/content/docs/11.migration-guide/0.17.0/index.md diff --git a/content/docs/11.migration-guide/0.17.0/json-objects-serialization.md b/src/content/docs/11.migration-guide/0.17.0/json-objects-serialization.md similarity index 100% rename from content/docs/11.migration-guide/0.17.0/json-objects-serialization.md rename to src/content/docs/11.migration-guide/0.17.0/json-objects-serialization.md diff --git a/content/docs/11.migration-guide/0.17.0/local-files.md b/src/content/docs/11.migration-guide/0.17.0/local-files.md similarity index 100% rename from content/docs/11.migration-guide/0.17.0/local-files.md rename to src/content/docs/11.migration-guide/0.17.0/local-files.md diff --git a/content/docs/11.migration-guide/0.17.0/plugin-discovery-mechanism.md b/src/content/docs/11.migration-guide/0.17.0/plugin-discovery-mechanism.md similarity index 100% rename from content/docs/11.migration-guide/0.17.0/plugin-discovery-mechanism.md rename to src/content/docs/11.migration-guide/0.17.0/plugin-discovery-mechanism.md diff --git a/content/docs/11.migration-guide/0.17.0/renamed-plugins.md b/src/content/docs/11.migration-guide/0.17.0/renamed-plugins.md similarity index 99% rename from content/docs/11.migration-guide/0.17.0/renamed-plugins.md rename to src/content/docs/11.migration-guide/0.17.0/renamed-plugins.md index 312908428cb..9fffbd661fb 100644 --- a/content/docs/11.migration-guide/0.17.0/renamed-plugins.md +++ b/src/content/docs/11.migration-guide/0.17.0/renamed-plugins.md @@ -15,7 +15,7 @@ We've also renamed `taskDefaults` to `pluginDefaults` to highlight that you can All of these are non-breaking changes as we leverage **aliases** for backward compatibility. You will see a friendly warning in the UI code editor if you use the old names. - + It's worth taking a couple of minutes to rename those in your flows to future-proof your code. diff --git a/content/docs/11.migration-guide/0.17.0/volume-mount.md b/src/content/docs/11.migration-guide/0.17.0/volume-mount.md similarity index 100% rename from content/docs/11.migration-guide/0.17.0/volume-mount.md rename to src/content/docs/11.migration-guide/0.17.0/volume-mount.md diff --git a/content/docs/11.migration-guide/0.18.0/index.md b/src/content/docs/11.migration-guide/0.18.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.18.0/index.md rename to src/content/docs/11.migration-guide/0.18.0/index.md diff --git a/content/docs/11.migration-guide/0.18.0/runners.md b/src/content/docs/11.migration-guide/0.18.0/runners.md similarity index 100% rename from content/docs/11.migration-guide/0.18.0/runners.md rename to src/content/docs/11.migration-guide/0.18.0/runners.md diff --git a/content/docs/11.migration-guide/0.18.0/tf-task-defaults.md b/src/content/docs/11.migration-guide/0.18.0/tf-task-defaults.md similarity index 100% rename from content/docs/11.migration-guide/0.18.0/tf-task-defaults.md rename to src/content/docs/11.migration-guide/0.18.0/tf-task-defaults.md diff --git a/content/docs/11.migration-guide/0.19.0/index.md b/src/content/docs/11.migration-guide/0.19.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.19.0/index.md rename to src/content/docs/11.migration-guide/0.19.0/index.md diff --git a/content/docs/11.migration-guide/0.19.0/state-store.md b/src/content/docs/11.migration-guide/0.19.0/state-store.md similarity index 100% rename from content/docs/11.migration-guide/0.19.0/state-store.md rename to src/content/docs/11.migration-guide/0.19.0/state-store.md diff --git a/content/docs/11.migration-guide/0.20.0/cluster-monitoring.md b/src/content/docs/11.migration-guide/0.20.0/cluster-monitoring.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/cluster-monitoring.md rename to src/content/docs/11.migration-guide/0.20.0/cluster-monitoring.md diff --git a/content/docs/11.migration-guide/0.20.0/conditions-renamed.md b/src/content/docs/11.migration-guide/0.20.0/conditions-renamed.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/conditions-renamed.md rename to src/content/docs/11.migration-guide/0.20.0/conditions-renamed.md diff --git a/content/docs/11.migration-guide/0.20.0/custom-plugins.md b/src/content/docs/11.migration-guide/0.20.0/custom-plugins.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/custom-plugins.md rename to src/content/docs/11.migration-guide/0.20.0/custom-plugins.md diff --git a/content/docs/11.migration-guide/0.20.0/elasticsearch-indexer.md b/src/content/docs/11.migration-guide/0.20.0/elasticsearch-indexer.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/elasticsearch-indexer.md rename to src/content/docs/11.migration-guide/0.20.0/elasticsearch-indexer.md diff --git a/content/docs/11.migration-guide/0.20.0/index.md b/src/content/docs/11.migration-guide/0.20.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/index.md rename to src/content/docs/11.migration-guide/0.20.0/index.md diff --git a/content/docs/11.migration-guide/0.20.0/kv-function.md b/src/content/docs/11.migration-guide/0.20.0/kv-function.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/kv-function.md rename to src/content/docs/11.migration-guide/0.20.0/kv-function.md diff --git a/content/docs/11.migration-guide/0.20.0/restore-kafka-queue.md b/src/content/docs/11.migration-guide/0.20.0/restore-kafka-queue.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/restore-kafka-queue.md rename to src/content/docs/11.migration-guide/0.20.0/restore-kafka-queue.md diff --git a/content/docs/11.migration-guide/0.20.0/server-configuration.md b/src/content/docs/11.migration-guide/0.20.0/server-configuration.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/server-configuration.md rename to src/content/docs/11.migration-guide/0.20.0/server-configuration.md diff --git a/content/docs/11.migration-guide/0.20.0/username-replaced-by-email.md b/src/content/docs/11.migration-guide/0.20.0/username-replaced-by-email.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/username-replaced-by-email.md rename to src/content/docs/11.migration-guide/0.20.0/username-replaced-by-email.md diff --git a/content/docs/11.migration-guide/0.20.0/worker-group-fallback.md b/src/content/docs/11.migration-guide/0.20.0/worker-group-fallback.md similarity index 100% rename from content/docs/11.migration-guide/0.20.0/worker-group-fallback.md rename to src/content/docs/11.migration-guide/0.20.0/worker-group-fallback.md diff --git a/content/docs/11.migration-guide/0.21.0/default-git-branch.md b/src/content/docs/11.migration-guide/0.21.0/default-git-branch.md similarity index 100% rename from content/docs/11.migration-guide/0.21.0/default-git-branch.md rename to src/content/docs/11.migration-guide/0.21.0/default-git-branch.md diff --git a/content/docs/11.migration-guide/0.21.0/index.md b/src/content/docs/11.migration-guide/0.21.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.21.0/index.md rename to src/content/docs/11.migration-guide/0.21.0/index.md diff --git a/content/docs/11.migration-guide/0.21.0/restarting-parent-flow.md b/src/content/docs/11.migration-guide/0.21.0/restarting-parent-flow.md similarity index 100% rename from content/docs/11.migration-guide/0.21.0/restarting-parent-flow.md rename to src/content/docs/11.migration-guide/0.21.0/restarting-parent-flow.md diff --git a/content/docs/11.migration-guide/0.21.0/secret-function.md b/src/content/docs/11.migration-guide/0.21.0/secret-function.md similarity index 100% rename from content/docs/11.migration-guide/0.21.0/secret-function.md rename to src/content/docs/11.migration-guide/0.21.0/secret-function.md diff --git a/content/docs/11.migration-guide/0.21.0/stderr-log-level.md b/src/content/docs/11.migration-guide/0.21.0/stderr-log-level.md similarity index 88% rename from content/docs/11.migration-guide/0.21.0/stderr-log-level.md rename to src/content/docs/11.migration-guide/0.21.0/stderr-log-level.md index 6e03d5a0a54..7eabe2c673d 100644 --- a/content/docs/11.migration-guide/0.21.0/stderr-log-level.md +++ b/src/content/docs/11.migration-guide/0.21.0/stderr-log-level.md @@ -37,10 +37,10 @@ errors: Here is the output of the `fail` task before the change: - + ## After 0.21.0 Here is the output of the `fail` task after the change: - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/11.migration-guide/0.21.0/token-permissions.md b/src/content/docs/11.migration-guide/0.21.0/token-permissions.md similarity index 100% rename from content/docs/11.migration-guide/0.21.0/token-permissions.md rename to src/content/docs/11.migration-guide/0.21.0/token-permissions.md diff --git a/content/docs/11.migration-guide/0.22.0/azure-log-exporter.md b/src/content/docs/11.migration-guide/0.22.0/azure-log-exporter.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/azure-log-exporter.md rename to src/content/docs/11.migration-guide/0.22.0/azure-log-exporter.md diff --git a/content/docs/11.migration-guide/0.22.0/default-tenant.md b/src/content/docs/11.migration-guide/0.22.0/default-tenant.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/default-tenant.md rename to src/content/docs/11.migration-guide/0.22.0/default-tenant.md diff --git a/content/docs/11.migration-guide/0.22.0/ee-api-changes.md b/src/content/docs/11.migration-guide/0.22.0/ee-api-changes.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/ee-api-changes.md rename to src/content/docs/11.migration-guide/0.22.0/ee-api-changes.md diff --git a/content/docs/11.migration-guide/0.22.0/failed-attempts-lockout.md b/src/content/docs/11.migration-guide/0.22.0/failed-attempts-lockout.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/failed-attempts-lockout.md rename to src/content/docs/11.migration-guide/0.22.0/failed-attempts-lockout.md diff --git a/content/docs/11.migration-guide/0.22.0/healthcheck-paths.md b/src/content/docs/11.migration-guide/0.22.0/healthcheck-paths.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/healthcheck-paths.md rename to src/content/docs/11.migration-guide/0.22.0/healthcheck-paths.md diff --git a/content/docs/11.migration-guide/0.22.0/index.md b/src/content/docs/11.migration-guide/0.22.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/index.md rename to src/content/docs/11.migration-guide/0.22.0/index.md diff --git a/content/docs/11.migration-guide/0.22.0/kv-error-on-missing.md b/src/content/docs/11.migration-guide/0.22.0/kv-error-on-missing.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/kv-error-on-missing.md rename to src/content/docs/11.migration-guide/0.22.0/kv-error-on-missing.md diff --git a/content/docs/11.migration-guide/0.22.0/renamed-version-property.md b/src/content/docs/11.migration-guide/0.22.0/renamed-version-property.md similarity index 100% rename from content/docs/11.migration-guide/0.22.0/renamed-version-property.md rename to src/content/docs/11.migration-guide/0.22.0/renamed-version-property.md diff --git a/content/docs/11.migration-guide/0.23.0/boolean-input-change.md b/src/content/docs/11.migration-guide/0.23.0/boolean-input-change.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/boolean-input-change.md rename to src/content/docs/11.migration-guide/0.23.0/boolean-input-change.md diff --git a/content/docs/11.migration-guide/0.23.0/default-env-prefix.md b/src/content/docs/11.migration-guide/0.23.0/default-env-prefix.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/default-env-prefix.md rename to src/content/docs/11.migration-guide/0.23.0/default-env-prefix.md diff --git a/content/docs/11.migration-guide/0.23.0/default-pull-policy.md b/src/content/docs/11.migration-guide/0.23.0/default-pull-policy.md similarity index 91% rename from content/docs/11.migration-guide/0.23.0/default-pull-policy.md rename to src/content/docs/11.migration-guide/0.23.0/default-pull-policy.md index aab89d2e398..a1e3fc97c0f 100644 --- a/content/docs/11.migration-guide/0.23.0/default-pull-policy.md +++ b/src/content/docs/11.migration-guide/0.23.0/default-pull-policy.md @@ -29,4 +29,4 @@ tasks: Now, the plugin defaults to `IF_NOT_PRESENT`. This also applies to all other Docker-based tasks from the `plugin-docker` group, such as `io.kestra.plugin.docker.Run`. - + diff --git a/content/docs/11.migration-guide/0.23.0/flow-trigger-paused-state.md b/src/content/docs/11.migration-guide/0.23.0/flow-trigger-paused-state.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/flow-trigger-paused-state.md rename to src/content/docs/11.migration-guide/0.23.0/flow-trigger-paused-state.md diff --git a/content/docs/11.migration-guide/0.23.0/index.md b/src/content/docs/11.migration-guide/0.23.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/index.md rename to src/content/docs/11.migration-guide/0.23.0/index.md diff --git a/content/docs/11.migration-guide/0.23.0/internal-storage-migration.md b/src/content/docs/11.migration-guide/0.23.0/internal-storage-migration.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/internal-storage-migration.md rename to src/content/docs/11.migration-guide/0.23.0/internal-storage-migration.md diff --git a/content/docs/11.migration-guide/0.23.0/jdbc-autocommit.md b/src/content/docs/11.migration-guide/0.23.0/jdbc-autocommit.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/jdbc-autocommit.md rename to src/content/docs/11.migration-guide/0.23.0/jdbc-autocommit.md diff --git a/content/docs/11.migration-guide/0.23.0/loop-until-defaults.md b/src/content/docs/11.migration-guide/0.23.0/loop-until-defaults.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/loop-until-defaults.md rename to src/content/docs/11.migration-guide/0.23.0/loop-until-defaults.md diff --git a/content/docs/11.migration-guide/0.23.0/python-script-image.md b/src/content/docs/11.migration-guide/0.23.0/python-script-image.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/python-script-image.md rename to src/content/docs/11.migration-guide/0.23.0/python-script-image.md diff --git a/content/docs/11.migration-guide/0.23.0/script-warnings.md b/src/content/docs/11.migration-guide/0.23.0/script-warnings.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/script-warnings.md rename to src/content/docs/11.migration-guide/0.23.0/script-warnings.md diff --git a/content/docs/11.migration-guide/0.23.0/sql-server-backend.md b/src/content/docs/11.migration-guide/0.23.0/sql-server-backend.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/sql-server-backend.md rename to src/content/docs/11.migration-guide/0.23.0/sql-server-backend.md diff --git a/content/docs/11.migration-guide/0.23.0/superadmin-refresh.md b/src/content/docs/11.migration-guide/0.23.0/superadmin-refresh.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/superadmin-refresh.md rename to src/content/docs/11.migration-guide/0.23.0/superadmin-refresh.md diff --git a/content/docs/11.migration-guide/0.23.0/tenant-migration-ee.md b/src/content/docs/11.migration-guide/0.23.0/tenant-migration-ee.md similarity index 99% rename from content/docs/11.migration-guide/0.23.0/tenant-migration-ee.md rename to src/content/docs/11.migration-guide/0.23.0/tenant-migration-ee.md index c850cd265c0..01766187de2 100644 --- a/content/docs/11.migration-guide/0.23.0/tenant-migration-ee.md +++ b/src/content/docs/11.migration-guide/0.23.0/tenant-migration-ee.md @@ -399,4 +399,4 @@ Most S3-compatible providers (including AWS S3, MinIO, and Cloudflare R2) allow * If your R2/MinIO/Ceph console does not support move/rename in-place, you may need to copy the object to the new location and then delete the original. 5. **Verify** that all data now resides under the tenant folder. - + diff --git a/content/docs/11.migration-guide/0.23.0/tenant-migration-oss.md b/src/content/docs/11.migration-guide/0.23.0/tenant-migration-oss.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/tenant-migration-oss.md rename to src/content/docs/11.migration-guide/0.23.0/tenant-migration-oss.md diff --git a/content/docs/11.migration-guide/0.23.0/tenant-segment-removed-from-superadmin-apis.md b/src/content/docs/11.migration-guide/0.23.0/tenant-segment-removed-from-superadmin-apis.md similarity index 100% rename from content/docs/11.migration-guide/0.23.0/tenant-segment-removed-from-superadmin-apis.md rename to src/content/docs/11.migration-guide/0.23.0/tenant-segment-removed-from-superadmin-apis.md diff --git a/content/docs/11.migration-guide/0.24.0/basic-authentication.md b/src/content/docs/11.migration-guide/0.24.0/basic-authentication.md similarity index 100% rename from content/docs/11.migration-guide/0.24.0/basic-authentication.md rename to src/content/docs/11.migration-guide/0.24.0/basic-authentication.md diff --git a/content/docs/11.migration-guide/0.24.0/capture-filename.md b/src/content/docs/11.migration-guide/0.24.0/capture-filename.md similarity index 100% rename from content/docs/11.migration-guide/0.24.0/capture-filename.md rename to src/content/docs/11.migration-guide/0.24.0/capture-filename.md diff --git a/content/docs/11.migration-guide/0.24.0/endpoint-changes.md b/src/content/docs/11.migration-guide/0.24.0/endpoint-changes.md similarity index 100% rename from content/docs/11.migration-guide/0.24.0/endpoint-changes.md rename to src/content/docs/11.migration-guide/0.24.0/endpoint-changes.md diff --git a/content/docs/11.migration-guide/0.24.0/index.md b/src/content/docs/11.migration-guide/0.24.0/index.md similarity index 100% rename from content/docs/11.migration-guide/0.24.0/index.md rename to src/content/docs/11.migration-guide/0.24.0/index.md diff --git a/content/docs/11.migration-guide/0.24.0/renaming-langchain4j-plugin-ai.md b/src/content/docs/11.migration-guide/0.24.0/renaming-langchain4j-plugin-ai.md similarity index 100% rename from content/docs/11.migration-guide/0.24.0/renaming-langchain4j-plugin-ai.md rename to src/content/docs/11.migration-guide/0.24.0/renaming-langchain4j-plugin-ai.md diff --git a/content/docs/11.migration-guide/0.24.0/retries-maxAttempts.md b/src/content/docs/11.migration-guide/0.24.0/retries-maxAttempts.md similarity index 100% rename from content/docs/11.migration-guide/0.24.0/retries-maxAttempts.md rename to src/content/docs/11.migration-guide/0.24.0/retries-maxAttempts.md diff --git a/content/docs/11.migration-guide/1.0.0/custom-plugin-packages.md b/src/content/docs/11.migration-guide/1.0.0/custom-plugin-packages.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/custom-plugin-packages.md rename to src/content/docs/11.migration-guide/1.0.0/custom-plugin-packages.md diff --git a/content/docs/11.migration-guide/1.0.0/helm-charts.md b/src/content/docs/11.migration-guide/1.0.0/helm-charts.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/helm-charts.md rename to src/content/docs/11.migration-guide/1.0.0/helm-charts.md diff --git a/content/docs/11.migration-guide/1.0.0/index.md b/src/content/docs/11.migration-guide/1.0.0/index.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/index.md rename to src/content/docs/11.migration-guide/1.0.0/index.md diff --git a/content/docs/11.migration-guide/1.0.0/inputs-defaults-property.md b/src/content/docs/11.migration-guide/1.0.0/inputs-defaults-property.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/inputs-defaults-property.md rename to src/content/docs/11.migration-guide/1.0.0/inputs-defaults-property.md diff --git a/content/docs/11.migration-guide/1.0.0/purge-audit-logs.md b/src/content/docs/11.migration-guide/1.0.0/purge-audit-logs.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/purge-audit-logs.md rename to src/content/docs/11.migration-guide/1.0.0/purge-audit-logs.md diff --git a/content/docs/11.migration-guide/1.0.0/reserved-flow-ids.md b/src/content/docs/11.migration-guide/1.0.0/reserved-flow-ids.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/reserved-flow-ids.md rename to src/content/docs/11.migration-guide/1.0.0/reserved-flow-ids.md diff --git a/content/docs/11.migration-guide/1.0.0/singer-plugin.md b/src/content/docs/11.migration-guide/1.0.0/singer-plugin.md similarity index 100% rename from content/docs/11.migration-guide/1.0.0/singer-plugin.md rename to src/content/docs/11.migration-guide/1.0.0/singer-plugin.md diff --git a/content/docs/11.migration-guide/index.md b/src/content/docs/11.migration-guide/index.md similarity index 100% rename from content/docs/11.migration-guide/index.md rename to src/content/docs/11.migration-guide/index.md diff --git a/content/docs/13.terraform/data-sources/binding.md b/src/content/docs/13.terraform/data-sources/binding.md similarity index 100% rename from content/docs/13.terraform/data-sources/binding.md rename to src/content/docs/13.terraform/data-sources/binding.md diff --git a/content/docs/13.terraform/data-sources/flow.md b/src/content/docs/13.terraform/data-sources/flow.md similarity index 100% rename from content/docs/13.terraform/data-sources/flow.md rename to src/content/docs/13.terraform/data-sources/flow.md diff --git a/content/docs/13.terraform/data-sources/group.md b/src/content/docs/13.terraform/data-sources/group.md similarity index 100% rename from content/docs/13.terraform/data-sources/group.md rename to src/content/docs/13.terraform/data-sources/group.md diff --git a/content/docs/13.terraform/data-sources/index.md b/src/content/docs/13.terraform/data-sources/index.md similarity index 100% rename from content/docs/13.terraform/data-sources/index.md rename to src/content/docs/13.terraform/data-sources/index.md diff --git a/content/docs/13.terraform/data-sources/kv.md b/src/content/docs/13.terraform/data-sources/kv.md similarity index 100% rename from content/docs/13.terraform/data-sources/kv.md rename to src/content/docs/13.terraform/data-sources/kv.md diff --git a/content/docs/13.terraform/data-sources/namespace.md b/src/content/docs/13.terraform/data-sources/namespace.md similarity index 100% rename from content/docs/13.terraform/data-sources/namespace.md rename to src/content/docs/13.terraform/data-sources/namespace.md diff --git a/content/docs/13.terraform/data-sources/namespace_file.md b/src/content/docs/13.terraform/data-sources/namespace_file.md similarity index 100% rename from content/docs/13.terraform/data-sources/namespace_file.md rename to src/content/docs/13.terraform/data-sources/namespace_file.md diff --git a/content/docs/13.terraform/data-sources/role.md b/src/content/docs/13.terraform/data-sources/role.md similarity index 100% rename from content/docs/13.terraform/data-sources/role.md rename to src/content/docs/13.terraform/data-sources/role.md diff --git a/content/docs/13.terraform/data-sources/service_account.md b/src/content/docs/13.terraform/data-sources/service_account.md similarity index 100% rename from content/docs/13.terraform/data-sources/service_account.md rename to src/content/docs/13.terraform/data-sources/service_account.md diff --git a/content/docs/13.terraform/data-sources/template.md b/src/content/docs/13.terraform/data-sources/template.md similarity index 100% rename from content/docs/13.terraform/data-sources/template.md rename to src/content/docs/13.terraform/data-sources/template.md diff --git a/content/docs/13.terraform/data-sources/tenant.md b/src/content/docs/13.terraform/data-sources/tenant.md similarity index 100% rename from content/docs/13.terraform/data-sources/tenant.md rename to src/content/docs/13.terraform/data-sources/tenant.md diff --git a/content/docs/13.terraform/data-sources/user.md b/src/content/docs/13.terraform/data-sources/user.md similarity index 100% rename from content/docs/13.terraform/data-sources/user.md rename to src/content/docs/13.terraform/data-sources/user.md diff --git a/content/docs/13.terraform/data-sources/user_api_tokens.md b/src/content/docs/13.terraform/data-sources/user_api_tokens.md similarity index 100% rename from content/docs/13.terraform/data-sources/user_api_tokens.md rename to src/content/docs/13.terraform/data-sources/user_api_tokens.md diff --git a/content/docs/13.terraform/data-sources/worker_group.md b/src/content/docs/13.terraform/data-sources/worker_group.md similarity index 100% rename from content/docs/13.terraform/data-sources/worker_group.md rename to src/content/docs/13.terraform/data-sources/worker_group.md diff --git a/content/docs/13.terraform/guides/configurations.md b/src/content/docs/13.terraform/guides/configurations.md similarity index 100% rename from content/docs/13.terraform/guides/configurations.md rename to src/content/docs/13.terraform/guides/configurations.md diff --git a/content/docs/13.terraform/guides/index.md b/src/content/docs/13.terraform/guides/index.md similarity index 100% rename from content/docs/13.terraform/guides/index.md rename to src/content/docs/13.terraform/guides/index.md diff --git a/content/docs/13.terraform/guides/working-with-yaml.md b/src/content/docs/13.terraform/guides/working-with-yaml.md similarity index 100% rename from content/docs/13.terraform/guides/working-with-yaml.md rename to src/content/docs/13.terraform/guides/working-with-yaml.md diff --git a/content/docs/13.terraform/index.md b/src/content/docs/13.terraform/index.md similarity index 100% rename from content/docs/13.terraform/index.md rename to src/content/docs/13.terraform/index.md diff --git a/content/docs/13.terraform/resources/app.md b/src/content/docs/13.terraform/resources/app.md similarity index 100% rename from content/docs/13.terraform/resources/app.md rename to src/content/docs/13.terraform/resources/app.md diff --git a/content/docs/13.terraform/resources/binding.md b/src/content/docs/13.terraform/resources/binding.md similarity index 100% rename from content/docs/13.terraform/resources/binding.md rename to src/content/docs/13.terraform/resources/binding.md diff --git a/content/docs/13.terraform/resources/dashboard.md b/src/content/docs/13.terraform/resources/dashboard.md similarity index 100% rename from content/docs/13.terraform/resources/dashboard.md rename to src/content/docs/13.terraform/resources/dashboard.md diff --git a/content/docs/13.terraform/resources/flow.md b/src/content/docs/13.terraform/resources/flow.md similarity index 100% rename from content/docs/13.terraform/resources/flow.md rename to src/content/docs/13.terraform/resources/flow.md diff --git a/content/docs/13.terraform/resources/group.md b/src/content/docs/13.terraform/resources/group.md similarity index 100% rename from content/docs/13.terraform/resources/group.md rename to src/content/docs/13.terraform/resources/group.md diff --git a/content/docs/13.terraform/resources/index.md b/src/content/docs/13.terraform/resources/index.md similarity index 100% rename from content/docs/13.terraform/resources/index.md rename to src/content/docs/13.terraform/resources/index.md diff --git a/content/docs/13.terraform/resources/kv.md b/src/content/docs/13.terraform/resources/kv.md similarity index 100% rename from content/docs/13.terraform/resources/kv.md rename to src/content/docs/13.terraform/resources/kv.md diff --git a/content/docs/13.terraform/resources/namespace.md b/src/content/docs/13.terraform/resources/namespace.md similarity index 100% rename from content/docs/13.terraform/resources/namespace.md rename to src/content/docs/13.terraform/resources/namespace.md diff --git a/content/docs/13.terraform/resources/namespace_file.md b/src/content/docs/13.terraform/resources/namespace_file.md similarity index 100% rename from content/docs/13.terraform/resources/namespace_file.md rename to src/content/docs/13.terraform/resources/namespace_file.md diff --git a/content/docs/13.terraform/resources/namespace_secret.md b/src/content/docs/13.terraform/resources/namespace_secret.md similarity index 100% rename from content/docs/13.terraform/resources/namespace_secret.md rename to src/content/docs/13.terraform/resources/namespace_secret.md diff --git a/content/docs/13.terraform/resources/role.md b/src/content/docs/13.terraform/resources/role.md similarity index 100% rename from content/docs/13.terraform/resources/role.md rename to src/content/docs/13.terraform/resources/role.md diff --git a/content/docs/13.terraform/resources/security_integration.md b/src/content/docs/13.terraform/resources/security_integration.md similarity index 100% rename from content/docs/13.terraform/resources/security_integration.md rename to src/content/docs/13.terraform/resources/security_integration.md diff --git a/content/docs/13.terraform/resources/service_account.md b/src/content/docs/13.terraform/resources/service_account.md similarity index 100% rename from content/docs/13.terraform/resources/service_account.md rename to src/content/docs/13.terraform/resources/service_account.md diff --git a/content/docs/13.terraform/resources/template.md b/src/content/docs/13.terraform/resources/template.md similarity index 100% rename from content/docs/13.terraform/resources/template.md rename to src/content/docs/13.terraform/resources/template.md diff --git a/content/docs/13.terraform/resources/tenant.md b/src/content/docs/13.terraform/resources/tenant.md similarity index 100% rename from content/docs/13.terraform/resources/tenant.md rename to src/content/docs/13.terraform/resources/tenant.md diff --git a/content/docs/13.terraform/resources/user.md b/src/content/docs/13.terraform/resources/user.md similarity index 100% rename from content/docs/13.terraform/resources/user.md rename to src/content/docs/13.terraform/resources/user.md diff --git a/content/docs/13.terraform/resources/user_api_token.md b/src/content/docs/13.terraform/resources/user_api_token.md similarity index 100% rename from content/docs/13.terraform/resources/user_api_token.md rename to src/content/docs/13.terraform/resources/user_api_token.md diff --git a/content/docs/13.terraform/resources/user_password.md b/src/content/docs/13.terraform/resources/user_password.md similarity index 100% rename from content/docs/13.terraform/resources/user_password.md rename to src/content/docs/13.terraform/resources/user_password.md diff --git a/content/docs/13.terraform/resources/worker_group.md b/src/content/docs/13.terraform/resources/worker_group.md similarity index 100% rename from content/docs/13.terraform/resources/worker_group.md rename to src/content/docs/13.terraform/resources/worker_group.md diff --git a/content/docs/14.best-practices/0.flows.md b/src/content/docs/14.best-practices/0.flows.md similarity index 100% rename from content/docs/14.best-practices/0.flows.md rename to src/content/docs/14.best-practices/0.flows.md diff --git a/content/docs/14.best-practices/1.from-dev-to-prod.md b/src/content/docs/14.best-practices/1.from-dev-to-prod.md similarity index 100% rename from content/docs/14.best-practices/1.from-dev-to-prod.md rename to src/content/docs/14.best-practices/1.from-dev-to-prod.md diff --git a/content/docs/14.best-practices/2.naming-conventions.md b/src/content/docs/14.best-practices/2.naming-conventions.md similarity index 100% rename from content/docs/14.best-practices/2.naming-conventions.md rename to src/content/docs/14.best-practices/2.naming-conventions.md diff --git a/content/docs/14.best-practices/3.manage-environments.md b/src/content/docs/14.best-practices/3.manage-environments.md similarity index 100% rename from content/docs/14.best-practices/3.manage-environments.md rename to src/content/docs/14.best-practices/3.manage-environments.md diff --git a/content/docs/14.best-practices/4.managing-pip-dependencies.md b/src/content/docs/14.best-practices/4.managing-pip-dependencies.md similarity index 100% rename from content/docs/14.best-practices/4.managing-pip-dependencies.md rename to src/content/docs/14.best-practices/4.managing-pip-dependencies.md diff --git a/content/docs/14.best-practices/5.expressions-with-namespace-files.md b/src/content/docs/14.best-practices/5.expressions-with-namespace-files.md similarity index 98% rename from content/docs/14.best-practices/5.expressions-with-namespace-files.md rename to src/content/docs/14.best-practices/5.expressions-with-namespace-files.md index 9c3100a4e7f..0133403fcfa 100644 --- a/content/docs/14.best-practices/5.expressions-with-namespace-files.md +++ b/src/content/docs/14.best-practices/5.expressions-with-namespace-files.md @@ -47,7 +47,7 @@ You cannot directly use [Expressions](../expressions/index.md) inside of [Namesp In either case, we need to add our code as a [Namespace File](../05.concepts/02.namespace-files.md). To do this, you can use the [Editor](../08.ui/01.flows.md#editor) or import it directly. - + ## Using Namespace Files with Environment Variables diff --git a/content/docs/14.best-practices/6.git.md b/src/content/docs/14.best-practices/6.git.md similarity index 98% rename from content/docs/14.best-practices/6.git.md rename to src/content/docs/14.best-practices/6.git.md index e0a67cd13ea..fa3c780c82c 100644 --- a/content/docs/14.best-practices/6.git.md +++ b/src/content/docs/14.best-practices/6.git.md @@ -25,6 +25,6 @@ There are multiple ways to use Git with Kestra: The image below shows how to choose the right pattern based on your needs: - + For a detailed comparison of the three patterns, check the [Version Control with Git](../version-control-cicd/04.git.md) page. diff --git a/content/docs/14.best-practices/7.outputs.md b/src/content/docs/14.best-practices/7.outputs.md similarity index 100% rename from content/docs/14.best-practices/7.outputs.md rename to src/content/docs/14.best-practices/7.outputs.md diff --git a/content/docs/14.best-practices/8.business-unit-separation.md b/src/content/docs/14.best-practices/8.business-unit-separation.md similarity index 100% rename from content/docs/14.best-practices/8.business-unit-separation.md rename to src/content/docs/14.best-practices/8.business-unit-separation.md diff --git a/content/docs/14.best-practices/9.secrets-management.md b/src/content/docs/14.best-practices/9.secrets-management.md similarity index 97% rename from content/docs/14.best-practices/9.secrets-management.md rename to src/content/docs/14.best-practices/9.secrets-management.md index 73b3b1f2bf5..953c293ba36 100644 --- a/content/docs/14.best-practices/9.secrets-management.md +++ b/src/content/docs/14.best-practices/9.secrets-management.md @@ -26,7 +26,7 @@ tasks: ``` In the logs, the token name `SUPER_SECRET` is exposed: - + We recommend the following best practices: diff --git a/content/docs/14.best-practices/index.md b/src/content/docs/14.best-practices/index.md similarity index 100% rename from content/docs/14.best-practices/index.md rename to src/content/docs/14.best-practices/index.md diff --git a/content/docs/15.how-to-guides/access-local-files.md b/src/content/docs/15.how-to-guides/access-local-files.md similarity index 100% rename from content/docs/15.how-to-guides/access-local-files.md rename to src/content/docs/15.how-to-guides/access-local-files.md diff --git a/content/docs/15.how-to-guides/alerting.md b/src/content/docs/15.how-to-guides/alerting.md similarity index 97% rename from content/docs/15.how-to-guides/alerting.md rename to src/content/docs/15.how-to-guides/alerting.md index 7b7fec44b47..5ec69f4eae2 100644 --- a/content/docs/15.how-to-guides/alerting.md +++ b/src/content/docs/15.how-to-guides/alerting.md @@ -21,7 +21,7 @@ Alerting is a crucial part to a production environment to ensure high uptime and Kestra has a Notifications plugin group that has tasks for all your favorite platforms, like Slack, Teams and PagerDuty. This makes it really easy to configure them directly inside of your workflows. - + There’s 2 tasks for each of these platforms: @@ -46,7 +46,7 @@ errors: When executed, it looks like this in Slack: - + ## Subflows diff --git a/content/docs/15.how-to-guides/api.md b/src/content/docs/15.how-to-guides/api.md similarity index 97% rename from content/docs/15.how-to-guides/api.md rename to src/content/docs/15.how-to-guides/api.md index 705c9963169..f6b11ef9fd3 100644 --- a/content/docs/15.how-to-guides/api.md +++ b/src/content/docs/15.how-to-guides/api.md @@ -22,7 +22,7 @@ In this guide, we're going to specifically look at the Kestra API and how that c In the documentation, there's references for both the [Open Source](../api-reference/open-source.md) as well as [Cloud & Enterprise ](../api-reference/enterprise.md) APIs to make it easy to know what you can do with them. We're going to look at a number examples we can create with both references. When we open the [Open Source API Reference](../api-reference/open-source.md), we can see there's a number of sections to make it easy to navigate: - + ## Making Requests with Authentication @@ -398,7 +398,7 @@ To start with, we can add a KV pair to the KV Store with the following [PUT requ curl -X PUT -H "Content-Type: application/json" http://localhost:8080/api/v1/main/namespaces/company.team/kv/my_key -d '"Hello, World"' ``` We can check in Kestra that it was added successfully: - + We can modify this by changing the body. For example, we will change the body to `"This is a modified value"`: @@ -408,11 +408,11 @@ curl -X PUT -H "Content-Type: application/json" http://localhost:8080/api/v1/mai We can see the key has been modified since it was created: - + When we open the key, we will see the value has also been modified to reflect our request. - + If we want to fetch the value from the KV Store, we will do so with the following [GET Request](https://kestra.io/docs/api-reference/open-source#get-/api/v1/namespaces/-namespace-/kv/-key-) `/api/v1/main/namespaces/{namespaces}/kv/{key}`. In this example, we can fetch the latest value from the key `my_key`: @@ -437,7 +437,7 @@ Along with managing your Flows with the API, you can also manage your Namespace Using the [GET Request](https://kestra.io/docs/api-reference/open-source#get-/api/v1/namespaces/-namespace-/files/directory) `/api/v1/main/namespaces/company.team/files/directory`, we can get a list of all the files in our namespace. - + We will make this request for the `company.team` namespace with the following command: @@ -522,4 +522,4 @@ curl -X POST 'http://localhost:8080/api/v1/main/namespaces/company.team/files?pa When we make this request, we can see it appear in the Namespace Editor: - + diff --git a/content/docs/15.how-to-guides/azure-workload-id.md b/src/content/docs/15.how-to-guides/azure-workload-id.md similarity index 100% rename from content/docs/15.how-to-guides/azure-workload-id.md rename to src/content/docs/15.how-to-guides/azure-workload-id.md diff --git a/content/docs/15.how-to-guides/ceph.md b/src/content/docs/15.how-to-guides/ceph.md similarity index 100% rename from content/docs/15.how-to-guides/ceph.md rename to src/content/docs/15.how-to-guides/ceph.md diff --git a/content/docs/15.how-to-guides/cloudflare-r2.md b/src/content/docs/15.how-to-guides/cloudflare-r2.md similarity index 100% rename from content/docs/15.how-to-guides/cloudflare-r2.md rename to src/content/docs/15.how-to-guides/cloudflare-r2.md diff --git a/content/docs/15.how-to-guides/conditional-branching.md b/src/content/docs/15.how-to-guides/conditional-branching.md similarity index 100% rename from content/docs/15.how-to-guides/conditional-branching.md rename to src/content/docs/15.how-to-guides/conditional-branching.md diff --git a/content/docs/15.how-to-guides/custom-plugin.md b/src/content/docs/15.how-to-guides/custom-plugin.md similarity index 98% rename from content/docs/15.how-to-guides/custom-plugin.md rename to src/content/docs/15.how-to-guides/custom-plugin.md index 6da6193a03f..9417e29aa43 100644 --- a/content/docs/15.how-to-guides/custom-plugin.md +++ b/src/content/docs/15.how-to-guides/custom-plugin.md @@ -44,7 +44,7 @@ Here are the steps: Once you completed the steps above, you should see a similar directory structure: - + As you can see, there is one generated plugin: the `Example` class representing the `Example` plugin (a task). @@ -426,6 +426,6 @@ tasks: On executing the flow, you can go to the `Outputs` tab, and check out the output. - + You are now all set to build more plugins and explore Kestra to its fullest! diff --git a/content/docs/15.how-to-guides/dataform.md b/src/content/docs/15.how-to-guides/dataform.md similarity index 100% rename from content/docs/15.how-to-guides/dataform.md rename to src/content/docs/15.how-to-guides/dataform.md diff --git a/content/docs/15.how-to-guides/dbt.md b/src/content/docs/15.how-to-guides/dbt.md similarity index 96% rename from content/docs/15.how-to-guides/dbt.md rename to src/content/docs/15.how-to-guides/dbt.md index ee2da9b7fa1..3354bdde355 100644 --- a/content/docs/15.how-to-guides/dbt.md +++ b/src/content/docs/15.how-to-guides/dbt.md @@ -47,7 +47,7 @@ You can use this flow as an initial setup: 3. Execute that flow 4. Click on the `Files` sidebar in the code editor to view the uploaded dbt files. - + --- @@ -101,7 +101,7 @@ from {{ ref('my_first_dbt_model') }} where id = 2 ``` - + When you now run the flow using the second dropdown value for the `dbt_command` input, only the new model will be built. This allows you to test the changes quickly and iterate faster. diff --git a/content/docs/15.how-to-guides/debezium.md b/src/content/docs/15.how-to-guides/debezium.md similarity index 100% rename from content/docs/15.how-to-guides/debezium.md rename to src/content/docs/15.how-to-guides/debezium.md diff --git a/content/docs/15.how-to-guides/dynamic-flows.md b/src/content/docs/15.how-to-guides/dynamic-flows.md similarity index 100% rename from content/docs/15.how-to-guides/dynamic-flows.md rename to src/content/docs/15.how-to-guides/dynamic-flows.md diff --git a/content/docs/15.how-to-guides/dynamic-inputs.md b/src/content/docs/15.how-to-guides/dynamic-inputs.md similarity index 95% rename from content/docs/15.how-to-guides/dynamic-inputs.md rename to src/content/docs/15.how-to-guides/dynamic-inputs.md index a685ffdc18d..4636f2d23f7 100644 --- a/content/docs/15.how-to-guides/dynamic-inputs.md +++ b/src/content/docs/15.how-to-guides/dynamic-inputs.md @@ -45,7 +45,7 @@ triggers: This is how the KV store will look post execution of the above flow. - + ## Flow supporting Dynamic Inputs @@ -69,7 +69,7 @@ tasks: When you execute this flow, the `department` input will have a dropdown that contains the values fetched from the `department_key` key in the KV store. - + ## Dynamic Inputs with HTTP function diff --git a/content/docs/15.how-to-guides/etl-pipelines.md b/src/content/docs/15.how-to-guides/etl-pipelines.md similarity index 100% rename from content/docs/15.how-to-guides/etl-pipelines.md rename to src/content/docs/15.how-to-guides/etl-pipelines.md diff --git a/content/docs/15.how-to-guides/github-actions.md b/src/content/docs/15.how-to-guides/github-actions.md similarity index 97% rename from content/docs/15.how-to-guides/github-actions.md rename to src/content/docs/15.how-to-guides/github-actions.md index 17f3b2df08e..9640776c1d2 100644 --- a/content/docs/15.how-to-guides/github-actions.md +++ b/src/content/docs/15.how-to-guides/github-actions.md @@ -80,7 +80,7 @@ jobs: steps: - name: Checkout repo content uses: actions/checkout@v4 - + - name: Deploy flows uses: kestra-io/deploy-action@master with: @@ -108,7 +108,7 @@ jobs: steps: - name: Checkout repo content uses: actions/checkout@v4 - + - name: Deploy flows uses: kestra-io/deploy-action@master with: @@ -137,7 +137,7 @@ jobs: steps: - name: Checkout repo content uses: actions/checkout@v4 - + - name: Deploy flows uses: kestra-io/deploy-action@master with: @@ -158,10 +158,10 @@ The goal of this ruleset is to protect the `main` branch as our GitHub Action wi - Require a pull request before merging - No commits can be made directly to the `main` branch - Require status checks to pass - Requires our Validate Action to pass before we can merge our Pull Requests - + -With these enabled, we are required to make a Pull Request before our flows end up in production. This enables us to run our validate check and require that to pass before we can merge any pull requests. +With these enabled, we are required to make a Pull Request before our flows end up in production. This enables us to run our validate check and require that to pass before we can merge any pull requests. - + In the example above, the flow was had an incorrect indentation so it failed the validate check. As a result of this, the Pull Request is unable to be merged until it is fixed. diff --git a/content/docs/15.how-to-guides/golang.md b/src/content/docs/15.how-to-guides/golang.md similarity index 98% rename from content/docs/15.how-to-guides/golang.md rename to src/content/docs/15.how-to-guides/golang.md index 767ff6397dd..0f8a936377b 100644 --- a/content/docs/15.how-to-guides/golang.md +++ b/src/content/docs/15.how-to-guides/golang.md @@ -124,7 +124,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -212,4 +212,4 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + diff --git a/content/docs/15.how-to-guides/google-credentials.md b/src/content/docs/15.how-to-guides/google-credentials.md similarity index 100% rename from content/docs/15.how-to-guides/google-credentials.md rename to src/content/docs/15.how-to-guides/google-credentials.md diff --git a/content/docs/15.how-to-guides/google-sheets.md b/src/content/docs/15.how-to-guides/google-sheets.md similarity index 87% rename from content/docs/15.how-to-guides/google-sheets.md rename to src/content/docs/15.how-to-guides/google-sheets.md index 5cbd6d2bee8..43e6df87484 100644 --- a/content/docs/15.how-to-guides/google-sheets.md +++ b/src/content/docs/15.how-to-guides/google-sheets.md @@ -19,13 +19,13 @@ You can use any Google Sheet for this tutorial. In case you do not have Google S 7. The contents of the file will be populated in the spreadsheet. 8. You can put an appropriate title to the spreadsheet, and name the sheet containing the order records as `orders`. - + - + - + - + Now that we have the spreadsheet ready, let us proceed to assign appropriate authorization for the spreadsheet. For this: @@ -34,9 +34,9 @@ Now that we have the spreadsheet ready, let us proceed to assign appropriate aut 3. Click on `Create Service Account` on the top. You may choose to use an existing service account in which case you can skip the next step. 4. Put in appropriate service account name, service account id (the auto-populated value should be good to start with) and service account description, and click on `Done`. - + - + The new service account has been created. Let's add a key to the service account. @@ -50,7 +50,7 @@ The new service account has been created. Let's add a key to the service account Detailed instructions on creating service account can also be found [here](./google-credentials.md). - + We will now provide access to the spreadsheet for the service account. @@ -65,7 +65,7 @@ Let us now enable the Google Sheets API in the GCP console. 1. On the GCP console, search for `Google Sheets API` service, or directly navigate to one using [this link](https://console.cloud.google.com/marketplace/product/google/sheets.googleapis.com). 2. Check whether the Google Sheets API is already enabled. If not, you will see an `Enable` button on the page. Click on the `Enable` button. - + With this, we are all set to access the Google Spreadsheet from Kestra flow. Here is an example of how the Kestra flow might look like: @@ -102,6 +102,6 @@ selectedSheetsTitle: Here is the output of executing the above Kestra flow: - + This is how Kestra's Google Workspace plugin can be used to read the spreadsheet with its Sheet's [`Read`](/plugins/plugin-googleworkspace/sheets/io.kestra.plugin.googleworkspace.sheets.read) task. diff --git a/content/docs/15.how-to-guides/http-request.md b/src/content/docs/15.how-to-guides/http-request.md similarity index 95% rename from content/docs/15.how-to-guides/http-request.md rename to src/content/docs/15.how-to-guides/http-request.md index b2dcf004d12..2a035b73c77 100644 --- a/content/docs/15.how-to-guides/http-request.md +++ b/src/content/docs/15.how-to-guides/http-request.md @@ -76,7 +76,7 @@ In the example below, we can use Postman to make a POST Request to [dummyjson.co In Postman, we'll need to add our URL: `https://dummyjson.com/products/add`. On top of that, we will need to set our request type to `POST` and add the body above as a `raw` option and then change the type to JSON. Once we've done this, we can press send: - + We can also do the same with cURL by using the command below: @@ -133,11 +133,11 @@ tasks: We can see the response from the Logs task in the Logs page: - + However if we want to view the outputs from tasks without needing to use Log tasks, we can easily view our output using the Outputs page inside the UI: - + Here, we are using the [Debug Expression](../04.workflow-components/06.outputs.md#using-debug-expression) option to allow us to view specific outputs by using an expression, like we would to output a dynamic value in a Log task, but after the flow has executed. This is very useful if you're trying to debug tasks and figure out what outputs were generated. @@ -182,7 +182,7 @@ If your body message input is multiple lines, the best practice is to use a pebb When we execute this as a `POST` request, this is the response we receive using the same Debug Expression option in the Outputs page: - + As we can see, this generates the same output from our earlier example but with the added benefit that we can pass this data to later tasks to perform computation if we wanted to! @@ -216,7 +216,7 @@ tasks: As we can see, the response body is showing our updated title field. - + ### DELETE Request @@ -246,8 +246,8 @@ tasks: By adding an input, we can change which product we will remove by asking for the `id` at execution. - + As expected, we get the desired output: - + diff --git a/content/docs/15.how-to-guides/index.md b/src/content/docs/15.how-to-guides/index.md similarity index 100% rename from content/docs/15.how-to-guides/index.md rename to src/content/docs/15.how-to-guides/index.md diff --git a/content/docs/15.how-to-guides/inputs-api.md b/src/content/docs/15.how-to-guides/inputs-api.md similarity index 96% rename from content/docs/15.how-to-guides/inputs-api.md rename to src/content/docs/15.how-to-guides/inputs-api.md index 7e34480eb69..aad53c5f740 100644 --- a/content/docs/15.how-to-guides/inputs-api.md +++ b/src/content/docs/15.how-to-guides/inputs-api.md @@ -70,4 +70,4 @@ tasks: When you execute the `api_call` flow, this will execute the `input_api` flow with the new `user` input - \ No newline at end of file + \ No newline at end of file diff --git a/content/docs/15.how-to-guides/inputs-enum.md b/src/content/docs/15.how-to-guides/inputs-enum.md similarity index 100% rename from content/docs/15.how-to-guides/inputs-enum.md rename to src/content/docs/15.how-to-guides/inputs-enum.md diff --git a/content/docs/15.how-to-guides/javascript.md b/src/content/docs/15.how-to-guides/javascript.md similarity index 98% rename from content/docs/15.how-to-guides/javascript.md rename to src/content/docs/15.how-to-guides/javascript.md index 8adef669c67..b60a472847b 100644 --- a/content/docs/15.how-to-guides/javascript.md +++ b/src/content/docs/15.how-to-guides/javascript.md @@ -203,7 +203,7 @@ tasks: We can also preview our file directly in the Outputs tab as well. - + _This example works for both `io.kestra.plugin.scripts.node.Script` and `io.kestra.plugin.scripts.node.Commands`._ @@ -238,7 +238,7 @@ Kestra.timer('duration', end - start); ``` Once this has executed, `duration` will be viewable under **Metrics**. - + ## Execute GraalVM Task diff --git a/content/docs/15.how-to-guides/js-webhook.md b/src/content/docs/15.how-to-guides/js-webhook.md similarity index 96% rename from content/docs/15.how-to-guides/js-webhook.md rename to src/content/docs/15.how-to-guides/js-webhook.md index b3bcf86978e..86a149caf08 100644 --- a/content/docs/15.how-to-guides/js-webhook.md +++ b/src/content/docs/15.how-to-guides/js-webhook.md @@ -108,7 +108,7 @@ function App() { We can get our Webhook URL by going to **Triggers** at the top of our Flow in Kestra and hovering over webhook icon on the right: - + This current example will make a request with data from a form (which we will add later) using the `useState` hook. We will store the state in `formData` and update it using `setFormData`. @@ -179,7 +179,7 @@ function App() { Now our example will collect the data inside of the `input` field as `dataField` and send it in our request as a key value pair: `dataField: {the input value}`. For example, if I type "Hello" and press **Submit**, it will send the body `{dataField: "Hello"}`. - + The last thing to add now is to display the response back to the user. @@ -237,7 +237,7 @@ function App() { export default App; ``` - + This will: 1. Display a Form with an input and a button. @@ -246,7 +246,7 @@ This will: When we type in a value and press **Submit**, we can see a new execution is created in Kestra and our request body was received and used in our Log task: - + :::collapse{title="CSS Styling"} diff --git a/content/docs/15.how-to-guides/json.md b/src/content/docs/15.how-to-guides/json.md similarity index 97% rename from content/docs/15.how-to-guides/json.md rename to src/content/docs/15.how-to-guides/json.md index 0635cdccbf0..2205113d948 100644 --- a/content/docs/15.how-to-guides/json.md +++ b/src/content/docs/15.how-to-guides/json.md @@ -1,5 +1,5 @@ --- -title: Interacting with JSONs in Kestra +title: Interacting with JSONs in Kestra icon: /docs/icons/api.svg stage: Getting Started topics: @@ -127,4 +127,4 @@ The log message returns `My response: test`. You can use [Debug Expression](../04.workflow-components/06.outputs.md#using-debug-expression) to test expressions without running your workflow. This is useful if you want to be able to see different parts of the JSON easily. - + diff --git a/content/docs/15.how-to-guides/julia.md b/src/content/docs/15.how-to-guides/julia.md similarity index 98% rename from content/docs/15.how-to-guides/julia.md rename to src/content/docs/15.how-to-guides/julia.md index eb52b0321db..30c9b968660 100644 --- a/content/docs/15.how-to-guides/julia.md +++ b/src/content/docs/15.how-to-guides/julia.md @@ -108,7 +108,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -179,4 +179,4 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + diff --git a/content/docs/15.how-to-guides/keycloak.md b/src/content/docs/15.how-to-guides/keycloak.md similarity index 85% rename from content/docs/15.how-to-guides/keycloak.md rename to src/content/docs/15.how-to-guides/keycloak.md index d03ec8cc0df..6fc545daa92 100644 --- a/content/docs/15.how-to-guides/keycloak.md +++ b/src/content/docs/15.how-to-guides/keycloak.md @@ -19,12 +19,12 @@ You can follow the steps described [here](https://documentation.cloud-iam.com/ge Once in KeyCloak, you would need to create a client: - - + + Set `https://{{ yourKestraInstanceURL }}/oauth/callback/keycloak` as Valid redirect URIs and `https://{{ yourKestraInstanceURL }}/logout` as Valid post logout redirect URIs. - + ## Kestra Configuration @@ -46,8 +46,8 @@ micronaut: You can retrieve `clientId` and `clientSecret` via KeyCloak user interface - - + + Don't forget to set a default role in your [Kestra configuration](../configuration/index.md) to streamline the process of adding new users. diff --git a/content/docs/15.how-to-guides/kubernetes-secrets.md b/src/content/docs/15.how-to-guides/kubernetes-secrets.md similarity index 100% rename from content/docs/15.how-to-guides/kubernetes-secrets.md rename to src/content/docs/15.how-to-guides/kubernetes-secrets.md diff --git a/content/docs/15.how-to-guides/local-flow-sync.md b/src/content/docs/15.how-to-guides/local-flow-sync.md similarity index 100% rename from content/docs/15.how-to-guides/local-flow-sync.md rename to src/content/docs/15.how-to-guides/local-flow-sync.md diff --git a/content/docs/15.how-to-guides/long-running-intensive-tasks.md b/src/content/docs/15.how-to-guides/long-running-intensive-tasks.md similarity index 96% rename from content/docs/15.how-to-guides/long-running-intensive-tasks.md rename to src/content/docs/15.how-to-guides/long-running-intensive-tasks.md index fe1941c6e41..87bdaf5e24d 100644 --- a/content/docs/15.how-to-guides/long-running-intensive-tasks.md +++ b/src/content/docs/15.how-to-guides/long-running-intensive-tasks.md @@ -92,11 +92,11 @@ This flow will: - clone the dbt example repository inside the pod - run the dbt seed and build commands - + At the end of the execution, the pod is deleted, and the logs remain available in the Kestra UI. - + ## Embrace Kestra versality with Kubernetes Task Runners @@ -130,7 +130,7 @@ tasks: - dbt build ``` - + In case we want to easily test this flow on a local Kestra instance, we would just have to change the `taskRunner` type to `io.kestra.plugin.scripts.runner.docker.Docker`: diff --git a/content/docs/15.how-to-guides/loop.md b/src/content/docs/15.how-to-guides/loop.md similarity index 100% rename from content/docs/15.how-to-guides/loop.md rename to src/content/docs/15.how-to-guides/loop.md diff --git a/content/docs/15.how-to-guides/minio.md b/src/content/docs/15.how-to-guides/minio.md similarity index 100% rename from content/docs/15.how-to-guides/minio.md rename to src/content/docs/15.how-to-guides/minio.md diff --git a/content/docs/15.how-to-guides/monitoring.md b/src/content/docs/15.how-to-guides/monitoring.md similarity index 91% rename from content/docs/15.how-to-guides/monitoring.md rename to src/content/docs/15.how-to-guides/monitoring.md index 694d0ea38aa..1f30bbfd6d3 100644 --- a/content/docs/15.how-to-guides/monitoring.md +++ b/src/content/docs/15.how-to-guides/monitoring.md @@ -25,7 +25,7 @@ docker compose up Once Kestra is up and running, you can check out the available metrics by going to `http://localhost:8081/prometheus` on your browser. The metrics should appear as below: - + Create a few flows and execute them to generate some metrics for visualization. You can also add triggers to the flows to check the metrics corresponding to executions happening on a regular basis. @@ -63,7 +63,7 @@ Note, in this last command you may have to add `--add-host=host.docker.internal: You can now go to `http://localhost:9090/graph` and try out visualizing some metrics using the PromQL. Here is one of the graphs for `kestra_executor_execution_started_count_total` metric: - + ## Setting up Grafana @@ -75,7 +75,7 @@ docker run -d -p 3000:3000 --name=grafana grafana/grafana-enterprise You can open the Grafana server at `http://localhost:3000`. The default credentials are `admin` as both username and password. Once logged into Grafana, click on the hamburger menu on the top left and go to **Connections -> Data Sources**. - + ### Add Data Source @@ -104,10 +104,10 @@ Now we have some long-running tasks in progress, we can check that the Gauge cor This is how your Grafana should look like: - + Click on **Save** and **Apply** to add this gauge to the dashboard. Similarly, you can now keep on adding more graphs to your dashboard. Here is one of the example dashboards for Kestra metrics. - + diff --git a/content/docs/15.how-to-guides/multiplecondition-listener.md b/src/content/docs/15.how-to-guides/multiplecondition-listener.md similarity index 100% rename from content/docs/15.how-to-guides/multiplecondition-listener.md rename to src/content/docs/15.how-to-guides/multiplecondition-listener.md diff --git a/content/docs/15.how-to-guides/namespace-variables-vs-kvstore.md b/src/content/docs/15.how-to-guides/namespace-variables-vs-kvstore.md similarity index 100% rename from content/docs/15.how-to-guides/namespace-variables-vs-kvstore.md rename to src/content/docs/15.how-to-guides/namespace-variables-vs-kvstore.md diff --git a/content/docs/15.how-to-guides/neon.md b/src/content/docs/15.how-to-guides/neon.md similarity index 94% rename from content/docs/15.how-to-guides/neon.md rename to src/content/docs/15.how-to-guides/neon.md index 3b709a1be68..90ccdfc5563 100644 --- a/content/docs/15.how-to-guides/neon.md +++ b/src/content/docs/15.how-to-guides/neon.md @@ -18,25 +18,25 @@ To get started, make sure you have a [Neon account](https://neon.tech/home) set Once you've logged into Neon, you'll need to set up a project where you'll give it a name, select your desired PostgreSQL version, and select your cloud provider and region. - + Once your project is created, you'll arrive at the Project Dashboard page. From here, you can connect to your database, import data, get sample data, view database content, and much more. - + ## Connecting Neon to Kestra For our example, we want Kestra to supply the data, so you can select to connect to your database. We'll leave the Branch, Compute, Database, and Role as their defaults, but feel free to adjust as needed. Click on the **Connection string** dropdown list, and select Java. This is the connection string we will use in Kestra to connect to our Neon database. Make note of the password and save it for later steps. - + Now that we have a database set up in Neon, we need to create a table for our incoming data. Click on **Tables** on the left sidebar. - + Next, click on the '+' icon to add a table, name it, and create it. You can leave just the default `id` column or add in the columns of your data set now. We are going to use Kestra to alter the table, so we will leave the table empty for now. - + With the setup in Neon done, we can go Kestra to set up our connection. While there's no official Neon plugin, we can connect using the [PostgreSQL plugin](/plugins/plugin-jdbc-postgres), which supports a number of tasks such as `Query`, `CopyIn`, and `CopyOut`. @@ -127,4 +127,4 @@ pluginDefaults: Once this flow completes, we can view the contents of our database in Neon: - + diff --git a/content/docs/15.how-to-guides/notion-webhook.md b/src/content/docs/15.how-to-guides/notion-webhook.md similarity index 97% rename from content/docs/15.how-to-guides/notion-webhook.md rename to src/content/docs/15.how-to-guides/notion-webhook.md index df4199a3456..78efe471d57 100644 --- a/content/docs/15.how-to-guides/notion-webhook.md +++ b/src/content/docs/15.how-to-guides/notion-webhook.md @@ -88,7 +88,7 @@ Set up webhooks directly in your Notion integration: - `database.created` - When new databases are created 7. Click **"Create"** to save the webhook - + For more details, see the [Notion Webhooks API documentation](https://developers.notion.com/reference/webhooks). @@ -112,7 +112,7 @@ http://your-kestra-host:8080/api/v1/main/executions/webhook/company.team/notion- You can copy your webhook URL directly from the Kestra UI from the **Triggers** tab and paste it in Notion: - + ## Testing the integration diff --git a/content/docs/15.how-to-guides/null-values.md b/src/content/docs/15.how-to-guides/null-values.md similarity index 100% rename from content/docs/15.how-to-guides/null-values.md rename to src/content/docs/15.how-to-guides/null-values.md diff --git a/content/docs/15.how-to-guides/parallel-vs-sequential.md b/src/content/docs/15.how-to-guides/parallel-vs-sequential.md similarity index 100% rename from content/docs/15.how-to-guides/parallel-vs-sequential.md rename to src/content/docs/15.how-to-guides/parallel-vs-sequential.md diff --git a/content/docs/15.how-to-guides/pause-resume.md b/src/content/docs/15.how-to-guides/pause-resume.md similarity index 92% rename from content/docs/15.how-to-guides/pause-resume.md rename to src/content/docs/15.how-to-guides/pause-resume.md index 8eb76f56797..8c58b19709e 100644 --- a/content/docs/15.how-to-guides/pause-resume.md +++ b/src/content/docs/15.how-to-guides/pause-resume.md @@ -36,13 +36,13 @@ The `Pause` task will pause the execution and the `Log` task will run only once You can either use the Pause task or manually Pause from the Execution overview page. Once the execution is paused, you can inspect the current logs and outputs. Then, you can resume it from the UI by clicking on the `Resume` button in the `Overview` tab: - + ## Bulk-resuming paused workflows You can bulk-resume paused workflows from the `Executions` page by selecting the workflows you want to resume and clicking on the `Resume` button: - + This feature is useful when you have multiple paused workflows and want to resume them all at once. @@ -112,8 +112,8 @@ tasks: When you click on the `Resume` button in the UI, you will be prompted to provide the approval status and the reason for their decision. The workflow will then continue with the provided input values. - + After the Execution has been resumed, any downstream task can access the `onResume` inputs using the `outputs` of the `Pause` task: - + diff --git a/content/docs/15.how-to-guides/perl.md b/src/content/docs/15.how-to-guides/perl.md similarity index 97% rename from content/docs/15.how-to-guides/perl.md rename to src/content/docs/15.how-to-guides/perl.md index 65fad507794..b25da3e43cf 100644 --- a/content/docs/15.how-to-guides/perl.md +++ b/src/content/docs/15.how-to-guides/perl.md @@ -91,7 +91,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -191,4 +191,4 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + diff --git a/content/docs/15.how-to-guides/powershell.md b/src/content/docs/15.how-to-guides/powershell.md similarity index 97% rename from content/docs/15.how-to-guides/powershell.md rename to src/content/docs/15.how-to-guides/powershell.md index a6bacbe2b6f..6d68ed6d8dd 100644 --- a/content/docs/15.how-to-guides/powershell.md +++ b/src/content/docs/15.how-to-guides/powershell.md @@ -114,7 +114,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -183,4 +183,4 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + diff --git a/content/docs/15.how-to-guides/prometheus-alert-trigger.md b/src/content/docs/15.how-to-guides/prometheus-alert-trigger.md similarity index 94% rename from content/docs/15.how-to-guides/prometheus-alert-trigger.md rename to src/content/docs/15.how-to-guides/prometheus-alert-trigger.md index f1ce9315522..237cc0ca7ba 100644 --- a/content/docs/15.how-to-guides/prometheus-alert-trigger.md +++ b/src/content/docs/15.how-to-guides/prometheus-alert-trigger.md @@ -85,11 +85,11 @@ services: You can verify Prometheus is up and running by going to `http://localhost:9090/graph` and visualizing some metrics using the PromQL. Below is one of the graphs for `kestra_executor_execution_started_count_total` metric: - + Similarly, you can go to `http://localhost:9093/status` and see that the Alertmanager is ready. - + ### Step 1: Define a Prometheus Alert @@ -158,11 +158,11 @@ Make sure that your `groups.name` and `rule_files` have the same name so that Al To check that your rules are picked up by Prometheus, go to `http://localhost:9090/rules`. - + From there, you can see a list of the rules set in the `alert.rules.yml` file: - + ### Step 2: Configure Alertmanager to Use a Webhook @@ -206,7 +206,7 @@ tasks: Once the flow is written, you can verify the trigger is active from the **Flows -> Triggers** tab in the UI. - + ### How It Works diff --git a/content/docs/15.how-to-guides/pushflows.md b/src/content/docs/15.how-to-guides/pushflows.md similarity index 93% rename from content/docs/15.how-to-guides/pushflows.md rename to src/content/docs/15.how-to-guides/pushflows.md index 97ef48c23fd..edec07db6e9 100644 --- a/content/docs/15.how-to-guides/pushflows.md +++ b/src/content/docs/15.how-to-guides/pushflows.md @@ -78,7 +78,7 @@ tasks: Given that the `dryRun` property is set to `true`, the task will only output modifications without pushing any flows to Git yet: - + ## Pushing a single flow to Git @@ -97,19 +97,19 @@ tasks: You should see the following log message: - + And here is what you should see in the Outputs tab: - + When you click on the commit URL from the logs or from the Outputs tab, you'll be redirected to the commit page on GitHub: - + Now, you can create a pull request and merge the changes to the main branch. - + ## Pushing all flows from a single namespace to Git @@ -134,7 +134,7 @@ tasks: message: the simplest dev-to-prod workflow ever ``` - + Let's now adjust the system flow to push all flows from the `dev` namespace to the `develop` branch: @@ -158,11 +158,11 @@ tasks: Again, we can set the `dryRun` property to `true` to see what files will be added, modified, or deleted based on the Git version without overwriting the files in Git yet: - + Now if you change the `dryRun` property to `false` and run the system flow again, you should see all three flows being pushed to the `flows` directory on the `develop` branch with the exact commit messages we have specified in the `commitMessage` property: - + ## Pushing all flows including child namespaces @@ -225,11 +225,11 @@ tasks: When you run this final system flow, you should see the following output: - + And here is a confirmation that all flows from the `dev` namespace and its child namespaces have been pushed to the Git repository: - + Here is a simple table to illustrate how flows are mapped to files in the Git repository: @@ -254,4 +254,4 @@ You can see that each child namespace is represented as a subfolder in the Git r - If you try to add the Personal Access Token (PAT) directly in your source code in the `password` property, you will get an error message. This is a safety mechanism to prevent you and your users from accidentally exposing your PAT in the source code. You should store the PAT as a Kestra Secret, environment variable, namespace variable or as a SECRET-type input in your flow. - Git does not guarantee the order of push operations to a remote repository, which can lead to potential conflicts when multiple users or flows attempt to push changes simultaneously. To minimize the risk of data loss and merge conflicts, it is strongly recommended to use sequential workflows or push changes to separate branches. - + diff --git a/content/docs/15.how-to-guides/pushnamespacefiles.md b/src/content/docs/15.how-to-guides/pushnamespacefiles.md similarity index 90% rename from content/docs/15.how-to-guides/pushnamespacefiles.md rename to src/content/docs/15.how-to-guides/pushnamespacefiles.md index 4b652131902..bba3afb365f 100644 --- a/content/docs/15.how-to-guides/pushnamespacefiles.md +++ b/src/content/docs/15.how-to-guides/pushnamespacefiles.md @@ -64,7 +64,7 @@ tasks: Given that the `dryRun` property is set to `true`, the task will only output modifications without pushing any files to Git yet: - + ## Pushing a single file to Git @@ -83,19 +83,19 @@ tasks: You should see the following log message: - + And here is what you should see in the Outputs tab: - + When you click on the commit URL from the logs or from the Outputs tab, you'll be redirected to the commit page on GitHub: - + Now, you can create a pull request and merge the changes to the main branch. - + ## Pushing all files from a single namespace to Git @@ -111,7 +111,7 @@ echo "Hello, World" console.log("Hello, World") ``` - + Let's now adjust the system flow to push all files from the `dev` namespace to the `dev` branch: @@ -134,11 +134,11 @@ tasks: Again, we can set the `dryRun` property to `true` to see what files will be added, modified, or deleted based on the Git version without overwriting the files in Git yet: - + Now if you change the `dryRun` property to `false` and run the system flow again, you should see all three files being pushed to the `_files` directory on the `develop` branch with the exact commit messages we have specified in the `commitMessage` property: - + ## Extra notes diff --git a/content/docs/15.how-to-guides/python-dependencies.md b/src/content/docs/15.how-to-guides/python-dependencies.md similarity index 100% rename from content/docs/15.how-to-guides/python-dependencies.md rename to src/content/docs/15.how-to-guides/python-dependencies.md diff --git a/content/docs/15.how-to-guides/python-uv.md b/src/content/docs/15.how-to-guides/python-uv.md similarity index 100% rename from content/docs/15.how-to-guides/python-uv.md rename to src/content/docs/15.how-to-guides/python-uv.md diff --git a/content/docs/15.how-to-guides/python.md b/src/content/docs/15.how-to-guides/python.md similarity index 99% rename from content/docs/15.how-to-guides/python.md rename to src/content/docs/15.how-to-guides/python.md index 2d5916f9f7e..954b4db50b1 100644 --- a/content/docs/15.how-to-guides/python.md +++ b/src/content/docs/15.how-to-guides/python.md @@ -286,7 +286,7 @@ tasks: When we execute the above example, we can see Kestra correctly captures the log levels in the Logs view: - + You can read more about the Python Script task in the [Plugin documentation](/plugins/plugin-script-python/io.kestra.plugin.scripts.python.script) @@ -321,7 +321,7 @@ Kestra.timer('duration', end - start) ``` Once this has executed, `duration` will be viewable under **Metrics**. - + ## Execute Flows in Python diff --git a/content/docs/15.how-to-guides/r.md b/src/content/docs/15.how-to-guides/r.md similarity index 98% rename from content/docs/15.how-to-guides/r.md rename to src/content/docs/15.how-to-guides/r.md index cc1cc9eafd2..c7cd564e65c 100644 --- a/content/docs/15.how-to-guides/r.md +++ b/src/content/docs/15.how-to-guides/r.md @@ -114,7 +114,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -183,4 +183,4 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + diff --git a/content/docs/15.how-to-guides/realtime-triggers.md b/src/content/docs/15.how-to-guides/realtime-triggers.md similarity index 76% rename from content/docs/15.how-to-guides/realtime-triggers.md rename to src/content/docs/15.how-to-guides/realtime-triggers.md index 37c0e30e8e4..3fd3fb2dd7d 100644 --- a/content/docs/15.how-to-guides/realtime-triggers.md +++ b/src/content/docs/15.how-to-guides/realtime-triggers.md @@ -97,17 +97,17 @@ When any message is pushed into the `apache/pulsar/logs` Pulsar topic, this flow We will first create the SQS queue from the AWS Console. You can also AWS CLI for this purpose. This is how you can create the AWS SQS from the console: - + You only need to put in the Queue name. Rest all the configuration can be kept as is, and click on "Create Queue" at the bottom of the page. You can now send messages to this queue by clicking on "Send and receive messages" button on the top of the page. - + On the Send and Receive messages page, you can put the Message body under the Send message section, and click on the "Send message" button to send the message to the queue. - + You can use the AWS SQS [RealtimeTrigger](/plugins/plugin-aws/io.kestra.plugin.aws.sqs.realtimetrigger) in the Kestra flow as follows: @@ -135,17 +135,17 @@ When any message is pushed into the `logs` SQS queue, this flow will get trigger We will first create the Pub/Sub topic from the GCP console. For this, click on "Create topic" button on the GCP Pub/Sub console. On the Create topic page, put the topic name `logs` in the Topic ID text box, and leave the rest of the settings as default. Ensure the "Add a default subscription" checkbox is ticked. Click on "CREATE" button at the bottom. This will create the `logs` Pub/Sub topic with the default subscription `logs-sub`. - + - + Navigate to the "MESSAGES" tab. On this tab, click on the "PUBLISH MESSAGE" button. - + On the Publish message popup, put the message you would like to publish to the topic, and click on the "PUBLISH" button on the bottom of the page. This would publish the message to the Pub/Sub topic. - + You can use the GCP Pub/Sub [RealtimeTrigger](/plugins/plugin-gcp/io.kestra.plugin.gcp.pubsub.realtimetrigger) in the Kestra flow as follows: @@ -186,25 +186,25 @@ For this, we will create an Event Hub and a container for checkpoint storage. Fo 12. Click on the "RootManageSharedAccessKey". 13. In the popup page that appears, you can copy the "Connection string–primary key" to be used later in the Kestra flow. With this, the Event Hub is created. - + - + - + - + - + - + - + - + - + - + 14. Let's now create the container. Go to [Storage accounts](https://portal.azure.com/#view/HubsExtension/BrowseResource/resourceType/Microsoft.Storage%2FStorageAccounts) page. 15. Click on "Create storage account". @@ -218,21 +218,21 @@ For this, we will create an Event Hub and a container for checkpoint storage. Fo 23. Once the container is created, navigate to "Access keys" under "Security + networking" from the left menu bar. 24. For the key, click on the "Show" button for the connection string and note it down to be used later in the Kestra flow. - + - + - + - + - + - + - + - + Now that all the setup is ready in Azure, start the Kestra cluster with the environment variables "SECRET_EVENTHUBS_CONNECTION" and "SECRET_BLOB_CONNECTION" containing the base64-encoded value for the Event Hubs connection string and Blob connection string, respectively. @@ -260,8 +260,8 @@ triggers: On the particular Event Hubs page, you can click on "Generate Data" under "Features" from the left menu bar. Choose an appropriate Content-Type from the drop-down, and put the payload you want to push to the Event Hub. When you click on the "Send" button on the bottom, the payload will be pushed to the Event Hub. Also, the flow will be triggered immediately, and you can see the corresponding execution in Kestra. - + - + This is how you can leverage the realtime triggers to react to events in real time to orchestrate business-critical processes. diff --git a/content/docs/15.how-to-guides/rollback-and-revision-history.md b/src/content/docs/15.how-to-guides/rollback-and-revision-history.md similarity index 79% rename from content/docs/15.how-to-guides/rollback-and-revision-history.md rename to src/content/docs/15.how-to-guides/rollback-and-revision-history.md index 495a0fae619..5d91e8e16a0 100644 --- a/content/docs/15.how-to-guides/rollback-and-revision-history.md +++ b/src/content/docs/15.how-to-guides/rollback-and-revision-history.md @@ -1,7 +1,7 @@ --- title: Revision History & Rollback icon: /docs/icons/tutorial.svg -stage: Getting Started +stage: Getting Started topics: - Kestra Concepts - Version Control @@ -17,13 +17,13 @@ Use revision history to rollback to an older version of a flow. Kestra stores revision history which allows you to easily roll back to any older version of the flow. You can check out the older versions by going to the "Revisions" tab on the flow's page. By default, the page opens up a comparison of the current version of the flow against the previous version. - + You can compare any two versions by choosing the appropriate revision number from the drop down on both sides, allowing you to see the changes made between the two selected versions. - + There is a `Restore` button allowing you to roll back to the selected version. The `Restore` button is disabled for the current live version as there is nothing to restore. - + diff --git a/content/docs/15.how-to-guides/ruby.md b/src/content/docs/15.how-to-guides/ruby.md similarity index 98% rename from content/docs/15.how-to-guides/ruby.md rename to src/content/docs/15.how-to-guides/ruby.md index aa21bfd94d9..b3b6cbc2e1c 100644 --- a/content/docs/15.how-to-guides/ruby.md +++ b/src/content/docs/15.how-to-guides/ruby.md @@ -115,7 +115,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -186,7 +186,7 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + ## Execute GraalVM Task diff --git a/content/docs/15.how-to-guides/rust.md b/src/content/docs/15.how-to-guides/rust.md similarity index 100% rename from content/docs/15.how-to-guides/rust.md rename to src/content/docs/15.how-to-guides/rust.md diff --git a/content/docs/15.how-to-guides/secrets.md b/src/content/docs/15.how-to-guides/secrets.md similarity index 100% rename from content/docs/15.how-to-guides/secrets.md rename to src/content/docs/15.how-to-guides/secrets.md diff --git a/content/docs/15.how-to-guides/shell.md b/src/content/docs/15.how-to-guides/shell.md similarity index 98% rename from content/docs/15.how-to-guides/shell.md rename to src/content/docs/15.how-to-guides/shell.md index ce5f262b808..8e3ab3108f8 100644 --- a/content/docs/15.how-to-guides/shell.md +++ b/src/content/docs/15.how-to-guides/shell.md @@ -100,7 +100,7 @@ tasks: All the output variables can be viewed in the Outputs tab of the execution. - + You can refer to the outputs in another task as shown in the example below: @@ -169,4 +169,4 @@ tasks: Once this has executed, both the metrics can be viewed under **Metrics**. - + diff --git a/content/docs/15.how-to-guides/shipyard-migration.md b/src/content/docs/15.how-to-guides/shipyard-migration.md similarity index 95% rename from content/docs/15.how-to-guides/shipyard-migration.md rename to src/content/docs/15.how-to-guides/shipyard-migration.md index 4b558beba58..e31e802ce00 100644 --- a/content/docs/15.how-to-guides/shipyard-migration.md +++ b/src/content/docs/15.how-to-guides/shipyard-migration.md @@ -32,19 +32,19 @@ To get started, follow the [Quickstart Guide](../01.getting-started/01.quickstar Every fleet in Shipyard generates a YAML configuration. You can retrieve it from the UI as shown below, or get it from the version control system like Git in case you maintained one for Shipyard. - + For every vessel in the fleet, try to find a matching [Kestra Plugin](/plugins). For example, the equivalent of **Amazon S3 - Delete Files** vessel in Shipyard will be [io.kestra.plugin.aws.s3.Delete](/plugins/plugin-aws/s3/io.kestra.plugin.aws.s3.delete) and [io.kestra.plugin.aws.s3.DeleteList](/plugins/plugin-aws/s3/io.kestra.plugin.aws.s3.deletelist). In the same fashion as you would configure a vessel, you can configure a task in Kestra. Use the built-it task documentation in the Kestra UI to help you configure all task properties (the **Source and documentation** view). You can easily find plugins directly within the built-in UI editor by using the auto-complete feature. Each task documentation comes with an example and a detailed description of each task property. - + There is no concept of **connections** in Kestra. By default, all tasks are executed sequentially. To adjust the execution logic e.g. to run some tasks in parallel, wrap your tasks in [flowable tasks](../04.workflow-components/01.tasks/00.flowable-tasks.md). As always, the combination of our [core documentation](../index.md), [Plugin documentation](/plugins) and [Blueprints](/blueprints) will help you figure out how to do that. Once you have the fleet equivalent (i.e. a flow) ready in Kestra, you can use the **Source and topology view** to validate whether your Kestra flow matches the connections in your Shipyard fleet. - + You can now Save and Execute your flow. Then, check the Logs, Gantt and Outputs tab of your Execution to validate that your workflow behaves as expected. diff --git a/content/docs/15.how-to-guides/slack-webhook.md b/src/content/docs/15.how-to-guides/slack-webhook.md similarity index 88% rename from content/docs/15.how-to-guides/slack-webhook.md rename to src/content/docs/15.how-to-guides/slack-webhook.md index 57e79886604..cde3e05a301 100644 --- a/content/docs/15.how-to-guides/slack-webhook.md +++ b/src/content/docs/15.how-to-guides/slack-webhook.md @@ -17,28 +17,28 @@ To use the Slack Events API, you'll need to create a Slack app. You can do this First, click on the "Create New App" button: - + Choose the option "From scratch": - + Then, give your app a name and select the workspace where you want to install it: - + Now, you need to enable the "Event Subscriptions" feature: - + In the "Subscribe to bot events" section, you can add events you want to listen to. - + For example, you can listen to the `app_mentions` and `reaction_added` events: - + ## Create a flow with a Webhook trigger @@ -73,11 +73,11 @@ We'll look at how to do this using Python and FastAPI. For deployments, we'll sh First, sign up for a free account on [Modal](https://modal.com/). Then, go to your Settings: - + And create a new API token: - + You will see a similar command: @@ -165,12 +165,12 @@ tasks: MODAL_TOKEN_ID: "{{ secret('MODAL_TOKEN_ID') }}" MODAL_TOKEN_SECRET: "{{ secret('MODAL_TOKEN_SECRET') }}" ``` - + ::: Once you execute that flow, you will see the endpoint to your app in the logs: - + Go back to Slack and add the URL to the "Request URL" field in the "Event Subscriptions" section. Make sure to add `slack/events` at the end of the URL, e.g.: @@ -180,31 +180,31 @@ https://anna-geller--slack-app-fastapi-app.modal.run/slack/events You should see the `Verified` message. Hit `Save Changes` and you're all set! - + ## Install the Slack app to a Workspace and test it First, we need to install the app to the workspace. Go to "Install App" and click on "Install to Workspace": - + - + Now you can test the integration by mentioning your app in a channel. For example, you can write a hello message `hello @kestra`: - + Confirm to invite the app to the channel and congratulate yourself with the "Nicely done!" emoji 🙌: - + You should see that both events (`app mention` and `reaction added`) have triggered an execution of your Kestra flow: - + - + Now it's up to you to automate your daily operations with Slack and Kestra! @@ -214,14 +214,14 @@ You can extend the `slack_events` flow to automate your daily business operation To do something more useful than just logging the Slack event, you can create a flow that listens to the `app_mention` event and responds to that message with a GPT-4 chatbot. First, create an incoming webhook in your Slack app: - + - + Copy the webhook URL: - + ...and paste it into the `url` field of the `SlackIncomingWebhook` task in the flow below: @@ -265,9 +265,9 @@ Note that the `SlackIncomingWebhook` task also has the `messageText` property th And here is the result: - + - + --- diff --git a/content/docs/15.how-to-guides/sqlmesh.md b/src/content/docs/15.how-to-guides/sqlmesh.md similarity index 100% rename from content/docs/15.how-to-guides/sqlmesh.md rename to src/content/docs/15.how-to-guides/sqlmesh.md diff --git a/content/docs/15.how-to-guides/supabase-db.md b/src/content/docs/15.how-to-guides/supabase-db.md similarity index 94% rename from content/docs/15.how-to-guides/supabase-db.md rename to src/content/docs/15.how-to-guides/supabase-db.md index 3f2f0cd744e..10c1ea17a38 100644 --- a/content/docs/15.how-to-guides/supabase-db.md +++ b/src/content/docs/15.how-to-guides/supabase-db.md @@ -26,15 +26,15 @@ To get started, make sure you have a [Supabase account](https://supabase.com/) s Once you've logged into Supabase, you'll need to set up an organization where you will create projects to access resources such as a database. - + Once your organization is created, you'll be prompted to create a new project. You will need to set a password for this project which we will use later to authenticate with the database inside of Kestra. - + Once your project is created, you will now be able to access resources inside of Supabase. Head to the menu on the left side and select **Database**. You will be prompted to create a new table inside of your database, as well as configure any columns you want to use. We can leave the columns blank for now and modify these later once we know what data we want to copy into our database. - + ## Connecting Supabase to Kestra @@ -42,7 +42,7 @@ Now that we have a database set up in Supabase, we can move into Kestra to set u Inside of Supabase, select the **Connect** button at the top to get information about our databases connection. Select **Type** and change this JDBC. This will give us 3 ways of connecting with a Connection String. As we're only connecting to the database when our workflow runs, the Transaction pooler is a good option to use. - + To connect, we can copy the URL provided for the Transaction pooler and replace `[YOUR-PASSWORD]` with the password set earlier. To prevent exposing the password in our flow, we can store it as [secrets](../05.concepts/04.secret.md) or in the [KV Store](../05.concepts/05.kv-store.md). @@ -130,4 +130,4 @@ pluginDefaults: Once this flow completes, we can view the contents of our database in Supabase: - + diff --git a/content/docs/15.how-to-guides/syncflows.md b/src/content/docs/15.how-to-guides/syncflows.md similarity index 94% rename from content/docs/15.how-to-guides/syncflows.md rename to src/content/docs/15.how-to-guides/syncflows.md index 496ec185a91..354cfb7102a 100644 --- a/content/docs/15.how-to-guides/syncflows.md +++ b/src/content/docs/15.how-to-guides/syncflows.md @@ -49,7 +49,7 @@ tasks: Given that the `dryRun` property is set to `true`, the task will only output changes from the Git repository without syncing any flows to Kestra yet: - + The files listed are the same ones we added in the [PushFlows guide](./pushflows.md). @@ -70,11 +70,11 @@ tasks: You should see the same flows from the earlier log now inside of Kestra: - + We can also see a full list inside of the Outputs tab too: - + ## Sync all flows including child namespaces @@ -98,11 +98,11 @@ tasks: When we execute this, we can see all of our flows, including the ones from the `tutorial` child namespace, were synced into Kestra: - + We can also verify this with the Outputs tab too: - + ## Set up a schedule @@ -153,7 +153,7 @@ triggers: To setup this webhook, go to the Settings for your GitHub repository and head to Webhooks and create a new Webhook: - + For the Payload URL, your URL will follow the following format: @@ -165,7 +165,7 @@ This will require your host name to be publicly accessible. If you want to test Once we've done this, we can press save and test it by committing something to our Git repository. - + We can see that the most recent execution was triggered by our Webhook. This is a great way to automate this task so Kestra is always up to date with your Git repository. diff --git a/content/docs/15.how-to-guides/synchonous-executions-api.md b/src/content/docs/15.how-to-guides/synchonous-executions-api.md similarity index 100% rename from content/docs/15.how-to-guides/synchonous-executions-api.md rename to src/content/docs/15.how-to-guides/synchonous-executions-api.md diff --git a/content/docs/15.how-to-guides/syncnamespacefiles.md b/src/content/docs/15.how-to-guides/syncnamespacefiles.md similarity index 93% rename from content/docs/15.how-to-guides/syncnamespacefiles.md rename to src/content/docs/15.how-to-guides/syncnamespacefiles.md index b72de6a75fb..b29899d439f 100644 --- a/content/docs/15.how-to-guides/syncnamespacefiles.md +++ b/src/content/docs/15.how-to-guides/syncnamespacefiles.md @@ -49,7 +49,7 @@ tasks: Given that the `dryRun` property is set to `true`, the task will only output changes from the Git repository without syncing any files to Kestra yet: - + The files listed are the same ones we added in the [PushNamespaceFiles guide](pushnamespacefiles.md). @@ -70,11 +70,11 @@ tasks: You should see the same files from the earlier log now inside of Kestra: - + We can also see a full list inside of the Outputs tab too: - + ## Set up a schedule @@ -126,7 +126,7 @@ triggers: To setup this webhook, go to the Settings for your GitHub repository and head to Webhooks and create a new Webhook: - + For the Payload URL, your URL will follow the following format: @@ -138,7 +138,7 @@ This will require your host name to be publicly accessible. If you want to test Once we've done this, we can press save and test it by committing something to our Git repository. - + We can see that the most recent execution was triggered by our Webhook. This is a great way to automate this task so Kestra is always up to date with your Git repository. diff --git a/content/docs/15.how-to-guides/terraform-modules-for-triggers.md b/src/content/docs/15.how-to-guides/terraform-modules-for-triggers.md similarity index 100% rename from content/docs/15.how-to-guides/terraform-modules-for-triggers.md rename to src/content/docs/15.how-to-guides/terraform-modules-for-triggers.md diff --git a/content/docs/15.how-to-guides/terraform-templating.md b/src/content/docs/15.how-to-guides/terraform-templating.md similarity index 97% rename from content/docs/15.how-to-guides/terraform-templating.md rename to src/content/docs/15.how-to-guides/terraform-templating.md index 57b04a65810..a1f67233301 100644 --- a/content/docs/15.how-to-guides/terraform-templating.md +++ b/src/content/docs/15.how-to-guides/terraform-templating.md @@ -288,7 +288,7 @@ You can either execute this sublow as is, or use it in another flow to avoid rep Executing the subflow will prompt you to enter the SQL query you want to execute : - + ## Using the subflow in a flow @@ -315,7 +315,7 @@ Executing the subflow will prompt you to enter the SQL query you want to execute > Note: `wait: true` will wait for the subflow to finish before continuing the flow execution. `transmitFailed: true` will transmit the failed status of the subflow to the parent flow. Parent flow logs will display tasks from subflow directly: - + ## Subflows vs Terraform templating diff --git a/content/docs/15.how-to-guides/values-between-flows.md b/src/content/docs/15.how-to-guides/values-between-flows.md similarity index 100% rename from content/docs/15.how-to-guides/values-between-flows.md rename to src/content/docs/15.how-to-guides/values-between-flows.md diff --git a/content/docs/15.how-to-guides/webhooks.md b/src/content/docs/15.how-to-guides/webhooks.md similarity index 96% rename from content/docs/15.how-to-guides/webhooks.md rename to src/content/docs/15.how-to-guides/webhooks.md index 1af0ec4bcb3..9287f04cd77 100644 --- a/content/docs/15.how-to-guides/webhooks.md +++ b/src/content/docs/15.how-to-guides/webhooks.md @@ -67,9 +67,9 @@ You can also copy the formed Webhook URL from the **Triggers** tab. Let us leverage Kestra Secrets to store the webhook key. From the left navigation menu on the Kestra UI, navigate to `Namespaces`. Click on the namespace under which you want to create the flow with the webhook trigger. We will use `company.team` namespace for this example. On the corresponding namespace page, navigate to the `Secrets` tab. Click on the `New secret` button at the top, and create a new secret with `Key` as `WEBHOOK_KEY` (you may choose any appropriate name) and `Secret` as the webhook key value. Let us use `1KERKzRQZSMtLdMdNI7Nkr` for this example. Once you've done that, save the secret. - + - + Now, we will create the flow in the same namespace under which we have defined the `WEBHOOK_KEY` secret. The flow will use the webhook trigger, like this: diff --git a/content/docs/16.scripts/00.languages.md b/src/content/docs/16.scripts/00.languages.md similarity index 95% rename from content/docs/16.scripts/00.languages.md rename to src/content/docs/16.scripts/00.languages.md index 623573359d6..1de3f92c1a2 100644 --- a/content/docs/16.scripts/00.languages.md +++ b/src/content/docs/16.scripts/00.languages.md @@ -117,7 +117,7 @@ fn main() { When executed, the print statement is displayed in the Kestra logs: - + Check out the [full guide](../15.how-to-guides/rust.md) which includes using [outputs and metrics](./06.outputs-metrics.md). @@ -156,7 +156,7 @@ class HelloWorld { When executed, the print statement is displayed in the Kestra logs: - + ### C @@ -192,7 +192,7 @@ int main() { When executed, the print statement is displayed in the Kestra logs: - + ### C++ @@ -228,7 +228,7 @@ int main() { When executed, the print statement is displayed in the Kestra logs: - + ### TypeScript @@ -275,7 +275,7 @@ console.log(isJustineAnAdult) When executed, the print statement is displayed in the Kestra logs: - + For more information, you can read more about [Node.js with TypeScript](https://nodejs.org/en/learn/getting-started/nodejs-with-typescript) on their official site. @@ -309,7 +309,7 @@ echo "Hello, World!"; When executed, the print statement is displayed in the Kestra logs: - + As of Kestra version 0.24, there is a dedicated [PHP plugin](/plugins/plugin-script-php). An example flow might look like the following using a script task: @@ -377,7 +377,7 @@ object HelloWorld { When executed, the print statement is displayed in the Kestra logs: - + ### Perl @@ -409,7 +409,7 @@ print("Hello, World!\n"); When executed, the print statement is displayed in the Kestra logs: - + As of Kestra version 0.24, there is a dedicated [Perl plugin](/plugins/plugin-script-perl). An example flow might look like the following using a script task: diff --git a/content/docs/16.scripts/01.commands-vs-scripts.md b/src/content/docs/16.scripts/01.commands-vs-scripts.md similarity index 100% rename from content/docs/16.scripts/01.commands-vs-scripts.md rename to src/content/docs/16.scripts/01.commands-vs-scripts.md diff --git a/content/docs/16.scripts/02.inline-scripts-in-docker.md b/src/content/docs/16.scripts/02.inline-scripts-in-docker.md similarity index 100% rename from content/docs/16.scripts/02.inline-scripts-in-docker.md rename to src/content/docs/16.scripts/02.inline-scripts-in-docker.md diff --git a/content/docs/16.scripts/03.task-runners.md b/src/content/docs/16.scripts/03.task-runners.md similarity index 100% rename from content/docs/16.scripts/03.task-runners.md rename to src/content/docs/16.scripts/03.task-runners.md diff --git a/content/docs/16.scripts/04.custom-docker-image.md b/src/content/docs/16.scripts/04.custom-docker-image.md similarity index 100% rename from content/docs/16.scripts/04.custom-docker-image.md rename to src/content/docs/16.scripts/04.custom-docker-image.md diff --git a/content/docs/16.scripts/05.installing-dependencies.md b/src/content/docs/16.scripts/05.installing-dependencies.md similarity index 100% rename from content/docs/16.scripts/05.installing-dependencies.md rename to src/content/docs/16.scripts/05.installing-dependencies.md diff --git a/content/docs/16.scripts/06.outputs-metrics.md b/src/content/docs/16.scripts/06.outputs-metrics.md similarity index 100% rename from content/docs/16.scripts/06.outputs-metrics.md rename to src/content/docs/16.scripts/06.outputs-metrics.md diff --git a/content/docs/16.scripts/07.input-output-files.md b/src/content/docs/16.scripts/07.input-output-files.md similarity index 100% rename from content/docs/16.scripts/07.input-output-files.md rename to src/content/docs/16.scripts/07.input-output-files.md diff --git a/content/docs/16.scripts/08.logging.md b/src/content/docs/16.scripts/08.logging.md similarity index 100% rename from content/docs/16.scripts/08.logging.md rename to src/content/docs/16.scripts/08.logging.md diff --git a/content/docs/16.scripts/bind-mount.md b/src/content/docs/16.scripts/bind-mount.md similarity index 100% rename from content/docs/16.scripts/bind-mount.md rename to src/content/docs/16.scripts/bind-mount.md diff --git a/content/docs/16.scripts/git-clone.md b/src/content/docs/16.scripts/git-clone.md similarity index 100% rename from content/docs/16.scripts/git-clone.md rename to src/content/docs/16.scripts/git-clone.md diff --git a/content/docs/16.scripts/index.md b/src/content/docs/16.scripts/index.md similarity index 100% rename from content/docs/16.scripts/index.md rename to src/content/docs/16.scripts/index.md diff --git a/content/docs/16.scripts/working-directory.md b/src/content/docs/16.scripts/working-directory.md similarity index 100% rename from content/docs/16.scripts/working-directory.md rename to src/content/docs/16.scripts/working-directory.md diff --git a/content/docs/ai-tools/ai-agents.md b/src/content/docs/ai-tools/ai-agents.md similarity index 96% rename from content/docs/ai-tools/ai-agents.md rename to src/content/docs/ai-tools/ai-agents.md index 08626cc2606..0e47af83e99 100644 --- a/content/docs/ai-tools/ai-agents.md +++ b/src/content/docs/ai-tools/ai-agents.md @@ -62,7 +62,7 @@ inputs: - Allows non-developers to automate tasks with a no-code interface - Keeps everything versioned and governed, so it stays secure and auditable - Extends easily for custom use cases through plugins and custom scripts. - Kestra follows a "start simple and grow as needed" philosophy. You can schedule a basic workflow in a few minutes, then later add Python scripts, Docker containers, or complicated branching logic if the situation calls for it. + Kestra follows a "start simple and grow as needed" philosophy. You can schedule a basic workflow in a few minutes, then later add Python scripts, Docker containers, or complicated branching logic if the situation calls for it. tasks: - id: multilingual_agent type: io.kestra.plugin.ai.agent.AIAgent @@ -92,7 +92,7 @@ pluginDefaults: configuration: logRequests: true logResponses: true - responseFormat: + responseFormat: type: TEXT ``` @@ -102,7 +102,7 @@ The goal of the AI Agent is to summarize text. The flow uses three inputs -- `su All inputs have a default value, and more or less can be used and referenced in downstream agentic tasks depending on the use case with [expressions](../expressions/index.md). When executing the flow, all the inputs can be selected or modified from the defaults. - + Continuing below for reference, we select `short` for the summary length and German (`de`) for the summary language. @@ -112,11 +112,11 @@ In the flow, there are two tasks using the [AI Agent plugin](/plugins/plugin-ai/ Now that the AI Agent is familiar with its role, the `prompt` property tells it what to do, which is to summarize the inputted text. Taking a look at the output for a short summary, the `multilingual_agent` task does provide a 1–2 sentence summary of Kestra in German. - + Following `multilingual_agent` is the `english_brevity` task, which only needs a `prompt` because the `systemMessage` moves downstream in the flow. Whether a shorter English translation is needed, or the original outputted summary is in a different language, the `english_brevity` task provides a different output to match the need. In the execution context, the output is abbreviated and limited to exactly one sentence per the prompt. - + These outputs can then be passed on as notifications or system messages to external tools or subflows within Kestra. Other useful outputs include `tokenUsage` to compare different providers for the same tasks. For more examples and details about properties, outputs, and definitions, refer to the AI [Agent plugin documentation](/plugins/plugin-ai/agent). diff --git a/content/docs/ai-tools/ai-copilot.md b/src/content/docs/ai-tools/ai-copilot.md similarity index 98% rename from content/docs/ai-tools/ai-copilot.md rename to src/content/docs/ai-tools/ai-copilot.md index 8e4c6c490ca..258ee7099e3 100644 --- a/content/docs/ai-tools/ai-copilot.md +++ b/src/content/docs/ai-tools/ai-copilot.md @@ -40,7 +40,7 @@ Replace `api-key` with your Google Gemini API key, and Copilot will appear in th - `logResponses`: Creates logs in Kestra for LLM responses. - `baseURL`: Specifies the endpoint address where the LLM API is hosted. - + :::alert{type="info"} The open-source version supports only Google Gemini models. Enterprise Edition users can configure any LLM provider, including Amazon Bedrock, Anthropic, Azure OpenAI, DeepSeek, Google Gemini, Google Vertex AI, Mistral, and all open-source models supported by Ollama. Navigate down to the Enterprise configurations section for your provider. If you use a different provider, please [reach out to us](https://kestra.io/demo) and we'll add it. @@ -58,7 +58,7 @@ Create a flow with a Python script that fetches weather data for New York City Once prompted, the Copilot generates YAML directly in the flow editor that can be accepted or refused in the bottom right corner. - + If accepted, the flow is created and can be saved for execution, iterated on manually, or continually iterated upon by the Copilot. For example, you want a trigger added to the flow to run it on a schedule. Reopen the Copilot and prompt it with the desired trigger setup such as: @@ -68,7 +68,7 @@ Add a trigger to run the flow every day at 9 AM The Copilot again makes a suggestion to add to the flow, but only in the targeted section, in this case a `triggers` block. This is also the case if you want the Copilot only to consider a specific task, input, plugin default, and so on. - + You can continuously collaborate with Copilot until the flow is exactly as you imagined. If accepted, suggestions are always declaratively written and manageable as code. You can keep track of the revision history using the built-in Revisions tab or with the help of Git Sync. diff --git a/content/docs/ai-tools/ai-rag-workflows.md b/src/content/docs/ai-tools/ai-rag-workflows.md similarity index 100% rename from content/docs/ai-tools/ai-rag-workflows.md rename to src/content/docs/ai-tools/ai-rag-workflows.md diff --git a/content/docs/ai-tools/ai-workflows.md b/src/content/docs/ai-tools/ai-workflows.md similarity index 100% rename from content/docs/ai-tools/ai-workflows.md rename to src/content/docs/ai-tools/ai-workflows.md diff --git a/content/docs/ai-tools/index.md b/src/content/docs/ai-tools/index.md similarity index 100% rename from content/docs/ai-tools/index.md rename to src/content/docs/ai-tools/index.md diff --git a/content/docs/api-reference/01.enterprise.md b/src/content/docs/api-reference/01.enterprise.md similarity index 100% rename from content/docs/api-reference/01.enterprise.md rename to src/content/docs/api-reference/01.enterprise.md diff --git a/content/docs/api-reference/02.open-source.md b/src/content/docs/api-reference/02.open-source.md similarity index 100% rename from content/docs/api-reference/02.open-source.md rename to src/content/docs/api-reference/02.open-source.md diff --git a/content/docs/api-reference/03.kestra-sdk.md b/src/content/docs/api-reference/03.kestra-sdk.md similarity index 100% rename from content/docs/api-reference/03.kestra-sdk.md rename to src/content/docs/api-reference/03.kestra-sdk.md diff --git a/content/docs/api-reference/index.md b/src/content/docs/api-reference/index.md similarity index 100% rename from content/docs/api-reference/index.md rename to src/content/docs/api-reference/index.md diff --git a/content/docs/brand-assets.md b/src/content/docs/brand-assets.md similarity index 83% rename from content/docs/brand-assets.md rename to src/content/docs/brand-assets.md index 2156687bd4d..e83c4ddce31 100644 --- a/content/docs/brand-assets.md +++ b/src/content/docs/brand-assets.md @@ -5,11 +5,11 @@ hideSidebar: true --- - + ## Our Story - + Kestra strives to be a simple yet powerful orchestration platform, enabling our clients to manage complex workflows with the same agility as a conductor who leads a symphony. This is how our logo was born, which embodies Kestra’s ability to orchestrate a wide variety of workflows anywhere at any scale. diff --git a/content/docs/configuration/index.md b/src/content/docs/configuration/index.md similarity index 99% rename from content/docs/configuration/index.md rename to src/content/docs/configuration/index.md index 0d153a325e2..70bc0225ae6 100644 --- a/content/docs/configuration/index.md +++ b/src/content/docs/configuration/index.md @@ -140,7 +140,7 @@ kestra: type: postgres ``` -Supported: PostgreSQL, H2, MySQL. +Supported: PostgreSQL, H2, MySQL. Use H2 for local **development**. For **production**, use PostgreSQL (or MySQL if PostgreSQL isn’t an option). See [software requirements](../09.administrator-guide/00.requirements.md) for minimum versions. @@ -594,7 +594,7 @@ outputs: ``` :::alert{type="warning"} -Without `kestra.encryption.secret-key`, `SECRET` types throw: +Without `kestra.encryption.secret-key`, `SECRET` types throw: `Illegal argument: Unable to use a SECRET input as encryption is not configured`. ::: @@ -1277,7 +1277,7 @@ kestra: If configured in the UI, top-level keys are implied. Example UI screenshot: - + ### AWS Secrets Manager @@ -1523,13 +1523,13 @@ Kestra servers send heartbeats for liveness. #### `kestra.server.liveness.interval` (Duration, default `5s`) -#### `kestra.server.liveness.timeout` (Duration, default `45s`) +#### `kestra.server.liveness.timeout` (Duration, default `45s`) Must match across **all Executors**. -#### `kestra.server.liveness.initial-delay` (Duration, default `45s`) +#### `kestra.server.liveness.initial-delay` (Duration, default `45s`) Must match across **all Executors**. -#### `kestra.server.liveness.heartbeat-interval` (Duration, default `3s`) +#### `kestra.server.liveness.heartbeat-interval` (Duration, default `3s`) Must be strictly less than `timeout`. **Recommended (JDBC / OSS):** @@ -1617,7 +1617,7 @@ kestra: Screenshot example: - + ### S3 diff --git a/content/docs/expressions/index.md b/src/content/docs/expressions/index.md similarity index 99% rename from content/docs/expressions/index.md rename to src/content/docs/expressions/index.md index 14f05c74b59..35d461412f9 100644 --- a/content/docs/expressions/index.md +++ b/src/content/docs/expressions/index.md @@ -50,7 +50,7 @@ The execution context includes these variables: :::alert{type="info"} To see **all metadata** available in the **execution context**, use `{{ printContext() }}` in the Debug Expression console. - + ::: --- diff --git a/src/content/docs/index.mdx b/src/content/docs/index.mdx new file mode 100644 index 00000000000..90021536892 --- /dev/null +++ b/src/content/docs/index.mdx @@ -0,0 +1,29 @@ +--- +title: Welcome to Kestra +isHomepage: true +--- +import HomePageHeader from '../../../components/content/HomePageHeader.vue'; +import HomePageButtons from '../../../components/content/HomePageButtons.vue'; +import WhatsNew from '../../components/blogs/WhatsNew.astro'; +import SupportLinks from '../../../components/content/SupportLinks.vue'; +import BigChildCards from '../../../src/components/docs/BigChildCards.astro'; + ++Kestra is an open-source, infinitely-scalable **orchestration platform** that enables all engineers to manage **business-critical workflows** declaratively in code. + +Thanks to :PluginCount plugins and embedded Code editor with Git and Terraform integrations, Kestra makes scheduled and event-driven workflows easy. + + + + + + + + + + ++ ++ + \ No newline at end of file diff --git a/content/docs/oss-vs-paid.md b/src/content/docs/oss-vs-paid.md similarity index 100% rename from content/docs/oss-vs-paid.md rename to src/content/docs/oss-vs-paid.md diff --git a/content/docs/performance/benchmark.md b/src/content/docs/performance/benchmark.md similarity index 92% rename from content/docs/performance/benchmark.md rename to src/content/docs/performance/benchmark.md index 48cb5164d6c..ff2d05dce6c 100644 --- a/content/docs/performance/benchmark.md +++ b/src/content/docs/performance/benchmark.md @@ -58,7 +58,7 @@ tasks: **Results for Kestra OSS** - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:--|:--|:--------------------------------| @@ -70,7 +70,7 @@ tasks: **Results for Kestra EE** - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:-------------------------|:--------------------|:--------------------------------| @@ -171,7 +171,7 @@ tasks: **Results for Kestra OSS** - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:--|:--|:--------------------------------| @@ -183,7 +183,7 @@ tasks: **Results for Kestra EE** - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:-------------------------|:--------------------|:--------------------------------| @@ -273,7 +273,7 @@ Benchmarked with: With 1.6 KB small-sized messages: - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:--|:--|:--------------------------------| @@ -285,7 +285,7 @@ With 1.6 KB small-sized messages: With 16 KB medium-sized messages: - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:--|:--|:--------------------------------| @@ -297,7 +297,7 @@ With 16 KB medium-sized messages: With 160 KB large-sized messages: - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:--|:--|:--------------------------------| @@ -310,7 +310,7 @@ With 160 KB large-sized messages: With 1.6 KB small-sized messages: - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:-------------------------|:--------------------|:--------------------------------| @@ -325,7 +325,7 @@ With 1.6 KB small-sized messages: With 16 KB medium-sized messages: - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:-------------------------|:--------------------|:--------------------------------| @@ -341,7 +341,7 @@ With 16 KB medium-sized messages: With 160 KB large-sized messages: - + | Executions(per minutes) | Tasks (per minutes) | Execution Latency (in seconds) | |:-------------------------|:--------------------|:--------------------------------| diff --git a/content/docs/performance/index.md b/src/content/docs/performance/index.md similarity index 100% rename from content/docs/performance/index.md rename to src/content/docs/performance/index.md diff --git a/content/docs/performance/performance-tuning.md b/src/content/docs/performance/performance-tuning.md similarity index 100% rename from content/docs/performance/performance-tuning.md rename to src/content/docs/performance/performance-tuning.md diff --git a/content/docs/performance/sizing-and-scaling-infrastructure.md b/src/content/docs/performance/sizing-and-scaling-infrastructure.md similarity index 100% rename from content/docs/performance/sizing-and-scaling-infrastructure.md rename to src/content/docs/performance/sizing-and-scaling-infrastructure.md diff --git a/content/docs/plugin-developer-guide/00.setup.md b/src/content/docs/plugin-developer-guide/00.setup.md similarity index 97% rename from content/docs/plugin-developer-guide/00.setup.md rename to src/content/docs/plugin-developer-guide/00.setup.md index 8e02b120193..0da6ea64533 100644 --- a/content/docs/plugin-developer-guide/00.setup.md +++ b/src/content/docs/plugin-developer-guide/00.setup.md @@ -45,7 +45,7 @@ Here are the steps: Once you completed the steps above, you should see a similar directory structure: - + As you can see, there is one generated plugin: the `Example` class representing the `Example` plugin (a task). diff --git a/content/docs/plugin-developer-guide/01.gradle.md b/src/content/docs/plugin-developer-guide/01.gradle.md similarity index 100% rename from content/docs/plugin-developer-guide/01.gradle.md rename to src/content/docs/plugin-developer-guide/01.gradle.md diff --git a/content/docs/plugin-developer-guide/02.task.md b/src/content/docs/plugin-developer-guide/02.task.md similarity index 100% rename from content/docs/plugin-developer-guide/02.task.md rename to src/content/docs/plugin-developer-guide/02.task.md diff --git a/content/docs/plugin-developer-guide/03.trigger.md b/src/content/docs/plugin-developer-guide/03.trigger.md similarity index 100% rename from content/docs/plugin-developer-guide/03.trigger.md rename to src/content/docs/plugin-developer-guide/03.trigger.md diff --git a/content/docs/plugin-developer-guide/04.condition.md b/src/content/docs/plugin-developer-guide/04.condition.md similarity index 100% rename from content/docs/plugin-developer-guide/04.condition.md rename to src/content/docs/plugin-developer-guide/04.condition.md diff --git a/content/docs/plugin-developer-guide/05.unit-tests.md b/src/content/docs/plugin-developer-guide/05.unit-tests.md similarity index 100% rename from content/docs/plugin-developer-guide/05.unit-tests.md rename to src/content/docs/plugin-developer-guide/05.unit-tests.md diff --git a/content/docs/plugin-developer-guide/06.document.md b/src/content/docs/plugin-developer-guide/06.document.md similarity index 100% rename from content/docs/plugin-developer-guide/06.document.md rename to src/content/docs/plugin-developer-guide/06.document.md diff --git a/content/docs/plugin-developer-guide/07.publish.md b/src/content/docs/plugin-developer-guide/07.publish.md similarity index 100% rename from content/docs/plugin-developer-guide/07.publish.md rename to src/content/docs/plugin-developer-guide/07.publish.md diff --git a/content/docs/plugin-developer-guide/index.md b/src/content/docs/plugin-developer-guide/index.md similarity index 100% rename from content/docs/plugin-developer-guide/index.md rename to src/content/docs/plugin-developer-guide/index.md diff --git a/content/docs/server-cli/index.md b/src/content/docs/server-cli/index.md similarity index 100% rename from content/docs/server-cli/index.md rename to src/content/docs/server-cli/index.md diff --git a/content/docs/task-runners/01.overview.md b/src/content/docs/task-runners/01.overview.md similarity index 100% rename from content/docs/task-runners/01.overview.md rename to src/content/docs/task-runners/01.overview.md diff --git a/content/docs/task-runners/02.benefits.md b/src/content/docs/task-runners/02.benefits.md similarity index 98% rename from content/docs/task-runners/02.benefits.md rename to src/content/docs/task-runners/02.benefits.md index a907b9c1104..b83f8322c78 100644 --- a/content/docs/task-runners/02.benefits.md +++ b/src/content/docs/task-runners/02.benefits.md @@ -68,7 +68,7 @@ pluginDefaults: Each task runner is a plugin with its own icon, documentation, and schema to validate its properties. The built-in code editor in the Kestra UI provides autocompletion and syntax validation for all runner properties, and when you click on the runner's name in the editor, you can see its documentation on the right side of the screen. - + ## Full customization: create your own Task Runner diff --git a/content/docs/task-runners/03.task-runners-vs-worker-groups.md b/src/content/docs/task-runners/03.task-runners-vs-worker-groups.md similarity index 99% rename from content/docs/task-runners/03.task-runners-vs-worker-groups.md rename to src/content/docs/task-runners/03.task-runners-vs-worker-groups.md index fc7a5aed2b6..78ab59e6919 100644 --- a/content/docs/task-runners/03.task-runners-vs-worker-groups.md +++ b/src/content/docs/task-runners/03.task-runners-vs-worker-groups.md @@ -78,7 +78,7 @@ tasks: A default worker group can also be configured at the namespace level so that all tasks and polling triggers in that namespace are executed on workers in that worker group by default. - + ### Task Runners Usage diff --git a/content/docs/task-runners/04.types/01.process-task-runner.md b/src/content/docs/task-runners/04.types/01.process-task-runner.md similarity index 100% rename from content/docs/task-runners/04.types/01.process-task-runner.md rename to src/content/docs/task-runners/04.types/01.process-task-runner.md diff --git a/content/docs/task-runners/04.types/02.docker-task-runner.md b/src/content/docs/task-runners/04.types/02.docker-task-runner.md similarity index 98% rename from content/docs/task-runners/04.types/02.docker-task-runner.md rename to src/content/docs/task-runners/04.types/02.docker-task-runner.md index c98f4089c92..f50a4a4538f 100644 --- a/content/docs/task-runners/04.types/02.docker-task-runner.md +++ b/src/content/docs/task-runners/04.types/02.docker-task-runner.md @@ -33,7 +33,7 @@ tasks: Once you specify the `taskRunner` type, you get the autocompletion and validation for the runner-specific properties. In the example above, the task allocates 1 CPU to the container. - + ## Docker task runner properties diff --git a/content/docs/task-runners/04.types/03.kubernetes-task-runner.md b/src/content/docs/task-runners/04.types/03.kubernetes-task-runner.md similarity index 100% rename from content/docs/task-runners/04.types/03.kubernetes-task-runner.md rename to src/content/docs/task-runners/04.types/03.kubernetes-task-runner.md diff --git a/content/docs/task-runners/04.types/04.aws-batch-task-runner.md b/src/content/docs/task-runners/04.types/04.aws-batch-task-runner.md similarity index 90% rename from content/docs/task-runners/04.types/04.aws-batch-task-runner.md rename to src/content/docs/task-runners/04.types/04.aws-batch-task-runner.md index 45d5acc196e..eea49b5cf3c 100644 --- a/content/docs/task-runners/04.types/04.aws-batch-task-runner.md +++ b/src/content/docs/task-runners/04.types/04.aws-batch-task-runner.md @@ -148,16 +148,16 @@ To use AWS Batch, we need an Execution Role that will allow AWS Batch to create ] } ``` -  +  5. Click on **Next** and add the `AmazonECSTaskExecutionRolePolicy`. 6. Then, for **Role Name**, enter `ecsTaskExecutionRole` 7. Finally, click on **Create role**. - + Make sure to copy the ARN of the role. You will need it later. - + #### Create the `ecsTaskRole` IAM role @@ -185,11 +185,11 @@ First, we'll need to create a policy the role can use for accessing S3. ] } ``` -  +  4. Select **Next** and type in a name for the policy, such as `ecsTaskRoleS3Policy`. 5. Once you're done, select **Create policy**. - + Now we're ready to make our role. This is very similar to the previous role, but we need to add our new policy too: @@ -215,7 +215,7 @@ Now we're ready to make our role. This is very similar to the previous role, but ``` 5. Click on **Next** 6. Search for the new policy and check the box on the left. Once you've done this, select **Next**. -  +  7. Then, for **Role Name**, enter `ecsTaskRole` 6. Finally, click on **Create role**. @@ -223,15 +223,15 @@ Now we're ready to make our role. This is very similar to the previous role, but Go to the AWS Batch console. - + Then, click on "Get Started". If you don't see the "Get Started" button, add `#firstRun` to the URL: - + This will launch a Wizard that will guide you through the process of creating a new compute environment. - + You should see the following text recommending the use of Fargate: @@ -247,53 +247,53 @@ Select Fargate and click on Next. Add a name for your compute environment — here, we chose `kestra`. You can keep the default settings for everything. Select the VPC and subnets you want to use — you can use the default VPC and subnets and the default VPC security group. Then, click on Next. - + #### Step 3: Create a job queue Now we can create a job queue. Here, we also name it `kestra`. You can keep the default settings. Then, click on Next: - + #### Step 4: Create a job definition Finally, create a job definition. Here, we name it also `kestra`. Under Execution role, select the role we created earlier (`ecsTaskExecutionRole`). Besides that, you can keep default settings for everything else (we adjusted the image to ``ghcr.io/kestra-io/pydata:latest`` but that's totally optional). Then, click on Next: - + #### Step 5: Create a job Finally, create a job. Here, we name it `kestra`. Then, click on Next for a final review: - + #### Step 6: Review and create Review your settings and click on Create resources: - + Once you see this message, you are all set: - + #### Copy and apply the ARN to your Kestra configuration Copy the ARN of the compute environment and job queue. You will need to add these to your Kestra configuration. - + - + ### Create an S3 Bucket Last thing we'll need is an S3 storage bucket. To do this, select S3 from Services then select **Create bucket**. - + Next you'll need to add a name and leave everything else as a default value. - + Scroll to the bottom and select **Create bucket**. @@ -354,4 +354,4 @@ tasks: When we execute this task, we can see the environment information inside of the logs generated by the Python script: - + diff --git a/content/docs/task-runners/04.types/05.azure-batch-task-runner.md b/src/content/docs/task-runners/04.types/05.azure-batch-task-runner.md similarity index 89% rename from content/docs/task-runners/04.types/05.azure-batch-task-runner.md rename to src/content/docs/task-runners/04.types/05.azure-batch-task-runner.md index 4bf63c62ff2..a4aedefe8ef 100644 --- a/content/docs/task-runners/04.types/05.azure-batch-task-runner.md +++ b/src/content/docs/task-runners/04.types/05.azure-batch-task-runner.md @@ -105,25 +105,25 @@ Before you start, you need to have the following: Once you're logged into your Azure account, search for "Batch accounts" and select the first option under **Services**. - + Now on that page, select **Create** to make a new account. - + Select the appropriate resource group as well as fill in the Account name and Location fields. Afterwards, click on **Select a storage account**. - + If you do not have an existing storage account, press **Create new** and type a name in, e.g. "mybatchstorage". Leave the other settings as the default options and select *OK*. - + - + Now we have all the correct details filled, we can now press **Review + create** and then **Create** on the next page to create our new Batch account. - + Once the account has been created, you'll receive a **Deployment succeeded** message appear. Select **Go to resource to go to the account. @@ -133,22 +133,22 @@ Now we have a Batch account, we can create a pool of compute notes in our Batch On the Batch account page, select **Pools** in the left navigation menu, then select **Add** at the top of the Pools page. - + On the **Add pool** page, enter a Pool ID. - + Under **Operating System**: - Select the **Publisher** as `microsoft-azure-batch` - Select the **Offer** as `ubuntu-server-container` - Select the **Sku** as `20-04-lts` - + Scroll down to **Node size** and select **Standard_A1_v2** which is 1 vCPUs and 2 GB Memory. Also enter 2 for **Target dedicated nodes**. - + Once you've done that, you can now select **OK** at the bottom to create the pool. @@ -164,11 +164,11 @@ Inside of our Batch account, go to **Settings** and then **Keys**. Generate a ne Search for Storage account and select our recently made account. Inside of here, go to the **Data storage** menu and select **Containers**. Now select **+ Container** to make a new container. - + Type in a name for the container and select **Create**. - + Now that we've created our batch account, storage account, pool and container, we can now create our flow inside of Kestra. @@ -252,14 +252,14 @@ tasks: When we press execute, we can see that our task runner is created in the Logs. - + We can also go to the Azure Portal to see our task runner has been created: - + Once the task has completed, it will automatically close down the runner on Azure. We can also view the outputs generated in the Outputs tab in Kestra, which contains information about the Azure Batch task runner generated from our Python script: - + diff --git a/content/docs/task-runners/04.types/06.google-batch-task-runner.md b/src/content/docs/task-runners/04.types/06.google-batch-task-runner.md similarity index 91% rename from content/docs/task-runners/04.types/06.google-batch-task-runner.md rename to src/content/docs/task-runners/04.types/06.google-batch-task-runner.md index f9462947b67..d25d1a887c4 100644 --- a/content/docs/task-runners/04.types/06.google-batch-task-runner.md +++ b/src/content/docs/task-runners/04.types/06.google-batch-task-runner.md @@ -107,17 +107,17 @@ Before you start, you need to have the following: If you don't already have a project, create one with a name of your choice. - + Once you've done this, make sure your project is selected in the menu bar. - + #### Enable Batch API Inside of the Cloud Console, you'll need to go to APIs and search for Batch API. Once you've got to it, you'll need to enable it so that Kestra can create Batch Jobs. - + After you've enabled it, you'll be prompted to make credentials for it so you can integrate it with your application. @@ -125,24 +125,24 @@ After you've enabled it, you'll be prompted to make credentials for it so you ca Now that the Batch API is enabled, we can proceed with creating credentials so we can access GCP directly inside of Kestra. Following the prompt after enabling the Batch API, we will be asked to select the type of data we will be using. In this case, it's `Application data` which will create a Service Account for us to use. - + After you've selected this, you'll need to give a name to your service account. Name it something memorable, as we'll need to type this into Kestra later. - + Once you've given it a name, make sure to select the following roles: - Batch Job Editor - Logs Viewer - Storage Object Admin - + Afterwards, we will need to make credentials for our service account so we can add these into Kestra. To do so, select our service account and select **Keys** then **Add Key**. Make sure to select JSON as the Key type so we can either add it as a secret or directly into our flow. - + Check out [this guide](../../15.how-to-guides/google-credentials.md) on how to add your service account into Kestra as a secret. @@ -150,13 +150,13 @@ We'll also need to make sure our service account can access the Compute Engine d To do this, we can go to **IAM & Admin**, then **Service Accounts**. On this page, we can select the compute engine service account, select **Permissions** and then **Grant Access**. On this page, we want to add our original Service account as a Service Account User role. Once we've done this, we can select **Save**. - + #### Create Bucket Head to the search bar and type "Bucket" to find GCS Bucket. Now create a new bucket! You'll be prompted to set a name, region and various other permissions. For now, we can leave these all to default. - + ### Creating our Flow @@ -234,14 +234,14 @@ tasks: When we press execute, we can see that our task runner is created in the Logs. - + We can also go to the GCP Console and see our task runner has been created: - + Once the task has completed, it will automatically close down the runner on Google Cloud. We can also view the outputs generated in the Outputs tab in Kestra, which contains information about the Google Batch task runner generated from our Python script: - + diff --git a/content/docs/task-runners/04.types/07.google-cloudrun-task-runner.md b/src/content/docs/task-runners/04.types/07.google-cloudrun-task-runner.md similarity index 92% rename from content/docs/task-runners/04.types/07.google-cloudrun-task-runner.md rename to src/content/docs/task-runners/04.types/07.google-cloudrun-task-runner.md index 6554260b94c..f6b70c3e79f 100644 --- a/content/docs/task-runners/04.types/07.google-cloudrun-task-runner.md +++ b/src/content/docs/task-runners/04.types/07.google-cloudrun-task-runner.md @@ -106,17 +106,17 @@ Before you start, you need to have the following: If you don't already have a project, create one with a name of your choice. - + Once you've done this, make sure your project is selected in the menu bar. - + #### Enable Cloud Run Admin API In the search bar, search and select **APIs & Services**. Then select **Enable APIs and Services** and search for **Cloud Run Admin API**. When you select this, select the **Enable** button. - + #### Create the Service Account @@ -127,14 +127,14 @@ In the search bar, search and select **Service Accounts**. Now select **Create S After you've selected this, you'll need to give a name to your service account. Name it something memorable, as we'll need to type this into Kestra later. - + Once you've given it a name, make sure to select the following roles: - Cloud Run Developer - Logs Viewer - Storage Admin (to upload files to GCS and download files from GCS) - + Check out [this guide](../../15.how-to-guides/google-credentials.md) on how to add your service account into Kestra as a secret. @@ -142,13 +142,13 @@ We'll also need to make sure our service account can access the Compute Engine d To do this, we can go to **IAM & Admin**, then **Service Accounts**. On this page, we can select the compute engine service account, select **Permissions** and then **Grant Access**. On this page, we want to add our original Service account as a Service Account User role. Once we've done this, we can select **Save**. - + #### Create Bucket Head to the search bar and type "Bucket" to find GCS Bucket. Now create a new bucket! You'll be prompted to set a name, region and various other permissions. For now, we can leave these all to default. - + ### Creating our Flow @@ -200,10 +200,10 @@ tasks: When we press execute, we can see that our task runner is created in the Logs. - + We can also go to the GCP Console and see our task runner has been created: - + Once the task has completed, it will automatically close down the VM on Google Cloud. diff --git a/content/docs/task-runners/04.types/index.md b/src/content/docs/task-runners/04.types/index.md similarity index 100% rename from content/docs/task-runners/04.types/index.md rename to src/content/docs/task-runners/04.types/index.md diff --git a/content/docs/task-runners/index.md b/src/content/docs/task-runners/index.md similarity index 100% rename from content/docs/task-runners/index.md rename to src/content/docs/task-runners/index.md diff --git a/content/docs/use-cases/01.data-pipelines.md b/src/content/docs/use-cases/01.data-pipelines.md similarity index 100% rename from content/docs/use-cases/01.data-pipelines.md rename to src/content/docs/use-cases/01.data-pipelines.md diff --git a/content/docs/use-cases/02.dbt.md b/src/content/docs/use-cases/02.dbt.md similarity index 98% rename from content/docs/use-cases/02.dbt.md rename to src/content/docs/use-cases/02.dbt.md index caca8d25a49..36d70149f73 100644 --- a/content/docs/use-cases/02.dbt.md +++ b/src/content/docs/use-cases/02.dbt.md @@ -114,7 +114,7 @@ You can use the above flow as an initial setup: 3. Execute that flow 4. Click on the `Files` sidebar in the code editor to view the uploaded dbt files. - + You can then set `disabled: true` within the first task after the first execution to avoid re-syncing the project. This allows you to iterate on the models without cloning the repository every time. @@ -170,7 +170,7 @@ from {{ ref('my_first_dbt_model') }} where id = 2 ``` - + When you now run the flow using the second dropdown value for the `dbt_command` input, only the new model will be built. This allows you to test the changes quickly and iterate faster. @@ -221,7 +221,7 @@ Clone dbt projects from any Git provider: Kestra automatically parses the `manifest.json` file within the Execution Gantt chart to provide visibility into each dbt model's built status, their duration and logs. You can browse all logs in one place (without having to manually navigate to each dbt model) and you can easily jump to the next `INFO`/`WARN`/`ERROR` log thanks to the best-in-class log navigation feature. - + ### Manifest Tracking diff --git a/content/docs/use-cases/03.microservices.md b/src/content/docs/use-cases/03.microservices.md similarity index 100% rename from content/docs/use-cases/03.microservices.md rename to src/content/docs/use-cases/03.microservices.md diff --git a/content/docs/use-cases/04.infrastructure.md b/src/content/docs/use-cases/04.infrastructure.md similarity index 100% rename from content/docs/use-cases/04.infrastructure.md rename to src/content/docs/use-cases/04.infrastructure.md diff --git a/content/docs/use-cases/05.approval-processes.md b/src/content/docs/use-cases/05.approval-processes.md similarity index 99% rename from content/docs/use-cases/05.approval-processes.md rename to src/content/docs/use-cases/05.approval-processes.md index e0eac37266b..f5361425913 100644 --- a/content/docs/use-cases/05.approval-processes.md +++ b/src/content/docs/use-cases/05.approval-processes.md @@ -108,7 +108,7 @@ Add approval steps with structured inputs to any workflow: ### Bulk Actions Approve multiple paused workflows simultaneously: - + ### Audit Trails diff --git a/content/docs/use-cases/06.python-workflows.md b/src/content/docs/use-cases/06.python-workflows.md similarity index 100% rename from content/docs/use-cases/06.python-workflows.md rename to src/content/docs/use-cases/06.python-workflows.md diff --git a/content/docs/use-cases/index.md b/src/content/docs/use-cases/index.md similarity index 100% rename from content/docs/use-cases/index.md rename to src/content/docs/use-cases/index.md diff --git a/src/content/docs/use-cases/index.mdx b/src/content/docs/use-cases/index.mdx new file mode 100644 index 00000000000..81c365e7e7d --- /dev/null +++ b/src/content/docs/use-cases/index.mdx @@ -0,0 +1,8 @@ +--- +title: Use Cases +--- +import BigChildCards from '../../../src/components/docs/BigChildCards.astro'; + +Get to know the main use cases covered by Kestra. + + \ No newline at end of file diff --git a/content/docs/version-control-cicd/04.git.md b/src/content/docs/version-control-cicd/04.git.md similarity index 98% rename from content/docs/version-control-cicd/04.git.md rename to src/content/docs/version-control-cicd/04.git.md index c5bfbff0d7a..496ce882700 100644 --- a/content/docs/version-control-cicd/04.git.md +++ b/src/content/docs/version-control-cicd/04.git.md @@ -25,7 +25,7 @@ There are multiple ways to use Git with Kestra: The image below shows how to choose the right pattern based on your needs: - + Let's dive into each of these patterns and when to use them. @@ -113,7 +113,7 @@ Note that the webhook key is used to authenticate webhook requests and prevent u http://your_kestra_host:8080/api/v1/ /executions/webhook/prod/sync_from_git/your_secret_key ``` - + Following the pattern: diff --git a/content/docs/version-control-cicd/cicd/01.github-action.md b/src/content/docs/version-control-cicd/cicd/01.github-action.md similarity index 100% rename from content/docs/version-control-cicd/cicd/01.github-action.md rename to src/content/docs/version-control-cicd/cicd/01.github-action.md diff --git a/content/docs/version-control-cicd/cicd/02.gitlab.md b/src/content/docs/version-control-cicd/cicd/02.gitlab.md similarity index 100% rename from content/docs/version-control-cicd/cicd/02.gitlab.md rename to src/content/docs/version-control-cicd/cicd/02.gitlab.md diff --git a/content/docs/version-control-cicd/cicd/03.terraform.md b/src/content/docs/version-control-cicd/cicd/03.terraform.md similarity index 100% rename from content/docs/version-control-cicd/cicd/03.terraform.md rename to src/content/docs/version-control-cicd/cicd/03.terraform.md diff --git a/content/docs/version-control-cicd/cicd/04.helpers.md b/src/content/docs/version-control-cicd/cicd/04.helpers.md similarity index 100% rename from content/docs/version-control-cicd/cicd/04.helpers.md rename to src/content/docs/version-control-cicd/cicd/04.helpers.md diff --git a/content/docs/version-control-cicd/cicd/05-azure-devops.md b/src/content/docs/version-control-cicd/cicd/05-azure-devops.md similarity index 87% rename from content/docs/version-control-cicd/cicd/05-azure-devops.md rename to src/content/docs/version-control-cicd/cicd/05-azure-devops.md index 7c7223ddd5c..1c61bd313c7 100644 --- a/content/docs/version-control-cicd/cicd/05-azure-devops.md +++ b/src/content/docs/version-control-cicd/cicd/05-azure-devops.md @@ -9,7 +9,7 @@ How to use Azure DevOps to create a CI/CD pipeline for your Kestra flows. 1. To create an Azure Devops Pipeline, first connect to your code repository. You can choose from several providers such as GitHub, Azure Repos Git or Bitbucket. - + 2. Then, choose the repository where your Kestra flows are located. @@ -17,7 +17,7 @@ How to use Azure DevOps to create a CI/CD pipeline for your Kestra flows. 3. Start with a minimal pipeline template or use an existing one. - + 4. Consider the following pipeline: @@ -67,7 +67,7 @@ stages: - Use the Terraform extension to install, validate, and apply Terraform resources. You can install the Terraform extension task by navigating to the Organization Settings > Extensions and then browse the marketplace to install the Terraform extension. - + The first task is to use the `TerraformInstaller@1` to install Terraform when the pipeline runs. Then, we use the `TerraformTaskV4@4`` three times: @@ -78,6 +78,6 @@ The first task is to use the `TerraformInstaller@1` to install Terraform when th 3. run the `apply`` command to execute the actions proposed in the Terraform plan - + You can find the specification of the [Kestra Terraform provider in the corresponding documentation](../../13.terraform/index.md) \ No newline at end of file diff --git a/content/docs/version-control-cicd/cicd/06.bitbucket-pipes.md b/src/content/docs/version-control-cicd/cicd/06.bitbucket-pipes.md similarity index 94% rename from content/docs/version-control-cicd/cicd/06.bitbucket-pipes.md rename to src/content/docs/version-control-cicd/cicd/06.bitbucket-pipes.md index ba470fd2203..b5929de91f9 100644 --- a/content/docs/version-control-cicd/cicd/06.bitbucket-pipes.md +++ b/src/content/docs/version-control-cicd/cicd/06.bitbucket-pipes.md @@ -36,7 +36,7 @@ pipelines: Variables such as `$SERVER`, `$KESTRA_USER`, `$KESTRA_PASSWORD` (and optionally `$TENANT` if you're using a Kestra version supporting multi-tenancy) are set in the BitBucket Variable configuration: - + :::alert{type="info"} Note that if you're using Kestra Enterprise Edition, instead of ``--user $KESTRA_USER:$KESTRA_PASSWORD``, you can use the `--api-token` option to authenticate using an API token of a Service Account. diff --git a/content/docs/version-control-cicd/cicd/07.kubernetes-operator.md b/src/content/docs/version-control-cicd/cicd/07.kubernetes-operator.md similarity index 100% rename from content/docs/version-control-cicd/cicd/07.kubernetes-operator.md rename to src/content/docs/version-control-cicd/cicd/07.kubernetes-operator.md diff --git a/content/docs/version-control-cicd/cicd/index.md b/src/content/docs/version-control-cicd/cicd/index.md similarity index 98% rename from content/docs/version-control-cicd/cicd/index.md rename to src/content/docs/version-control-cicd/cicd/index.md index 5d9843357a4..ba405ab1eb9 100644 --- a/content/docs/version-control-cicd/cicd/index.md +++ b/src/content/docs/version-control-cicd/cicd/index.md @@ -135,7 +135,7 @@ https://github.com/your_username/your_repository_name/settings/hooks Select "Add webhook": - + Paste Kestra's webhook URL into the *Payload URL* field, as shown below. The webhook to trigger a Kestra flow should be in the following format: @@ -143,7 +143,7 @@ Paste Kestra's webhook URL into the *Payload URL* field, as shown below. The web https://kestra_host_url/api/v1/main/executions/webhook/namespace/flow_id/webhook_key ``` - + Note that we configured this webhook to be sent upon a push event to the default branch, but you can choose the option "Let me select individual events" for further customization e.g. to trigger the flow any time there is a new pull request. diff --git a/content/docs/version-control-cicd/index.md b/src/content/docs/version-control-cicd/index.md similarity index 100% rename from content/docs/version-control-cicd/index.md rename to src/content/docs/version-control-cicd/index.md diff --git a/content/docs/why-kestra.md b/src/content/docs/why-kestra.md similarity index 100% rename from content/docs/why-kestra.md rename to src/content/docs/why-kestra.md diff --git a/content/enterprise-license-agreement.md b/src/content/enterprise-license-agreement.md similarity index 100% rename from content/enterprise-license-agreement.md rename to src/content/enterprise-license-agreement.md diff --git a/content/kestra-cloud-tos.md b/src/content/kestra-cloud-tos.md similarity index 100% rename from content/kestra-cloud-tos.md rename to src/content/kestra-cloud-tos.md diff --git a/content/privacy-policy.md b/src/content/privacy-policy.md similarity index 100% rename from content/privacy-policy.md rename to src/content/privacy-policy.md diff --git a/src/loaders/plugins.ts b/src/loaders/plugins.ts new file mode 100644 index 00000000000..b2b0636f72e --- /dev/null +++ b/src/loaders/plugins.ts @@ -0,0 +1,33 @@ +import type { Loader } from "astro/loaders"; +import { $fetch } from "../utils/fetch"; +import type { Plugin } from "@kestra-io/ui-libs"; +import { z } from "astro:content"; + +export default { + name: "plugins", + async load({ store }){ + const plugins = await $fetch ("https://api.kestra.io/v1/plugins/subgroups") + store.clear() + for(const plugin of plugins) { + const id = plugin.subGroup ?? plugin.group + store.set({ + id, + data: plugin, + }) + } + }, + schema: z.object({ + name: z.string(), + title: z.string(), + group: z.string(), + longDescription: z.string().optional(), + description: z.string().optional(), + subGroup: z.string().optional(), + tooltipContent: z.string().optional(), + categories: z.array(z.string()).optional(), + controllers: z.array(z.string()).optional(), + storages: z.array(z.string()).optional(), + aliases: z.array(z.string()).optional(), + guides: z.array(z.string()).optional(), + }) +} satisfies Loader \ No newline at end of file diff --git a/src/pages/docs/[...docsPath].astro b/src/pages/docs/[...docsPath].astro new file mode 100644 index 00000000000..1199896c78b --- /dev/null +++ b/src/pages/docs/[...docsPath].astro @@ -0,0 +1,27 @@ +--- +// do not prerender dynamic docs pages +export const prerender = false + +// use astro content collection to fetch markdown files from /content/docs +import { + render, + getEntry, +} from "astro:content"; + +import LayoutDocs from "../../components/layout-docs.astro"; + +const doc = Astro.params.docsPath + ? await getEntry('docs', Astro.params.docsPath) + : null; +if (!doc) { + throw new Error(`Document not found: ${Astro.params.docsPath}`); +} +const { Content } = await render(doc); +--- + + + \ No newline at end of file diff --git a/src/pages/docs/index.astro b/src/pages/docs/index.astro new file mode 100644 index 00000000000..d21bdebcedc --- /dev/null +++ b/src/pages/docs/index.astro @@ -0,0 +1,17 @@ +--- +import LayoutDocs from "../../components/layout-docs.astro"; +import { getEntry, render } from "astro:content"; +const doc = await getEntry('docs', '{doc.data?.title}
++++ '); +if (!doc) { + throw new Error('Index document not found'); +} + +const { Content } = await render(doc); +--- + + + \ No newline at end of file diff --git a/src/pages/icons/[cls].svg.ts b/src/pages/icons/[cls].svg.ts new file mode 100644 index 00000000000..27a1a6fd664 --- /dev/null +++ b/src/pages/icons/[cls].svg.ts @@ -0,0 +1,45 @@ +import { isEntryAPluginElementPredicate } from "@kestra-io/ui-libs"; +import { $fetch } from "../../utils/fetch"; +import { getListOfPlugins } from "../../utils/plugins/getListOfPlugins"; + +export async function GET({ params }: { params: { cls: string } }) { + const cls = params.cls; + const response = await fetch(`https://api.kestra.io/v1/plugins/icons/${cls}`); + + if (!response.ok) { + throw new Error('Failed to fetch icon'); + } + + const svg = await response.text(); + const modifiedSvg = svg.replace(/currentColor/g, "#CAC5DA"); + + return new Response(modifiedSvg, { + headers: { + 'Content-Type': 'image/svg+xml', + 'Cache-Control': 'max-age=86400', + }, + }); +} + +function resolveSubPlugins(plugins: any[], allPluginsCls: Set{doc.data?.title}
++++ ) { + for (const plugin of plugins || []) { + const entries = Object.entries(plugin).filter(([key, value]) => isEntryAPluginElementPredicate(key, value)) as [string, any][]; + for (const [key, sectionEntries] of entries) { + if (sectionEntries) { + for (const {cls} of sectionEntries.filter(({deprecated}: {deprecated: boolean}) => !deprecated)) { + if(cls){ + allPluginsCls.add(cls); + } + } + } + } + } +} + +export async function getStaticPaths() { + const plugins = await $fetch(`https://api.kestra.io/v1/plugins/subgroups`); + + const allPluginsCls = new Set(getListOfPlugins(plugins).map(p => p.subGroup ?? p.group).filter((cls?: string) => cls !== undefined) as string[]); + resolveSubPlugins(plugins, allPluginsCls); + return Array.from(allPluginsCls).map(cls => ({ params: { cls } })); +} \ No newline at end of file diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 00000000000..7a39e57fd12 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,62 @@ +--- +import Layout from "../components/layout.astro"; +import Header from "../../components/home/Header.vue"; +import LogosTable from "../../components/home/LogosTable.vue"; +import OpenSource from "../../components/home/OpenSource.vue"; +import OpenSourceQuotes from "../../components/home/OpenSourceQuotes.vue"; +import { $fetch } from "../utils/fetch"; +import Features from "../../components/home/Features.vue"; +import EveryDev from "../../components/home/EveryDev.vue"; +import Experience from "../../components/home/Experience.vue"; +import PluginsRender from "../../components/home/PluginsRender.vue"; +import BlueprintsRender from "../../components/home/BlueprintsRender.vue"; +import { calculateTotalPlugins } from "../../composables/usePluginsCount"; +import Enterprise from "../../components/home/Enterprise.vue"; +import EnterpriseQuotesRender from "../../components/home/EnterpriseQuotesRender.vue"; +import CTA from "../../components/home/CTA.vue"; + +const logosNonRandomized = import.meta.glob('../../public/landing/home/trusted-companies/*.{svg,png}'); +const logos = await Promise.all(Object.entries(logosNonRandomized).map(([filePath, mod]) => { + return mod().then((img: any) => { + return { + name: filePath.split('/').pop()?.split('.').shift(), + url: img.default.src, + } + }) +})).then((imgs: any) => imgs.toSorted(() => 0.5 - Math.random())); + +const githubData = await $fetch('https://api.github.com/repos/flowiseai/Flowise', { + headers: { + 'Accept': 'application/vnd.github.v3+json' + } +}); +const quotes = await import('../../data/oss-quotes.json').then((qs) => qs.default.sort(() => Math.random() - 0.5)) + +const pluginLogos = await import.meta.glob('/public/landing/home/plugins/*.svg', {eager: true}) as Record +const pluginsSorted = Object.entries(pluginLogos).map(([name, logo]) => ({ name: name.split('/').pop()?.split('.').shift() ?? "", logo: logo.default.src as string })).sort(() => 0.5 - Math.random()).slice(0, 20); + +const plugins = await fetch("https://api.kestra.io/v1/plugins/subgroups") + .then(r => { + return r.json() + }) +const totalPlugins = calculateTotalPlugins(plugins); + +const blueprints = await $fetch<{results: any[]}>("https://api.kestra.io/v1/blueprints/versions/latest?page=1&size=20") +const stories = await $fetch<{results: any[]}>("https://api.kestra.io/v1/customer-stories-v2?featured=true") +const enterpriseQuotes = await import('../../data/enterprise-quotes.json').then((qs) => qs.default.sort(() => Math.random() - 0.5)) +--- + + + \ No newline at end of file diff --git a/src/pages/plugins/[...slug].astro b/src/pages/plugins/[...slug].astro new file mode 100644 index 00000000000..183cf52057d --- /dev/null +++ b/src/pages/plugins/[...slug].astro @@ -0,0 +1,288 @@ +--- +// do not prerender dynamic blogs pages +export const prerender = false; + +import { slugify, subGroupName, type Plugin } from "@kestra-io/ui-libs"; +import { getCollection } from "astro:content"; +import Layout from "../../components/layout.astro"; +import NavSideBar from "../../../components/docs/NavSideBar.vue"; +import Breadcrumb from "../../../components/layout/Breadcrumb.vue"; +import NavToc from "../../../components/docs/NavToc.vue"; +import { generateNavigationFromSubgroups } from "../../utils/plugins/generateNavigation"; +import PluginsMDCRender from "../../../components/plugins/PluginsMDCRender.vue"; +import { generatePageNames, recursivePages } from "../../../utils/navigation"; +import { nuxtBlocksFromJsonSchema, nuxtBlocksFromSubGroupsWrappers } from "../../utils/plugins/nuxtBlocks"; +import { getIcon } from "../../utils/plugins/getPluginIcon"; +import { $fetch } from "../../utils/fetch"; +import { getPluginsWithoutDeprecated } from "../../utils/plugins/getListOfPlugins"; + +const pluginsData = await getCollection('plugins'); +const navigation = generateNavigationFromSubgroups(pluginsData.map(p => p.data as any)); +const pageNames = generatePageNames(navigation[0]) +const pageList = recursivePages(navigation[0]) + +const params = Astro.params as { slug: string }; + +const nonProps = { + slug: params.slug, + navigation, + pageNames, + pageList + } + + +const splitRouteSlug = params.slug.split("/"); + +const lowerCasePluginType = splitRouteSlug[splitRouteSlug.length - 1].includes(".") ? splitRouteSlug[splitRouteSlug?.length - 1].replace(/.md$/, "") : undefined; +let pluginType: string | undefined = undefined; + +const pageName = nonProps.pageNames[nonProps.slug] ?? (lowerCasePluginType ? lowerCasePluginType.split(".").slice(-1)[0] : undefined); + +if (lowerCasePluginType !== undefined) { + let splitPluginType = lowerCasePluginType.split("."); + const packageName = splitPluginType.slice(0, splitPluginType.length - 1).join("."); + pluginType = `${packageName}.${nonProps.pageNames[params.slug] ?? splitPluginType[splitPluginType.length - 1]}`; +} + +const page = pluginType === undefined + ? nuxtBlocksFromSubGroupsWrappers(await $fetch(`https://api.kestra.io/v1/plugins/${splitRouteSlug[0]}/subgroups`)) + : nuxtBlocksFromJsonSchema((await $fetch(`https://api.kestra.io/v1/plugins/definitions/${pluginType}`)).schema); + +function getSubGroup(){ + const maybeSubGroup = splitRouteSlug?.[1]; + return maybeSubGroup?.includes(".") ? undefined : maybeSubGroup; +} + +const subGroup = getSubGroup(); + +const pluginsWithoutDeprecated = getPluginsWithoutDeprecated("plugins" in page.body ? page.body.plugins : []); + +const subGroupWrapper = subGroup === undefined || pluginType !== undefined ? undefined : pluginsWithoutDeprecated.find(p => slugify(subGroupName(p)) === subGroup); + +const {pageIcon, icons} = await getIcon(splitRouteSlug?.[0], pluginType, "group" in page.body ? page.body.group : undefined, subGroupWrapper?.subGroup); + +const transformTitle = (text: string) => { + return text + .replace(/([A-Z])/g, '$1') + .replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g, ''); +} +--- + ++ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/pages/plugins/index.astro b/src/pages/plugins/index.astro new file mode 100644 index 00000000000..00682811cc3 --- /dev/null +++ b/src/pages/plugins/index.astro @@ -0,0 +1,22 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../components/layout.astro"; +import PluginsLists from "../../../components/plugins/PluginsLists.vue"; +import LayoutFooterContact from "../../../components/layout/FooterContact.vue"; +import type { Plugin } from "@kestra-io/ui-libs"; + +const pluginsData = (await getCollection('plugins')) as unknown as {data: Plugin}[] + +const categoriesRes = await fetch(`https://api.kestra.io/v1/plugins/categories`); +const categoriesData = await categoriesRes.json(); +--- ++++ + ++++ + {pageIcon &&
+} + +
+ + {page && } + + \ No newline at end of file diff --git a/src/style/custom-elements.scss b/src/style/custom-elements.scss new file mode 100644 index 00000000000..b8d29d408b6 --- /dev/null +++ b/src/style/custom-elements.scss @@ -0,0 +1,31 @@ +.child-cards-wrapper{ + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1rem; + .child-card-link{ + background-color: #161617; + color: white; + display: grid; + grid-template-columns: 66px 1fr; + padding: 1rem; + border: 1px solid #252526; + .card-icon{ + grid-column: 1; + grid-row: 1 / 3; + background-color: transparent; + } + .card-title{ + grid-column: 2; + grid-row: 1; + font-size: 1.375rem !important; + line-height: 1.375rem !important; + height: 2.75rem; + } + .card-text{ + grid-column: 2; + grid-row: 2; + font-size: .875rem !important; + line-height: 1rem !important; + } + } +} \ No newline at end of file diff --git a/src/utils/fetch.ts b/src/utils/fetch.ts new file mode 100644 index 00000000000..349111b329e --- /dev/null +++ b/src/utils/fetch.ts @@ -0,0 +1,7 @@ +export async function $fetchp.data)} categories={categoriesData ?? []} client:idle /> + + (url: string, init: RequestInit = {}): Promise { + const response = await fetch(url, init); + if (!response.ok) { + throw new Error(`Failed to fetch ${url}: ${response.statusText}`); + } + return response.json(); +} \ No newline at end of file diff --git a/src/utils/getNavigationTree.ts b/src/utils/getNavigationTree.ts new file mode 100644 index 00000000000..04873c78390 --- /dev/null +++ b/src/utils/getNavigationTree.ts @@ -0,0 +1,83 @@ +import type { NavigationItem } from "../../components/docs/RecursiveNavSidebar.vue"; + +const navigationTree = { + "Get Started with Kestra": [ + "Getting Started", + "Tutorial", + "Architecture", + "Installation Guide", + "User Interface" + // "Video Tutorials" + ], + "Build with Kestra": [ + "Concepts", + "Workflow Components", + "Multi-Language Script Tasks", + "AI Tools", + "Version Control & CI/CD", + "Plugin Developer Guide", + "How-to Guides" + ], + "Scale with Kestra": [ + "Cloud & Enterprise Edition", + "Task Runners", + // "Worker Groups", + "Best Practices" + ], + "Manage Kestra": [ + "Administrator Guide", + "Migration Guide", + "Performance" + ], + "Reference Docs": [ + "Configuration", + "Expressions", + "API Reference", + "Terraform Provider", + "Server CLI", + "Kestra EE CLI" + ], +} + + +export function getNavigationTree(docsPages: { id: string, data: { title: string } }[]) { + // build the initial tree structure by finding each title in the navigationTree + // then build the navigation tree + const navigationTreeResult: NavigationItem[] = []; + for (const [section, titles] of Object.entries(navigationTree)) { + const sectionPage = docsPages.find(page => section === page.data.title); + const sectionNode: NavigationItem = { + title: section, + isSection: true, + path: sectionPage ? `/docs/${sectionPage.id}` : '#', + children: titles.map(title => { + const page = docsPages.find(page => title === page.data.title); + return page ? { + title: page.data.title, + path: `/docs/${page.id}`, + children: recursivelyBuildChildren(page.id, docsPages) + } : undefined; + }).filter((a) => a !== undefined) + }; + navigationTreeResult.push(sectionNode); + } + + return navigationTreeResult; +} + +function recursivelyBuildChildren(parentId: string, docsPages: { id: string, data: { title: string } }[]): NavigationItem[] | undefined { + const children = docsPages.filter(page => { + const parentPath = parentId.endsWith('/') ? parentId : parentId + '/'; + return page.id.startsWith(parentPath) && page.id !== parentId && !page.id.slice(parentPath.length).includes('/'); + }); + + if(children.length === 0) { + return undefined; + } + + return children.map(child => ({ + title: child.data.title, + path: `/docs/${child.id}`, + children: recursivelyBuildChildren(child.id, docsPages) + })); +} \ No newline at end of file diff --git a/src/utils/plugins/generateNavigation.ts b/src/utils/plugins/generateNavigation.ts new file mode 100644 index 00000000000..65021cebef5 --- /dev/null +++ b/src/utils/plugins/generateNavigation.ts @@ -0,0 +1,93 @@ +import type {Plugin, PluginElement} from "@kestra-io/ui-libs"; +import {isEntryAPluginElementPredicate, slugify, subGroupName} from "@kestra-io/ui-libs"; + +function toNavTitle(title: string) { + let startCaseTitle = title.charAt(0).toUpperCase() + title.slice(1); + if (title.match(/^[a-z]+[A-Z][a-z]/)) { + startCaseTitle = title.replace(/[A-Z][a-z]/, match => " " + match); + } + return startCaseTitle.split(".") + .map(string => string.charAt(0).toUpperCase() + string.slice(1)) + .join(""); +} + +function subGroupWrapperNav(subGroupWrapper: Plugin, parentUrl: string) { + return Object.entries(subGroupWrapper).filter(([key, value]) => isEntryAPluginElementPredicate(key, value)) + .map(([key, value]) => { + return ({ + title: toNavTitle(key), + isPage: false, + path: parentUrl + "#" + slugify(key), + children: (value as PluginElement[]).filter(({deprecated}) => !deprecated) + .map(item => ({ + title: item.cls.substring(item.cls.lastIndexOf('.') + 1), + path: `${parentUrl}/${slugify(item.cls)}` + })) + }); + }); +} + +export function generateNavigationFromSubgroups(pluginsSubGroups: Plugin[]) { + const subGroupsByGroup = pluginsSubGroups.reduce( + (result, subGroupWrapper) => { + const filteredElementsByTypeEntries = Object.entries(subGroupWrapper).filter(([key, value]) => isEntryAPluginElementPredicate(key, value)) + .map(([elementType, elements]) => [elementType, (elements as PluginElement[]).filter(({deprecated}) => !deprecated)]) + .filter(([, elements]) => elements.length > 0) + + if (filteredElementsByTypeEntries.length === 0) { + return result; + } + + subGroupWrapper = Object.fromEntries([ + ...Object.entries(subGroupWrapper).filter(([key, value]) => !isEntryAPluginElementPredicate(key, value)), + ...filteredElementsByTypeEntries + ]) + + if (!result[subGroupWrapper.group]) { + result[subGroupWrapper.group] = []; + } + result[subGroupWrapper.group].push(subGroupWrapper); + return result; + }, {} as Record ); + let sortedPluginsHierarchy = Object.entries(subGroupsByGroup).map(([_, subGroupsWrappers]) => { + let plugin = subGroupsWrappers.find(subGroupWrapper => subGroupWrapper.subGroup === undefined)!; + let rootPluginUrl = "/plugins/" + slugify(plugin.name); + let pluginChildren; + if (subGroupsWrappers.length > 1) { + pluginChildren = subGroupsWrappers.filter(subGroupWrapper => subGroupWrapper.subGroup !== undefined).map(subGroupWrapper => { + const subGroupUrl = `${rootPluginUrl}/${slugify(subGroupName(subGroupWrapper))}`; + return { + title: toNavTitle(subGroupWrapper.title), + path: subGroupUrl, + children: subGroupWrapperNav(subGroupWrapper, subGroupUrl) + } + }); + } + // There is no subgroups, we skip that part and directly put plugin elements below + else { + pluginChildren = subGroupWrapperNav(subGroupsWrappers[0], rootPluginUrl); + } + return { + title: toNavTitle(plugin.title), + path: rootPluginUrl, + children: pluginChildren + } + }).sort((a, b) => { + const nameA = a.title.toLowerCase(), + nameB = b.title.toLowerCase(); + + if (nameA === "core") { + return -1; + } + if (nameB === "core") { + return 1; + } + + return nameA === nameB ? 0 : nameA < nameB ? -1 : 1; + }); + return [{ + title: "Plugins", + path: "/plugins", + children: sortedPluginsHierarchy + }]; +} \ No newline at end of file diff --git a/src/utils/plugins/getListOfPlugins.ts b/src/utils/plugins/getListOfPlugins.ts new file mode 100644 index 00000000000..604cb50a208 --- /dev/null +++ b/src/utils/plugins/getListOfPlugins.ts @@ -0,0 +1,43 @@ +import {isEntryAPluginElementPredicate, type Plugin, type PluginElement} from "@kestra-io/ui-libs"; + +function isFullEntryAPluginElementPredicate(elementsArray :[elementType: string, elements: any]): elementsArray is [key: string, el:PluginElement[]] { + return isEntryAPluginElementPredicate(...elementsArray); +} + +export function getListOfPlugins(inputPlugins: Plugin[]): Plugin[] { + return inputPlugins.map(plugin => { + const filteredPluginElementsEntries = Object.entries(plugin) + .filter(isFullEntryAPluginElementPredicate) + .map(([elementType, elements]): [string, PluginElement[]] => [elementType, elements.filter(({deprecated}) => !deprecated)]) + .filter(([, elements]) => elements.length > 0) + + if (filteredPluginElementsEntries.length === 0) { + return undefined + } + + return { + ...plugin, + ...Object.fromEntries(filteredPluginElementsEntries) + } as Plugin + }).filter((plugin): plugin is Plugin => plugin !== undefined); +} + +export function getPluginsWithoutDeprecated(plugins: Plugin[]): PluginElement[] { + return plugins + .flatMap(p => { + let filteredElementsEntries = Object.entries(p).filter(([key, value]) => isEntryAPluginElementPredicate(key, value)) + .map(([elementType, elements]) => [elementType, (elements as PluginElement[]).filter(({deprecated}) => !deprecated)]) + .filter(([, elements]) => elements.length > 0); + + if (filteredElementsEntries.length === 0) { + return []; + } + + return [{ + ...p, + ...Object.fromEntries( + filteredElementsEntries + ) + }]; + }) +} \ No newline at end of file diff --git a/src/utils/plugins/getPluginIcon.ts b/src/utils/plugins/getPluginIcon.ts new file mode 100644 index 00000000000..093cfce9705 --- /dev/null +++ b/src/utils/plugins/getPluginIcon.ts @@ -0,0 +1,37 @@ +import { $fetch } from "../fetch"; + +function colorFixedB64Icon(b64Icon: string) { + return Buffer.from(Buffer.from(b64Icon, 'base64').toString('utf-8').replace(/currentColor/g, "#CAC5DA")).toString('base64'); +} + +export async function getIcon(pluginName: string, pluginType?: string, group?:string, subGroup?: string) { + const originalIcons = await $fetch(`https://api.kestra.io/v1/plugins/${pluginName}/icons/subgroups`); + const elementIcons = await $fetch(`https://api.kestra.io/v1/plugins/${pluginName}/icons`); + + const originalIconsAsString = Object.fromEntries(Object.entries(originalIcons) + .map(([key, value]: [string, {icon: string}]) => [key, colorFixedB64Icon(value.icon)])); + const elementIconsAsString = Object.fromEntries(Object.entries(elementIcons) + .map(([key, value]: [string, {icon: string}]) => [key, colorFixedB64Icon(value.icon)])); + + const icons = { + ...originalIconsAsString, + ...elementIconsAsString + } + let icon; + if (pluginType !== undefined) { + icon = icons[pluginType]; + if (icon === undefined) { + const filteredIcons = Object.entries(icons).filter(([key]) => pluginType?.includes(key)) + icon = filteredIcons.sort(([key1], [key2]) => key2.length - key1.length)?.[0]?.[1]; + } + } else if (subGroup) { + icon = icons[subGroup]; + } else if (group) { + icon = icons[group]; + } + + return { + pageIcon: icon ? `data:image/svg+xml;base64,${colorFixedB64Icon(icon)}` : undefined, + icons + }; +} \ No newline at end of file diff --git a/src/utils/plugins/nuxtBlocks.ts b/src/utils/plugins/nuxtBlocks.ts new file mode 100644 index 00000000000..d49e0378008 --- /dev/null +++ b/src/utils/plugins/nuxtBlocks.ts @@ -0,0 +1,82 @@ +import type {JSONProperty, JSONSchema, Plugin} from "@kestra-io/ui-libs"; + +export function nuxtBlocksFromJsonSchema(jsonSchema: JSONSchema) { + return { + body: { + jsonSchema, + toc: { + links: tocFromJsonSchema(jsonSchema) + }, + }, + description: jsonSchema.properties?.description, + title: jsonSchema.properties?.title + }; +} + +export function nuxtBlocksFromSubGroupsWrappers(subGroupsWrappers: Plugin[]) { + return { + body: { + plugins: subGroupsWrappers, + group: subGroupsWrappers?.[0]?.group, + } + }; +} + +const jsonSchemaPropertiesChildrenToc = (hrefPrefix = "", properties: Record , usePropertyTitle = false) => { + const children = []; + + const sortedProperties = Object.entries(properties).sort(([_, valueA], [__, valueB]) => { + return Boolean(valueB.$required) === Boolean(valueA.$required) ? 0 : Boolean(valueA.$required) ? 1 : -1; + }); + + for (const [key, property] of sortedProperties) { + children.push({ + id: hrefPrefix + key, + depth: 3, + text: (usePropertyTitle ? property.title : undefined) ?? key.split("_")[0], + }); + } + + return children; +} + +const tocFromJsonSchema = (schema: JSONSchema) => { + const links = []; + + if (schema.properties?.["$examples"]) { + links.push({ + id: 'examples', + depth: 2, + text: 'Examples' + }); + } + + if (schema.properties?.properties) { + links.push({ + id: 'properties', + depth: 2, + text: 'Properties', + children: jsonSchemaPropertiesChildrenToc("properties_", schema.properties.properties) + }); + } + + if (schema.outputs?.properties) { + links.push({ + id: 'outputs', + depth: 2, + text: 'Outputs', + children: jsonSchemaPropertiesChildrenToc("outputs_", schema.outputs.properties) + }); + } + + if (schema.definitions) { + links.push({ + id: 'definitions', + depth: 2, + text: 'Definitions', + children: jsonSchemaPropertiesChildrenToc(undefined, schema.definitions, true) + }); + } + + return links; +}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index a746f2a70c2..d0340004c6d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,4 +1,16 @@ { - // https://nuxt.com/docs/guide/concepts/typescript - "extends": "./.nuxt/tsconfig.json" -} + "extends": "astro/tsconfigs/strict", + "include": [ + ".astro/types.d.ts", + "**/*" + ], + "exclude": [ + "dist" + ], + "compilerOptions": { + "jsx": "preserve", + "paths": { + "@assets/*": ["./src/assets/*"] + } + } +} \ No newline at end of file diff --git a/utils/badgeMaps.mjs b/utils/badgeMaps.mjs new file mode 100644 index 00000000000..3e5d99beb44 --- /dev/null +++ b/utils/badgeMaps.mjs @@ -0,0 +1,10 @@ +/** + * Maps edition prefixes to their corresponding labels and colors. + * @type {Record } + */ +export const editionLabelAndColorByPrefix = { + OSS: {label: "Open Source Edition", color: "primary"}, + EE: {label: "Enterprise Edition", color: "secondary"}, + CLOUD_TEAM: {label: "Cloud Team plan", color: "success"}, + CLOUD_PRO: {label: "Cloud Pro plan", color: "info"}, +} \ No newline at end of file diff --git a/utils/generateId.ts b/utils/generateId.ts new file mode 100644 index 00000000000..128d996a42e --- /dev/null +++ b/utils/generateId.ts @@ -0,0 +1,7 @@ +export default function generateId({ entry }: { entry: string }) { + return entry === "index.md" || entry === "index.mdx" ? " " : entry + .replace(/\.mdx?$/, '') + .replace(/^\d+\./, '') + .replace(/\/\d+\./g, '/') + .replace(/\/index$/, ''); +} \ No newline at end of file diff --git a/utils/navigation.js b/utils/navigation.js index 760cb8e3acf..f9f0ceca4c8 100644 --- a/utils/navigation.js +++ b/utils/navigation.js @@ -53,7 +53,11 @@ export const recursivePages = (item) => { return paths; } - + /** + * + * @param {*} item + * @returns {Record } + */ export const generatePageNames = (item) => { const result = {}; function traverse(item) { diff --git a/utils/remark-custom-elements/ChildCard.mjs b/utils/remark-custom-elements/ChildCard.mjs new file mode 100644 index 00000000000..9c3651eff58 --- /dev/null +++ b/utils/remark-custom-elements/ChildCard.mjs @@ -0,0 +1,116 @@ +import generateId from '../generateId' +import * as fs from 'node:fs' +import * as path from 'node:path' + +const getFrontmatter = (markdown) => { + const charactersBetweenGroupedHyphens = /^---([\s\S]*?)---/; + const metadataMatched = markdown.match(charactersBetweenGroupedHyphens); + const metadata = metadataMatched[1]; + const content = markdown.slice((metadataMatched.index ?? 0) + (metadataMatched[0]?.length ?? 0)); + + const lines = content.split("\n"); + const firstNonBlankLine = lines.find(line => line.trim().length > 0); + const defaultMetadata = {} + if (firstNonBlankLine){ + if(firstNonBlankLine.startsWith("# ")) { + defaultMetadata.title = firstNonBlankLine.replace(/^# /, '').trim(); + }else{ + defaultMetadata.description = firstNonBlankLine.replace(/^#+ /, '').trim(); + } + } + + if (!metadata) { + return defaultMetadata; + } + + const metadataLines = metadata.split("\n"); + const metadataObject = metadataLines.reduce((accumulator, line) => { + const [key, ...value] = line.split(":").map((part) => part.trim()); + + if (key) + accumulator[key] = value[1] ? value.join(":") : value.join(""); + return accumulator; + }, {}); + + Object.assign(metadataObject, defaultMetadata); + + return metadataObject; +}; + +export function ChildCard(data, _attributes, node, file) { + const directory = path.dirname(file.history[0]) + const files = fs.readdirSync(directory).filter(f => (f.endsWith('.md') || f.endsWith('.mdx')) && f !== path.basename(file.history[0])) + const richFiles = files.map(f => ({ + entry: f, + data: getFrontmatter(fs.readFileSync(path.join(directory, f), 'utf-8')) + })) + const currentDir = path.basename(directory) + data.hName = 'div' + data.hProperties = {class: 'child-cards-wrapper'} + node.children = richFiles.map(richFile => ({ + type: 'anchor', + data: { + hName: 'a', + hProperties: { + class: 'child-card-link card', + href: generateId({entry: `./${currentDir}/${richFile.entry}`}) + } + }, + children: [ + { + type: 'element', + data: { + hName: 'div', + hProperties: { + class: 'card-icon', + }, + }, + children: [{ + type: 'element', + data: { + hName: 'img', + hProperties: { + class: 'card-icon-img', + src: richFile.data.icon ?? '/default-icon.svg', + alt: richFile.data.title ?? richFile.entry.replace(/\.mdx?$/, ''), + height: '50px', + width: '50px', + } + } + }] + }, + { + type: 'element', + data: { + hName: 'h4', + hProperties: { + class: 'card-title', + }, + + }, + children: [ + { + type: 'text', + value: richFile.data.title ?? richFile.entry.replace(/\.mdx?$/, '') + } + ] + }, + { + type: 'element', + data: { + hName: 'p', + hProperties: { + class: 'card-text', + }, + + }, + children: [ + { + type: 'text', + value: richFile.data.description ?? '' + } + ] + } + ] + })) +} \ No newline at end of file diff --git a/utils/remark-custom-elements/alert.mjs b/utils/remark-custom-elements/alert.mjs new file mode 100644 index 00000000000..91693265eea --- /dev/null +++ b/utils/remark-custom-elements/alert.mjs @@ -0,0 +1,8 @@ +export function alert(data, attributes) { + const type = attributes.type ?? "info" + data.hName = 'div' + data.hProperties = { + class: `doc-alert alert alert-${type}`, + role: "alert", + } +} \ No newline at end of file diff --git a/utils/remark-custom-elements/badge.mjs b/utils/remark-custom-elements/badge.mjs new file mode 100644 index 00000000000..d84d6ad368c --- /dev/null +++ b/utils/remark-custom-elements/badge.mjs @@ -0,0 +1,69 @@ +import {editionLabelAndColorByPrefix} from '../badgeMaps.mjs' + +export function badge(data, attributes, node) { + const {version, editions} = attributes + if (!version && !editions) { + throw new Error('badge directive requires either version or editions attributes') + } + const editionList = editions ? editions.split(',').map(e => e.trim()) : [] + data.hName = 'div' + data.hProperties = { + class: `fw-bold d-flex gap-2 flex-wrap mb-3`, + } + node.children = [ + // Available on:
+ { + type: 'element', + data: { + hName: 'p', + hProperties: { + class: 'mb-0', + }, + }, + children: [ + { + type: 'text', + value: 'Available on:', + }, + ], + }, + // v{{ version }} + ...(version + ? [{ + type: 'element', + data: { + hName: 'span', + hProperties: { + class: 'badge d-flex align-items-center bg-body-tertiary', + }, + }, + children: [ + { + type: 'text', + value: `v${version}`, + }, + ], + }] + : [] + ), + // + ...editionList.map(edition => { + const info = editionLabelAndColorByPrefix?.[edition] || {label: edition, color: 'secondary'} + return { + type: 'element', + data: { + hName: 'span', + hProperties: { + class: `badge d-flex align-items-center bg-${info.color}`, + }, + }, + children: [ + { + type: 'text', + value: info.label, + }, + ], + } + }), + ] +} \ No newline at end of file diff --git a/utils/remark-custom-elements/collapse.mjs b/utils/remark-custom-elements/collapse.mjs new file mode 100644 index 00000000000..9b65d388274 --- /dev/null +++ b/utils/remark-custom-elements/collapse.mjs @@ -0,0 +1,16 @@ +export function collapse(data, attributes, node) { + data.hName = 'details' + const summaryText = attributes.title ?? "Details" + data.hProperties = {class: 'doc-collapse'} + node.children = [ + { + type: 'summary', + data:{ + hName: 'summary', + hProperties: {} + }, + children: [{type: 'text', value: summaryText}] + }, + ...(node.children ?? []) + ] +} diff --git a/utils/remark-custom-elements/index.mjs b/utils/remark-custom-elements/index.mjs new file mode 100644 index 00000000000..5c8bddb2779 --- /dev/null +++ b/utils/remark-custom-elements/index.mjs @@ -0,0 +1,33 @@ +import { visit } from 'unist-util-visit' +import { alert } from './alert.mjs'; +import { collapse } from './collapse.mjs'; +import { ChildCard } from './ChildCard.mjs'; +import { badge } from './badge.mjs' +import {NextLink} from "./next-link.mjs"; + +const componentMap = { + alert, + collapse, + ChildCard, + badge, + 'next-link': NextLink, +} + + +export default function() { + return function(tree, file) { + visit(tree, function (node) { + if ( + node.type == 'containerDirective' || + node.type == 'leafDirective' || + node.type === 'textDirective' + ) { + if (!(node.name in componentMap)) return + const data = node.data || (node.data = {}) + const attributes = node.attributes || {} + + componentMap[node.name](data, attributes, node, file) + } + }) + } +} \ No newline at end of file diff --git a/utils/remark-custom-elements/next-link.mjs b/utils/remark-custom-elements/next-link.mjs new file mode 100644 index 00000000000..788c75f1a5c --- /dev/null +++ b/utils/remark-custom-elements/next-link.mjs @@ -0,0 +1,19 @@ +export function NextLink(data, attributes, node, file) { + const children = node.children || []; + data.hName = 'div'; + data.hProperties = { + class: ['text-end mt-3 mb-3 ks-doc-next-link'] + }; + node.children = [ + { + type: 'element', + data:{ + hName: 'div', + hProperties: { + class: ['btn btn-outline-primary btn-chevron-right'] + } + }, + children + } + ] +} \ No newline at end of file