This commit is contained in:
Philipp Kunz 2025-01-24 02:39:54 +01:00
parent e1329a12b2
commit f0558fe834
227 changed files with 67345 additions and 3137 deletions

View File

@ -0,0 +1,275 @@
import {
useMediaQuery
} from "./chunk-RS5DWIW3.js";
import {
computed,
ref,
shallowRef,
watch
} from "./chunk-5TCDO6LD.js";
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/index.js
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/fonts.css";
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/without-fonts.js
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/vars.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/base.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/icons.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/utils.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/components/custom-block.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/components/vp-code-group.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/components/vp-doc.css";
import "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/styles/components/vp-sponsor.css";
import VPBadge from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
import Layout from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/Layout.vue";
import { default as default2 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPBadge.vue";
import { default as default3 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPButton.vue";
import { default as default4 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPDocAsideSponsors.vue";
import { default as default5 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPFeatures.vue";
import { default as default6 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPHomeContent.vue";
import { default as default7 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPHomeFeatures.vue";
import { default as default8 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPHomeHero.vue";
import { default as default9 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPHomeSponsors.vue";
import { default as default10 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPImage.vue";
import { default as default11 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPLink.vue";
import { default as default12 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPNavBarSearch.vue";
import { default as default13 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPSocialLink.vue";
import { default as default14 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPSocialLinks.vue";
import { default as default15 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPSponsors.vue";
import { default as default16 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPTeamMembers.vue";
import { default as default17 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPTeamPage.vue";
import { default as default18 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageSection.vue";
import { default as default19 } from "/mnt/HC_Volume_11396573/lossless/foss.global/docs.foss.global/node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/components/VPTeamPageTitle.vue";
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
import { onContentUpdated } from "vitepress";
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/composables/outline.js
import { getScrollOffset } from "vitepress";
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/support/utils.js
import { withBase } from "vitepress";
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/composables/data.js
import { useData as useData$ } from "vitepress";
var useData = useData$;
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/support/utils.js
function ensureStartingSlash(path) {
return path.startsWith("/") ? path : `/${path}`;
}
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/support/sidebar.js
function getSidebar(_sidebar, path) {
if (Array.isArray(_sidebar))
return addBase(_sidebar);
if (_sidebar == null)
return [];
path = ensureStartingSlash(path);
const dir = Object.keys(_sidebar).sort((a, b) => {
return b.split("/").length - a.split("/").length;
}).find((dir2) => {
return path.startsWith(ensureStartingSlash(dir2));
});
const sidebar = dir ? _sidebar[dir] : [];
return Array.isArray(sidebar) ? addBase(sidebar) : addBase(sidebar.items, sidebar.base);
}
function getSidebarGroups(sidebar) {
const groups = [];
let lastGroupIndex = 0;
for (const index in sidebar) {
const item = sidebar[index];
if (item.items) {
lastGroupIndex = groups.push(item);
continue;
}
if (!groups[lastGroupIndex]) {
groups.push({ items: [] });
}
groups[lastGroupIndex].items.push(item);
}
return groups;
}
function addBase(items, _base) {
return [...items].map((_item) => {
const item = { ..._item };
const base = item.base || _base;
if (base && item.link)
item.link = base + item.link;
if (item.items)
item.items = addBase(item.items, base);
return item;
});
}
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/composables/sidebar.js
function useSidebar() {
const { frontmatter, page, theme: theme2 } = useData();
const is960 = useMediaQuery("(min-width: 960px)");
const isOpen = ref(false);
const _sidebar = computed(() => {
const sidebarConfig = theme2.value.sidebar;
const relativePath = page.value.relativePath;
return sidebarConfig ? getSidebar(sidebarConfig, relativePath) : [];
});
const sidebar = ref(_sidebar.value);
watch(_sidebar, (next, prev) => {
if (JSON.stringify(next) !== JSON.stringify(prev))
sidebar.value = _sidebar.value;
});
const hasSidebar = computed(() => {
return frontmatter.value.sidebar !== false && sidebar.value.length > 0 && frontmatter.value.layout !== "home";
});
const leftAside = computed(() => {
if (hasAside)
return frontmatter.value.aside == null ? theme2.value.aside === "left" : frontmatter.value.aside === "left";
return false;
});
const hasAside = computed(() => {
if (frontmatter.value.layout === "home")
return false;
if (frontmatter.value.aside != null)
return !!frontmatter.value.aside;
return theme2.value.aside !== false;
});
const isSidebarEnabled = computed(() => hasSidebar.value && is960.value);
const sidebarGroups = computed(() => {
return hasSidebar.value ? getSidebarGroups(sidebar.value) : [];
});
function open() {
isOpen.value = true;
}
function close() {
isOpen.value = false;
}
function toggle() {
isOpen.value ? close() : open();
}
return {
isOpen,
sidebar,
sidebarGroups,
hasSidebar,
hasAside,
leftAside,
isSidebarEnabled,
open,
close,
toggle
};
}
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/composables/outline.js
var ignoreRE = /\b(?:VPBadge|header-anchor|footnote-ref|ignore-header)\b/;
var resolvedHeaders = [];
function getHeaders(range) {
const headers = [
...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")
].filter((el) => el.id && el.hasChildNodes()).map((el) => {
const level = Number(el.tagName[1]);
return {
element: el,
title: serializeHeader(el),
link: "#" + el.id,
level
};
});
return resolveHeaders(headers, range);
}
function serializeHeader(h) {
let ret = "";
for (const node of h.childNodes) {
if (node.nodeType === 1) {
if (ignoreRE.test(node.className))
continue;
ret += node.textContent;
} else if (node.nodeType === 3) {
ret += node.textContent;
}
}
return ret.trim();
}
function resolveHeaders(headers, range) {
if (range === false) {
return [];
}
const levelsRange = (typeof range === "object" && !Array.isArray(range) ? range.level : range) || 2;
const [high, low] = typeof levelsRange === "number" ? [levelsRange, levelsRange] : levelsRange === "deep" ? [2, 6] : levelsRange;
return buildTree(headers, high, low);
}
function buildTree(data, min, max) {
resolvedHeaders.length = 0;
const result = [];
const stack = [];
data.forEach((item) => {
const node = { ...item, children: [] };
let parent = stack[stack.length - 1];
while (parent && parent.level >= node.level) {
stack.pop();
parent = stack[stack.length - 1];
}
if (node.element.classList.contains("ignore-header") || parent && "shouldIgnore" in parent) {
stack.push({ level: node.level, shouldIgnore: true });
return;
}
if (node.level > max || node.level < min)
return;
resolvedHeaders.push({ element: node.element, link: node.link });
if (parent)
parent.children.push(node);
else
result.push(node);
stack.push(node);
});
return result;
}
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/composables/local-nav.js
function useLocalNav() {
const { theme: theme2, frontmatter } = useData();
const headers = shallowRef([]);
const hasLocalNav = computed(() => {
return headers.value.length > 0;
});
onContentUpdated(() => {
headers.value = getHeaders(frontmatter.value.outline ?? theme2.value.outline);
});
return {
headers,
hasLocalNav
};
}
// node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/without-fonts.js
var theme = {
Layout,
enhanceApp: ({ app }) => {
app.component("Badge", VPBadge);
}
};
var without_fonts_default = theme;
export {
default2 as VPBadge,
default3 as VPButton,
default4 as VPDocAsideSponsors,
default5 as VPFeatures,
default6 as VPHomeContent,
default7 as VPHomeFeatures,
default8 as VPHomeHero,
default9 as VPHomeSponsors,
default10 as VPImage,
default11 as VPLink,
default12 as VPNavBarSearch,
default13 as VPSocialLink,
default14 as VPSocialLinks,
default15 as VPSponsors,
default16 as VPTeamMembers,
default17 as VPTeamPage,
default18 as VPTeamPageSection,
default19 as VPTeamPageTitle,
without_fonts_default as default,
useLocalNav,
useSidebar
};
//# sourceMappingURL=@theme_index.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,58 @@
{
"hash": "c3128e42",
"configHash": "eb0f6f8f",
"lockfileHash": "e52bfff6",
"browserHash": "d497feaa",
"optimized": {
"vue": {
"src": "../../../../node_modules/.pnpm/vue@3.5.13_typescript@5.6.3/node_modules/vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "baa0714a",
"needsInterop": false
},
"vitepress > @vue/devtools-api": {
"src": "../../../../node_modules/.pnpm/@vue+devtools-api@7.7.0/node_modules/@vue/devtools-api/dist/index.js",
"file": "vitepress___@vue_devtools-api.js",
"fileHash": "2cabef05",
"needsInterop": false
},
"vitepress > @vueuse/core": {
"src": "../../../../node_modules/.pnpm/@vueuse+core@12.5.0_typescript@5.6.3/node_modules/@vueuse/core/index.mjs",
"file": "vitepress___@vueuse_core.js",
"fileHash": "8b1915d6",
"needsInterop": false
},
"vitepress > @vueuse/integrations/useFocusTrap": {
"src": "../../../../node_modules/.pnpm/@vueuse+integrations@12.5.0_focus-trap@7.6.4_typescript@5.6.3/node_modules/@vueuse/integrations/useFocusTrap.mjs",
"file": "vitepress___@vueuse_integrations_useFocusTrap.js",
"fileHash": "3ce0280e",
"needsInterop": false
},
"vitepress > mark.js/src/vanilla.js": {
"src": "../../../../node_modules/.pnpm/mark.js@8.11.1/node_modules/mark.js/src/vanilla.js",
"file": "vitepress___mark__js_src_vanilla__js.js",
"fileHash": "d4c992ba",
"needsInterop": false
},
"vitepress > minisearch": {
"src": "../../../../node_modules/.pnpm/minisearch@7.1.1/node_modules/minisearch/dist/es/index.js",
"file": "vitepress___minisearch.js",
"fileHash": "8f48334a",
"needsInterop": false
},
"@theme/index": {
"src": "../../../../node_modules/.pnpm/vitepress@1.6.3_@algolia+client-search@5.20.0_@types+node@22.10.10_postcss@8.5.1_search-insights@2.17.3_typescript@5.6.3/node_modules/vitepress/dist/client/theme-default/index.js",
"file": "@theme_index.js",
"fileHash": "744c9fd8",
"needsInterop": false
}
},
"chunks": {
"chunk-RS5DWIW3": {
"file": "chunk-RS5DWIW3.js"
},
"chunk-5TCDO6LD": {
"file": "chunk-5TCDO6LD.js"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
{
"type": "module"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,581 @@
import {
DefaultMagicKeysAliasMap,
StorageSerializers,
TransitionPresets,
assert,
breakpointsAntDesign,
breakpointsBootstrapV5,
breakpointsElement,
breakpointsMasterCss,
breakpointsPrimeFlex,
breakpointsQuasar,
breakpointsSematic,
breakpointsTailwind,
breakpointsVuetify,
breakpointsVuetifyV2,
breakpointsVuetifyV3,
bypassFilter,
camelize,
clamp,
cloneFnJSON,
computedAsync,
computedEager,
computedInject,
computedWithControl,
containsProp,
controlledRef,
createEventHook,
createFetch,
createFilterWrapper,
createGlobalState,
createInjectionState,
createReusableTemplate,
createSharedComposable,
createSingletonPromise,
createTemplatePromise,
createUnrefFn,
customStorageEventName,
debounceFilter,
defaultDocument,
defaultLocation,
defaultNavigator,
defaultWindow,
executeTransition,
extendRef,
formatDate,
formatTimeAgo,
get,
getLifeCycleTarget,
getSSRHandler,
hasOwn,
hyphenate,
identity,
increaseWithUnit,
injectLocal,
invoke,
isClient,
isDef,
isDefined,
isIOS,
isObject,
isWorker,
makeDestructurable,
mapGamepadToXbox360Controller,
noop,
normalizeDate,
notNullish,
now,
objectEntries,
objectOmit,
objectPick,
onClickOutside,
onElementRemoval,
onKeyDown,
onKeyPressed,
onKeyStroke,
onKeyUp,
onLongPress,
onStartTyping,
pausableFilter,
promiseTimeout,
provideLocal,
provideSSRWidth,
pxValue,
rand,
reactify,
reactifyObject,
reactiveComputed,
reactiveOmit,
reactivePick,
refAutoReset,
refDebounced,
refDefault,
refThrottled,
refWithControl,
resolveRef,
resolveUnref,
set,
setSSRHandler,
syncRef,
syncRefs,
templateRef,
throttleFilter,
timestamp,
toArray,
toReactive,
toRef,
toRefs,
toValue,
tryOnBeforeMount,
tryOnBeforeUnmount,
tryOnMounted,
tryOnScopeDispose,
tryOnUnmounted,
unrefElement,
until,
useActiveElement,
useAnimate,
useArrayDifference,
useArrayEvery,
useArrayFilter,
useArrayFind,
useArrayFindIndex,
useArrayFindLast,
useArrayIncludes,
useArrayJoin,
useArrayMap,
useArrayReduce,
useArraySome,
useArrayUnique,
useAsyncQueue,
useAsyncState,
useBase64,
useBattery,
useBluetooth,
useBreakpoints,
useBroadcastChannel,
useBrowserLocation,
useCached,
useClipboard,
useClipboardItems,
useCloned,
useColorMode,
useConfirmDialog,
useCountdown,
useCounter,
useCssVar,
useCurrentElement,
useCycleList,
useDark,
useDateFormat,
useDebounceFn,
useDebouncedRefHistory,
useDeviceMotion,
useDeviceOrientation,
useDevicePixelRatio,
useDevicesList,
useDisplayMedia,
useDocumentVisibility,
useDraggable,
useDropZone,
useElementBounding,
useElementByPoint,
useElementHover,
useElementSize,
useElementVisibility,
useEventBus,
useEventListener,
useEventSource,
useEyeDropper,
useFavicon,
useFetch,
useFileDialog,
useFileSystemAccess,
useFocus,
useFocusWithin,
useFps,
useFullscreen,
useGamepad,
useGeolocation,
useIdle,
useImage,
useInfiniteScroll,
useIntersectionObserver,
useInterval,
useIntervalFn,
useKeyModifier,
useLastChanged,
useLocalStorage,
useMagicKeys,
useManualRefHistory,
useMediaControls,
useMediaQuery,
useMemoize,
useMemory,
useMounted,
useMouse,
useMouseInElement,
useMousePressed,
useMutationObserver,
useNavigatorLanguage,
useNetwork,
useNow,
useObjectUrl,
useOffsetPagination,
useOnline,
usePageLeave,
useParallax,
useParentElement,
usePerformanceObserver,
usePermission,
usePointer,
usePointerLock,
usePointerSwipe,
usePreferredColorScheme,
usePreferredContrast,
usePreferredDark,
usePreferredLanguages,
usePreferredReducedMotion,
usePreferredReducedTransparency,
usePrevious,
useRafFn,
useRefHistory,
useResizeObserver,
useSSRWidth,
useScreenOrientation,
useScreenSafeArea,
useScriptTag,
useScroll,
useScrollLock,
useSessionStorage,
useShare,
useSorted,
useSpeechRecognition,
useSpeechSynthesis,
useStepper,
useStorage,
useStorageAsync,
useStyleTag,
useSupported,
useSwipe,
useTemplateRefsList,
useTextDirection,
useTextSelection,
useTextareaAutosize,
useThrottleFn,
useThrottledRefHistory,
useTimeAgo,
useTimeout,
useTimeoutFn,
useTimeoutPoll,
useTimestamp,
useTitle,
useToNumber,
useToString,
useToggle,
useTransition,
useUrlSearchParams,
useUserMedia,
useVModel,
useVModels,
useVibrate,
useVirtualList,
useWakeLock,
useWebNotification,
useWebSocket,
useWebWorker,
useWebWorkerFn,
useWindowFocus,
useWindowScroll,
useWindowSize,
watchArray,
watchAtMost,
watchDebounced,
watchDeep,
watchIgnorable,
watchImmediate,
watchOnce,
watchPausable,
watchThrottled,
watchTriggerable,
watchWithFilter,
whenever
} from "./chunk-RS5DWIW3.js";
import "./chunk-5TCDO6LD.js";
export {
DefaultMagicKeysAliasMap,
StorageSerializers,
TransitionPresets,
assert,
computedAsync as asyncComputed,
refAutoReset as autoResetRef,
breakpointsAntDesign,
breakpointsBootstrapV5,
breakpointsElement,
breakpointsMasterCss,
breakpointsPrimeFlex,
breakpointsQuasar,
breakpointsSematic,
breakpointsTailwind,
breakpointsVuetify,
breakpointsVuetifyV2,
breakpointsVuetifyV3,
bypassFilter,
camelize,
clamp,
cloneFnJSON,
computedAsync,
computedEager,
computedInject,
computedWithControl,
containsProp,
computedWithControl as controlledComputed,
controlledRef,
createEventHook,
createFetch,
createFilterWrapper,
createGlobalState,
createInjectionState,
reactify as createReactiveFn,
createReusableTemplate,
createSharedComposable,
createSingletonPromise,
createTemplatePromise,
createUnrefFn,
customStorageEventName,
debounceFilter,
refDebounced as debouncedRef,
watchDebounced as debouncedWatch,
defaultDocument,
defaultLocation,
defaultNavigator,
defaultWindow,
computedEager as eagerComputed,
executeTransition,
extendRef,
formatDate,
formatTimeAgo,
get,
getLifeCycleTarget,
getSSRHandler,
hasOwn,
hyphenate,
identity,
watchIgnorable as ignorableWatch,
increaseWithUnit,
injectLocal,
invoke,
isClient,
isDef,
isDefined,
isIOS,
isObject,
isWorker,
makeDestructurable,
mapGamepadToXbox360Controller,
noop,
normalizeDate,
notNullish,
now,
objectEntries,
objectOmit,
objectPick,
onClickOutside,
onElementRemoval,
onKeyDown,
onKeyPressed,
onKeyStroke,
onKeyUp,
onLongPress,
onStartTyping,
pausableFilter,
watchPausable as pausableWatch,
promiseTimeout,
provideLocal,
provideSSRWidth,
pxValue,
rand,
reactify,
reactifyObject,
reactiveComputed,
reactiveOmit,
reactivePick,
refAutoReset,
refDebounced,
refDefault,
refThrottled,
refWithControl,
resolveRef,
resolveUnref,
set,
setSSRHandler,
syncRef,
syncRefs,
templateRef,
throttleFilter,
refThrottled as throttledRef,
watchThrottled as throttledWatch,
timestamp,
toArray,
toReactive,
toRef,
toRefs,
toValue,
tryOnBeforeMount,
tryOnBeforeUnmount,
tryOnMounted,
tryOnScopeDispose,
tryOnUnmounted,
unrefElement,
until,
useActiveElement,
useAnimate,
useArrayDifference,
useArrayEvery,
useArrayFilter,
useArrayFind,
useArrayFindIndex,
useArrayFindLast,
useArrayIncludes,
useArrayJoin,
useArrayMap,
useArrayReduce,
useArraySome,
useArrayUnique,
useAsyncQueue,
useAsyncState,
useBase64,
useBattery,
useBluetooth,
useBreakpoints,
useBroadcastChannel,
useBrowserLocation,
useCached,
useClipboard,
useClipboardItems,
useCloned,
useColorMode,
useConfirmDialog,
useCountdown,
useCounter,
useCssVar,
useCurrentElement,
useCycleList,
useDark,
useDateFormat,
refDebounced as useDebounce,
useDebounceFn,
useDebouncedRefHistory,
useDeviceMotion,
useDeviceOrientation,
useDevicePixelRatio,
useDevicesList,
useDisplayMedia,
useDocumentVisibility,
useDraggable,
useDropZone,
useElementBounding,
useElementByPoint,
useElementHover,
useElementSize,
useElementVisibility,
useEventBus,
useEventListener,
useEventSource,
useEyeDropper,
useFavicon,
useFetch,
useFileDialog,
useFileSystemAccess,
useFocus,
useFocusWithin,
useFps,
useFullscreen,
useGamepad,
useGeolocation,
useIdle,
useImage,
useInfiniteScroll,
useIntersectionObserver,
useInterval,
useIntervalFn,
useKeyModifier,
useLastChanged,
useLocalStorage,
useMagicKeys,
useManualRefHistory,
useMediaControls,
useMediaQuery,
useMemoize,
useMemory,
useMounted,
useMouse,
useMouseInElement,
useMousePressed,
useMutationObserver,
useNavigatorLanguage,
useNetwork,
useNow,
useObjectUrl,
useOffsetPagination,
useOnline,
usePageLeave,
useParallax,
useParentElement,
usePerformanceObserver,
usePermission,
usePointer,
usePointerLock,
usePointerSwipe,
usePreferredColorScheme,
usePreferredContrast,
usePreferredDark,
usePreferredLanguages,
usePreferredReducedMotion,
usePreferredReducedTransparency,
usePrevious,
useRafFn,
useRefHistory,
useResizeObserver,
useSSRWidth,
useScreenOrientation,
useScreenSafeArea,
useScriptTag,
useScroll,
useScrollLock,
useSessionStorage,
useShare,
useSorted,
useSpeechRecognition,
useSpeechSynthesis,
useStepper,
useStorage,
useStorageAsync,
useStyleTag,
useSupported,
useSwipe,
useTemplateRefsList,
useTextDirection,
useTextSelection,
useTextareaAutosize,
refThrottled as useThrottle,
useThrottleFn,
useThrottledRefHistory,
useTimeAgo,
useTimeout,
useTimeoutFn,
useTimeoutPoll,
useTimestamp,
useTitle,
useToNumber,
useToString,
useToggle,
useTransition,
useUrlSearchParams,
useUserMedia,
useVModel,
useVModels,
useVibrate,
useVirtualList,
useWakeLock,
useWebNotification,
useWebSocket,
useWebWorker,
useWebWorkerFn,
useWindowFocus,
useWindowScroll,
useWindowSize,
watchArray,
watchAtMost,
watchDebounced,
watchDeep,
watchIgnorable,
watchImmediate,
watchOnce,
watchPausable,
watchThrottled,
watchTriggerable,
watchWithFilter,
whenever
};
//# sourceMappingURL=vitepress___@vueuse_core.js.map

View File

@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

343
docs/.vitepress/cache/deps/vue.js vendored Normal file
View File

@ -0,0 +1,343 @@
import {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBaseVNode,
createBlock,
createCommentVNode,
createElementBlock,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getCurrentWatcher,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
hydrateOnIdle,
hydrateOnInteraction,
hydrateOnMediaQuery,
hydrateOnVisible,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
onWatcherCleanup,
openBlock,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useHost,
useId,
useModel,
useSSRContext,
useShadowRoot,
useSlots,
useTemplateRef,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
} from "./chunk-5TCDO6LD.js";
export {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBlock,
createCommentVNode,
createElementBlock,
createBaseVNode as createElementVNode,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getCurrentWatcher,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
hydrateOnIdle,
hydrateOnInteraction,
hydrateOnMediaQuery,
hydrateOnVisible,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
onWatcherCleanup,
openBlock,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useHost,
useId,
useModel,
useSSRContext,
useShadowRoot,
useSlots,
useTemplateRef,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
};
//# sourceMappingURL=vue.js.map

7
docs/.vitepress/cache/deps/vue.js.map vendored Normal file
View File

@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

101
docs/.vitepress/config.ts Normal file
View File

@ -0,0 +1,101 @@
import * as plugins from './plugins.js';
import * as paths from './paths.js';
import * as helpers from './helpers.js';
// refer https://vitepress.dev/reference/site-config for details
export default async () => {
// lets download gitea files
await helpers.downloadReadmes(
'https://code.foss.global',
'api.global',
plugins.path.join(paths.docsDir, 'api.global'),
);
await helpers.downloadReadmes(
'https://code.foss.global',
'apiclient.xyz',
plugins.path.join(paths.docsDir, 'apiclient.xyz'),
);
await helpers.downloadReadmes(
'https://code.foss.global',
'design.estate',
plugins.path.join(paths.docsDir, 'design.estate'),
);
await helpers.downloadReadmes(
'https://code.foss.global',
'push.rocks',
plugins.path.join(paths.docsDir, 'push.rocks'),
);
return plugins.vitepress.defineConfig({
lang: 'en-US',
lastUpdated: true,
cleanUrls: true,
title: 'docs.foss.global',
description: 'Vite & Vue powered static site generator.',
ignoreDeadLinks: true,
metaChunk: true,
themeConfig: {
outline: 'deep',
nav: [],
sidebar: [
{ text: '01. Home', link: '/index.md' },
{ text: '02. Legal Info', link: 'https://legal.task.vc' },
...(await helpers.generateNavLinks('foss.global')),
{
text: 'Projects',
items: [
{
text: 'apiclient.xyz',
items: await helpers.generateNavLinks('apiclient.xyz'),
collapsed: true,
},
{
text: 'api.global',
items: await helpers.generateNavLinks('api.global'),
collapsed: true,
},
{
text: 'design.estate',
items: await helpers.generateNavLinks('design.estate'),
collapsed: true,
},
{
text: 'push.rocks',
items: await helpers.generateNavLinks('push.rocks'),
collapsed: true,
},
{
text: 'serve.zone',
items: await helpers.generateNavLinks('serve.zone'),
collapsed: true,
},
],
},
],
socialLinks: [
{
icon: 'mastodon',
link: 'mtd.foss.global',
},
{
icon: {
svg: '<svg viewBox="0 0 24 24"><path d="M22 4H2v16h20zm-2 4l-8 5l-8-5V6l8 5l8-5z"/></svg>',
},
link: '/contact',
},
],
search: {
provider: 'local',
},
footer: {
message: 'The legal entity behind this project is Task Venture Capital GmbH.',
copyright: 'Copyright © Task Venture Capital GmbH since 2014',
},
},
});
};

155
docs/.vitepress/helpers.ts Normal file
View File

@ -0,0 +1,155 @@
import * as plugins from './plugins.js';
import * as paths from './paths.js';
// Function to generate nav links from a folder
export async function generateNavLinks(projectName: string) {
const folderPath = plugins.path.join(paths.docsDir, projectName);
try {
let files = await plugins.fs.readdir(folderPath);
files = files.filter((file) => file.endsWith('.md')); // Only include Markdown files
const navLinks: {
text: string;
link: string;
}[] = [];
for (const file of files) {
const name = plugins.path.basename(file, '.md');
const fileContent = await plugins.fs.readFile(plugins.path.join(folderPath, file), 'utf8');
const smartfmInstance = new plugins.smartfm.Smartfm({
fmType: 'yaml'
});
const frontmatter = smartfmInstance.parse(fileContent);
let title = name;
if (frontmatter.data.title) {
title = frontmatter.data.title;
}
navLinks.push({
text: title,
link: `/${projectName}/${name}`,
});
}
return navLinks;
} catch (error) {
console.error(`Error reading folder ${folderPath}:`, error);
return [];
}
}
/**
* Downloads README files from all repositories within a specified Gitea organization.
*
* @param domain - The domain of the Gitea instance (e.g., "https://gitea.example.com").
* @param org - The name of the organization whose repositories will be processed.
* @param outputDir - The directory where README files will be saved. Defaults to "./readmes".
* @param authToken - (Optional) Personal access token for authenticated requests.
*/
export async function downloadReadmes(
domain: string,
org: string,
outputDir: string = './readmes',
authToken?: string
): Promise<void> {
// Ensure the output directory exists
await plugins.fs.mkdir(outputDir, { recursive: true });
// Helper function to construct headers
const getHeaders = (additionalHeaders: Record<string, string> = {}) => {
const headers: Record<string, string> = {
'Content-Type': 'application/json',
...additionalHeaders,
};
if (authToken) {
headers['Authorization'] = `token ${authToken}`;
}
return headers;
};
try {
let page = 1;
const perPage = 50; // Adjust as needed
let hasMore = true;
const repos: any[] = [];
console.log(`Fetching repositories for organization: ${org}`);
// Fetch all repositories with pagination
while (hasMore) {
const reposUrl = new URL(`/api/v1/orgs/${encodeURIComponent(org)}/repos`, domain);
reposUrl.searchParams.append('page', page.toString());
reposUrl.searchParams.append('limit', perPage.toString());
const reposResponse = await fetch(reposUrl.toString(), {
method: 'GET',
headers: getHeaders(),
});
if (!reposResponse.ok) {
throw new Error(
`Failed to fetch repositories: ${reposResponse.status} ${reposResponse.statusText}`
);
}
const fetchedRepos = await reposResponse.json();
repos.push(...fetchedRepos);
if (fetchedRepos.length < perPage) {
hasMore = false;
} else {
page += 1;
}
}
console.log(`Total repositories found: ${repos.length}`);
for (const repo of repos) {
const repoName: string = repo.name;
console.log(`Processing repository: ${repoName}`);
try {
const readmeUrl = new URL(
`/api/v1/repos/${encodeURIComponent(org)}/${encodeURIComponent(
repoName
)}/contents/readme.md`,
domain
);
console.log(readmeUrl.toString());
const readmeResponse = await fetch(readmeUrl.toString(), {
method: 'GET',
headers: getHeaders({
Accept: 'application/vnd.gitea.raw',
}),
});
if (readmeResponse.status === 404) {
console.warn(`README not found for repository: ${repoName}`);
continue;
}
if (!readmeResponse.ok) {
throw new Error(
`Failed to fetch README: ${readmeResponse.status} ${readmeResponse.statusText}`
);
}
const readmeContentResponseObject: any = JSON.parse(await readmeResponse.text());
let readmeContent = atob(readmeContentResponseObject.content);
readmeContent = `---
title: "@${org}/${repo.name}"
---
${readmeContent}`;
const sanitizedRepoName = repoName.replace(/[^a-z0-9_\-]/gi, '_'); // Sanitize filename
const readmePath = plugins.path.join(outputDir, `${sanitizedRepoName}_readme.md`);
await plugins.fs.writeFile(readmePath, readmeContent, 'utf8');
console.log(`Saved README for ${repoName} to ${readmePath}`);
} catch (readmeError: any) {
console.error(`Error fetching README for repository: ${repoName}`, readmeError.message);
}
}
console.log('All READMEs have been processed.');
} catch (error: any) {
console.error('An error occurred while fetching repositories:', error.message);
}
}

5
docs/.vitepress/paths.ts Normal file
View File

@ -0,0 +1,5 @@
import * as plugins from './plugins.js';
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../../');
export const docsDir = plugins.path.join(packageDir, 'docs');

View File

@ -0,0 +1,24 @@
// node native
import * as path from 'path';
import { promises as fs } from 'fs';
// @push.rocks scope
import * as smartpath from '@push.rocks/smartpath';
import * as smartfm from '@push.rocks/smartfm';
export {
smartpath,
smartfm,
}
// third-party
import * as vitepress from 'vitepress';
export {
fs,
path,
}
export {
vitepress,
}

View File

@ -0,0 +1,38 @@
---
title: "@api.global/docs"
---
# @apiglobal/private/docs
Open Source headless CMS
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/undefined variable)
* [gitlab.com (source)](https://gitlab.com/bellini/docs)
* [github.com (source mirror)](https://github.com/bellini/docs)
* [docs (typedoc)](https://bellini.gitlab.io/docs/)
## Status for master
[![build status](https://gitlab.com/bellini/docs/badges/master/build.svg)](https://gitlab.com/bellini/docs/commits/master)
[![coverage report](https://gitlab.com/bellini/docs/badges/master/coverage.svg)](https://gitlab.com/bellini/docs/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/undefined variable.svg)](https://www.npmjs.com/package/undefined variable)
[![Known Vulnerabilities](https://snyk.io/test/npm/undefined variable/badge.svg)](https://snyk.io/test/npm/undefined variable)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
Use TypeScript for best in class instellisense.
For further information read the linked docs at the top of this README.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://awpm.gitlab.io/assets/repo-footer.svg)](https://awpm.xyz)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://bellini.gitlab.io/assets/repo-footer.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,166 @@
---
title: "@api.global/sdk"
---
# @api.global/sdk
an sdk package for api.global
## Install
To install `@api.global/sdk`, you need to have Node.js installed on your machine. This package is available through the npm registry. Installation can be done using the npm or yarn command line tools.
```bash
npm install @api.global/sdk --save
```
or
```bash
yarn add @api.global/sdk
```
## Usage
Using `@api.global/sdk` requires an understanding of TypeScript and asynchronous programming concepts in Node.js. Below, we will outline a series of use cases to demonstrate how to utilize the SDK effectively in your projects.
### Setting Up Your Project
Before proceeding with the usage examples, ensure your TypeScript configuration (`tsconfig.json`) is correctly set up for an ES Module syntax project.
### Importing the SDK
Once installed, you can import the entire SDK or specific parts of it into your project files:
```typescript
import * as ApiGlobalSdk from '@api.global/sdk';
```
Or import specific classes if you're only interested in a subset of functionalities:
```typescript
import { AAgHandler, AgEnvironment, AuthInfo } from '@api.global/sdk';
```
### Creating an Environment Handler
`AgEnvironment` is an abstract class that manages the provision of environment variables. A concrete implementation could look like this:
```typescript
import { AgEnvironment } from '@api.global/sdk';
class MyEnvironment extends AgEnvironment {
private envVariables: Map<string, string> = new Map([
['API_KEY', 'your-api-key-here'],
// Add other environment variables
]);
public async getEnvVar(envVarName: string): Promise<string> {
return this.envVariables.get(envVarName) || '';
}
}
const myEnvironment = new MyEnvironment();
```
### Implementing an Authorization Handler
The SDK requires implementing an authorization handler by extending the `AuthInfo` class. This class manages authentication and potential security flags for incoming requests.
```typescript
import { AuthInfo } from '@api.global/sdk';
class MyAuthInfo extends AuthInfo<any> {
public authenticated: boolean = false;
public potentiallyMalicious: boolean = false;
public claim: any;
constructor(claim: any) {
super();
this.claim = claim;
// Implement logic to set 'authenticated' and 'potentiallyMalicious'
}
}
```
### Creating an API Handler
Create an API handler by extending `AAgHandler`. This handler will manage API requests and connect them to your business logic.
```typescript
import { AAgHandler, IRequirementResult } from '@api.global/sdk';
import { TypedRouter } from '@apiglobal/typedrequest';
class MyApiHandler extends AAgHandler<any> {
public slug: string = 'myApi';
public typedrouter: TypedRouter = new TypedRouter();
public async checkRequirements(): Promise<IRequirementResult> {
// Implement checks for your requirements here
return { allOk: true, reason: '' };
}
constructor(agEnvironment: AgEnvironment) {
super(agEnvironment);
// Additional constructor logic
}
public async start(): Promise<void> {
// Implement starting logic here
}
public async stop(): Promise<void> {
// Implement stopping logic here
}
}
// Usage
const myApiHandler = new MyApiHandler(myEnvironment);
```
### Starting Your API Handler
Finally, start your API handler as part of your application's boot-up sequence.
```typescript
async function startApplication() {
try {
await myApiHandler.start();
console.log('API handler started successfully.');
} catch (error) {
console.error('Failed to start API handler:', error);
}
}
startApplication();
```
### Advanced Use Cases
- **Custom AuthInfo Implementations**: Depending on your application's authentication mechanism (e.g., OAuth2, JWT), you may need to create more sophisticated `AuthInfo` implementations.
- **Feature Flags and Environment Variables**: Use `AgEnvironment` to manage feature flags or other configuration that might change between different environments.
- **TypedRequest Integrations**: Leverage the `TypedRouter` from `@apiglobal/typedrequest` to create strongly typed endpoints and request handlers within your `AAgHandler` implementation.
### Conclusion
The `@api.global/sdk` offers powerful abstractions to create well-structured, environment-aware, and secure API handlers for Node.js applications. By extending its base classes and implementing the required methods, you can quickly build scalable and maintainable backend services.
Remember, the key to effectively using `@api.global/sdk` is understanding its core concepts and how they fit into your application's architecture. With this knowledge, you can extend the SDK to meet your specific needs, ensuring a robust and flexible API layer.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,126 @@
---
title: "@api.global/test-sdk"
---
# @api.global/test-sdk
an sdk for testing ag handlers
## Install
To install `@api.global/test-sdk`, you need to have Node.js and npm installed. Follow these steps to install it:
```bash
npm install @api.global/test-sdk --save
```
This will add `@api.global/test-sdk` to your project's dependencies.
## Usage
This document provides a comprehensive guide on how to effectively utilize the `@api.global/test-sdk` module in your project. We will explore various use cases, demonstrate the SDK's capabilities through code examples, and ensure a thorough understanding of its features. This guide assumes that you have basic knowledge of TypeScript and are familiar with the concepts of asynchronous programming.
### Getting Started
First, ensure that you are importing the SDK's functionalities as follows:
```typescript
import { AgTestServer, createTestServer, stopTestServer } from '@api.global/test-sdk';
```
### Creating and Starting a Test Server
The `@api.global/test-sdk` allows for the creation of test servers with custom handlers. Here's how to set it up:
```typescript
import { createTestServer } from '@api.global/test-sdk';
// Your custom handler should extend from AAgHandler
class MyCustomHandler extends AAgHandler<any> {
constructor(envManagerArg: AgEnvironment) {
super(envManagerArg);
this.slug = 'mycustomhandler'; // Define a unique slug for your handler
}
// Implement required handler methods here
}
async function setupTestServer() {
const testServer = await createTestServer(MyCustomHandler);
console.log('Test server started successfully');
return testServer;
}
```
### Sending Requests to the Test Server
With the test server running, you can now simulate requests. Let's demonstrate how to send a request to the custom handler and evaluate the response:
```typescript
import { testFire } from '@api.global/test-sdk';
async function testRequest() {
const testResponse = testFire<MyCustomHandler, MyRequestInterface>(
'mycustomhandler', // The slug of your handler
'POST', // The HTTP method
{ // The request body
key: 'value'
}
);
// Expecting a response from the server
const expectedResponse = await testResponse.expect({
expectedKey: 'expectedValue'
});
console.log('The expected response was received:', expectedResponse);
}
```
### Stopping the Test Server
It's important to properly shut down the test server once your testing is complete to free up resources:
```typescript
async function shutdownTestServer() {
await stopTestServer();
console.log('Test server stopped successfully');
}
```
### Full Example
Here's how everything comes together in a script:
```typescript
import { AgTestServer, createTestServer, stopTestServer, testFire } from '@api.global/test-sdk';
class MyCustomHandler extends AAgHandler<any> {
// Implementation of the custom handler...
}
async function main() {
const server = await setupTestServer();
await testRequest();
await shutdownTestServer();
}
main().catch(console.error);
```
This guide provides a foundational understanding of how to utilize `@api.global/test-sdk` for testing purposes. Through the creation of a test server, the execution of requests, and the evaluation of responses, developers can simulate real-world scenarios and ensure that their applications behave as expected in a controlled environment.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,118 @@
---
title: "@api.global/typedelectron"
---
# @api.global/typedelectron
a package made for ipc communication in electron
## Install
To start using @api.global/typedelectron in your Electron project, first, you need to add it to your project dependencies using npm:
```bash
npm install @api.global/typedelectron --save
```
This command will install the package and add it to your `package.json` file.
## Usage
@api.global/typedelectron is a TypeScript package designed to facilitate IPC (Inter-Process Communication) in Electron applications, leveraging the power of typed requests for enhanced developer experience and code reliability. Below, we provide an exhaustive guide to integrating and utilizing this package in your Electron project, ensuring that your main process and renderer processes communicate seamlessly and efficiently.
### Setting Up Your Project
Before diving into the usage of @api.global/typedelectron, ensure your Electron project is set up to support TypeScript and ESM (ECMAScript Modules) syntax. Your `tsconfig.json` should include settings that target ESNext modules, and your Electron version must meet the peer dependency requirement (>=28.0.0-beta.11).
### Initialization in the Main Process
To leverage @api.global/typedelectron for handling IPC in the main process of your Electron application, start by importing and initializing the `TypedElectronBackend` class. This class provides the functionalities needed to receive and respond to typed requests from renderer processes.
```typescript
import { app, BrowserWindow } from 'electron';
import { TypedElectronBackend } from '@api.global/typedelectron';
app.on('ready', async () => {
const mainWindow = new BrowserWindow({
// BrowserWindow options here
webPreferences: {
preload: YOUR_PRELOAD_SCRIPT,
contextIsolation: true,
},
});
// Initialize TypedElectronBackend
const typedElectronBackend = await TypedElectronBackend.createTypedElectronBackend();
// Load your HTML file
mainWindow.loadFile('path/to/your/index.html');
});
```
In the example above, replace `YOUR_PRELOAD_SCRIPT` with the path to your preload script, which should also import and use the `getPreloadScriptPath` provided by the package to ensure typed messages are properly set up.
### Handling Typed Requests
The core advantage of @api.global/typedelectron is its ability to process typed requests, making IPC more robust and easier to manage. Let's define a typed request interface:
```typescript
// Define in a shared location accessible by both main and renderer processes
export interface IMyTypedRequest {
requestType: 'MY_REQUEST';
payload: {
someData: string;
};
}
```
In the main process, use the `typedElectronBackend` instance to register handlers for specific request types:
```typescript
typedElectronBackend.typedrouter.onTyped<IMyTypedRequest>('MY_REQUEST', async (request) => {
console.log(request.payload.someData);
return {
response: 'Processed your request',
};
});
```
This setup allows the main process to listen for `MY_REQUEST` types and respond accordingly.
### Sending Requests from the Renderer Process
Now, let's send a typed request from the Renderer process. Ensure your preload script sets up the context bridge properly, and then use the provided `TypedRequest` class:
```typescript
import { TypedRequest } from '@api.global/typedelectron';
const myTypedRequest = new TypedRequest<IMyTypedRequest>('MY_REQUEST');
myTypedRequest.send({
someData: 'Hello from Renderer',
}).then((response) => {
console.log(response); // Process response
});
```
In this example, the renderer process sends a request of type `MY_REQUEST` with some data, and then processes the response received from the main process.
### Conclusion
By following the steps and patterns outlined above, you can leverage @api.global/typedelectron to enhance the communication layer of your Electron applications. Typed requests help ensure that the data exchanged between your main and renderer processes is predictable and well-structured, ultimately leading to more reliable and maintainable code.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,154 @@
---
title: "@api.global/typedrequest-interfaces"
---
# @api.global/typedrequest-interfaces
interfaces for making typed requests
## Install
To install `@api.global/typedrequest-interfaces`, you need to have Node.js installed on your system. You can then add this package to your project by running the following command in your terminal:
```bash
npm install @api.global/typedrequest-interfaces --save
```
This will add the package to your project's dependencies. Ensure you are in your project's directory or specify the path where your project is located.
## Usage
To use the `@api.global/typedrequest-interfaces` package in your TypeScript project, follow the steps below. This package provides interfaces for making typed requests, which can help enforce a structured request and response pattern in your applications.
### Setting Up Your Project
First, ensure your project is set up to use TypeScript and ESM (ECMAScript Modules). You will need a `tsconfig.json` file in your project root with at least the following settings:
```json
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "node",
"outDir": "./dist",
"declaration": true,
"esModuleInterop": true,
"experimentalDecorators": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"]
}
```
Adjust the settings according to your project requirements. This configuration supports modern JavaScript features and TypeScript.
### Basic Implementation
To use the interfaces provided by the package, start by importing them into your TypeScript file. Below is an example demonstrating how to define a typed request using the interfaces:
```typescript
import { ITypedRequest, ITypedEvent, ITag, IVirtualStream, IStreamRequest } from '@api.global/typedrequest-interfaces';
// Example: Defining a typed request
interface MyCustomRequest extends ITypedRequest {
method: 'MyCustomMethod';
authInfo?: {
jwt: string;
};
request: {
someData: string;
};
response: {
resultData: number;
};
}
```
This snippet shows how to create a custom interface `MyCustomRequest` that implements the `ITypedRequest` interface from the package. You can specify the types for the request and response data to match your application's needs.
### Handling Typed Events
You can also define and use typed events similar to the following example:
```typescript
// Example: Defining a typed event
interface MyCustomEvent extends ITypedEvent<{ message: string }> {
name: 'MyCustomEvent';
uniqueEventId: 'Event123';
payload: {
message: 'Hello World';
};
}
```
### Utilizing Tags
Tags can be useful for attaching metadata or categorization information to your requests or events. Implementing a tag looks like this:
```typescript
// Example: Defining a tag
interface UserActionTag extends ITag {
name: 'UserAction';
payload: {
userId: number;
action: string;
};
}
```
### Virtual Streams
For more advanced use cases, like handling data streams, the `IVirtualStream` interface can be implemented as follows:
```typescript
// Example: Implementing a virtual stream
class MyStream implements IVirtualStream<Uint8Array> {
side = 'requesting';
streamId = 'myStream123';
sendMethod = async (data: Uint8Array) => { /* Implementation here */ };
// Implement other required methods...
}
```
### Working with Stream Requests
Stream requests allow for handling requests that involve streaming data. Here is how you can use the `IStreamRequest` interface:
```typescript
// Example: Using an IStreamRequest
const myStreamRequest: IStreamRequest = {
method: '##VirtualStream##',
request: {
streamId: 'myStream123',
cycleId: 'cycle456',
cycle: 'request',
mainPurpose: 'start'
// More properties here...
},
response: {
// Response structure here...
}
};
```
This setup demonstrates creating a request for initializing a virtual stream. Other `mainPurpose` values like 'chunk', 'read', 'end', and 'feedback' can also be used depending on the interaction with the stream.
The examples shown demonstrate the versatility of the `@api.global/typedrequest-interfaces` package in structuring your application's request-response mechanisms, event handling, tagging, and stream management. By following TypeScript and ESM conventions, you can leverage these interfaces to architect robust, typed APIs and services.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,138 @@
---
title: "@api.global/typedrequest"
---
# @api.global/typedrequest
A TypeScript library for making typed requests towards APIs, providing interfaces and classes to handle request/response cycles using typed definitions. It supports building and handling requests, routing based on request types, and virtual stream handling over networks.
## Install
To install `@api.global/typedrequest`, you can use npm or yarn. Run the following command in your project directory:
```
npm install @api.global/typedrequest --save
```
Or, if you prefer yarn:
```
yarn add @api.global/typedrequest
```
This package is designed to facilitate making typed requests to APIs, ensuring that both requests and responses adhere to predefined interfaces. This enhances the predictability and reliability of network communication in applications that interact with APIs.
## Usage
Utilizing `@api.global/typedrequest` involves several core concepts, including the creation of typed requests, handling virtual streams, defining request handlers, and routing requests based on their type. Below are comprehensive examples and explanations of how to use these features in your applications.
### Setting Up a Typed Request
The foundation of `@api.global/typedrequest` is the `TypedRequest` class, which allows you to define requests that are strictly typed. This ensures that both the request sent and the response received match the expected structures.
First, define an interface that represents your request and response data structure:
```typescript
// Define an interface for your request/response structure
interface IUserRequest {
method: 'getUser';
request: { userId: string };
response: { username: string; email: string; };
}
```
Next, create an instance of `TypedRequest` using this interface, and use it to make an API call:
```typescript
import { TypedRequest } from '@api.global/typedrequest';
// Construct a TypedRequest instance for fetching user data
const getUserRequest = new TypedRequest<IUserRequest>('https://your-api.com/users', 'getUser');
// Execute the request with a specific userId and log the response
const userResponse = await getUserRequest.fire({ userId: 'user-123' });
console.log(userResponse.username);
```
### Handling Virtual Streams
`@api.global/typedrequest` introduces the concept of virtual streams, allowing you to manage real-time data transfer over the network as streams. You can create a virtual stream, send data, and read data from it as shown below:
```typescript
import { VirtualStream } from '@api.global/typedrequest';
// Instantiate a VirtualStream for handling real-time data
const myStream = new VirtualStream<ArrayBufferLike>();
// Use the stream to send data
await myStream.sendData(new TextEncoder().encode("Hello, World!"));
// Retrieve data from the stream
const receivedData = await myStream.fetchData();
console.log(new TextDecoder().decode(receivedData));
```
### Defining and Using Handlers
To process requests, you can define handlers that are responsible for specific types of requests:
```typescript
import { TypedHandler } from '@api.global/typedrequest';
interface IAdditionRequest {
method: 'add';
request: { a: number; b: number; };
response: { result: number; };
}
// Create a handler for processing addition requests
const additionHandler = new TypedHandler<IAdditionRequest>('add', async (req) => {
return { result: req.a + req.b };
});
```
### Routing Requests
`TypedRouter` is used to route requests to their appropriate handlers based on the request type:
```typescript
import { TypedRouter } from '@api.global/typedrequest';
const router = new TypedRouter();
// Associate the additionHandler with the router
router.addTypedHandler(additionHandler);
// The router now directs 'add' requests to the additionHandler
```
### Error Handling
`@api.global/typedrequest` provides a `TypedResponseError` class to facilitate error handling in typed requests:
```typescript
import { TypedResponseError } from '@api.global/typedrequest';
// Throw a TypedResponseError with details about the error
throw new TypedResponseError('An error occurred', { detail: 'Error details' });
```
This comprehensive overview covers the essential features provided by `@api.global/typedrequest`. By adhering to defined request and response structures, you can create more reliable and maintainable applications that interact seamlessly with APIs.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,136 @@
---
title: "@api.global/typedserver"
---
```markdown
# @api.global/typedserver
Easy serving of static files
## Install
To install @api.global/typedserver, run the following command in your terminal:
```bash
npm install @api.global/typedserver --save
```
This will add `@api.global/typedserver` to your project's dependencies.
## Usage
`@api.global/typedserver` is designed to make serving static files and handling web requests in a TypeScript environment easy and efficient. It leverages Express under the hood, providing a powerful API for web server creation with additional utilities for live reloading, typed requests/responses, and more, embracing TypeScript's static typing advantages.
### Setting up a Basic Web Server
The following example demonstrates how to set up a basic web server serving files from a directory.
```typescript
import { TypedServer } from '@api.global/typedserver';
const serverOptions = {
port: 8080, // Port to listen on
serveDir: 'public', // Directory to serve static files from
watch: true, // Enable live reloading of changes
injectReload: true, // Inject live reload script into served HTML files
cors: true // Enable CORS
};
const typedServer = new TypedServer(serverOptions);
async function startServer() {
await typedServer.start();
console.log(`Server is running on http://localhost:${serverOptions.port}`);
}
startServer().catch(console.error);
```
In the example above, `TypedServer` is instantiated with an `IServerOptions` object specifying options like the port to listen on (`8080`), the directory containing static files to serve (`public`), and live reload features. Calling `start()` on the `typedServer` instance initiates the server.
### Using Typed Requests and Responses
`TypedServer` supports typed requests and responses, making API development more robust and maintainable. Define your request and response types, and use them to type-check incoming requests and their responses.
First, define the types:
```typescript
// Define a request type
interface MyCustomRequest {
userId: string;
}
// Define a response type
interface MyCustomResponse {
userName: string;
}
```
Next, set up a route to handle requests using these types:
```typescript
import { TypedRouter, TypedHandler } from '@api.global/typedrequest';
// Instantiate a TypedRouter
const typedRouter = new TypedRouter();
// Register a route with request and response types
typedRouter.addTypedHandler<MyCustomRequest, MyCustomResponse>(
new TypedHandler('getUser', async (requestData) => {
// Implement your logic here. For example, fetch user data from a database.
const userData = { userName: 'John Doe' }; // Dummy implementation
return { response: userData };
})
);
// Bind the typed router to the server
typedServer.useTypedRouter(typedRouter);
// Now, the route is set up to handle requests with type checking
```
This example shows defining types for requests and responses, creating a `TypedRouter`, and adding a route with typed handling. This feature brings the benefits of TypeScript's static type checking to server-side logic, improving the development experience.
### Enabling SSL/TLS
To enable SSL/TLS, configure the `TypedServer` with the SSL options, including the paths to your SSL certificate and key files:
```typescript
const serverOptions = {
port: 443,
serveDir: 'public',
watch: true,
injectReload: true,
cors: true,
privateKey: fs.readFileSync('path/to/ssl/private.key'),
publicKey: fs.readFileSync('path/to/ssl/certificate.crt')
};
const typedServer = new TypedServer(serverOptions);
startServer().catch(console.error);
```
Replace `'path/to/ssl/private.key'` and `'path/to/ssl/certificate.crt'` with the actual paths to your SSL key and certificate files. This setup ensures that your server communicates over HTTPS, encrypting the data transmitted between the client and the server.
### Conclusion
`@api.global/typedserver` offers a streamlined way to set up a web server with TypeScript, featuring static file serving, live reloading, typed request/response handling, and SSL support. This guide covers the basic usage, but `TypedServer` is highly configurable, catering to various hosting and development needs.
```
For a deeper dive into the API and more advanced configurations, refer to the official documentation and type definitions included in the package.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,162 @@
---
title: "@api.global/typedsocket"
---
# @api.global/typedsocket
a typedrequest extension supporting websockets
## Install
To install `@api.global/typedsocket` in your project, run the following command using npm:
```bash
npm install @api.global/typedsocket --save
```
For Yarn users:
```bash
yarn add @api.global/typedsocket
```
## Usage
To utilize `@api.global/typedsocket` effectively, let's explore how to integrate it into a project with TypeScript. This guide provides comprehensive usage scenarios, highlighting all features of the module. `@api.global/typedsocket` extends the capabilities of `typedrequest` by integrating websocket support, allowing for real-time, bidirectional communication between a client and server.
### Getting Started
#### Prerequisites
Before diving into examples, ensure you have the following:
- A basic understanding of TypeScript and Node.js.
- An existing project set up with TypeScript.
- `@api.global/typedrequest` and its dependencies installed in your project.
#### Initialization
First, let's import the required modules and initialize our server and client instances.
**Server Side:**
Within your server-side code, import and set up `TypedSocket` to create a websocket server.
```typescript
import { TypedSocket } from '@api.global/typedsocket';
import * as typedrequest from '@api.global/typedrequest';
// Initialize your TypedRouter
const typedRouter = new typedrequest.TypedRouter();
// Create the TypedSocket server
const server = await TypedSocket.createServer(typedRouter);
// Optionally, you can provide a smartexpressServerArg if you have an existing SmartExpress server
```
**Client Side:**
On the client side, initialize `TypedSocket` to connect to the websocket server.
```typescript
import { TypedSocket } from '@api.global/typedsocket';
// Assuming server is at http://localhost:3000
const client = await TypedSocket.createClient(typedRouter, 'http://localhost:3000');
```
### Defining Typed Requests
`@api.global/typedsocket` leverages `typedrequest` for type-safe requests and responses. Here's how you can define and handle typed requests:
**Defining a Typed Request Interface:**
Define an interface for the request and its corresponding response.
```typescript
interface ExampleRequest extends typedrequestInterfaces.ITypedRequest {
method: 'exampleMethod';
request: {
message: string;
};
response: {
reply: string;
};
}
```
**Handling Requests on the Server:**
Add a typed handler for the request in your `TypedRouter`.
```typescript
typedRouter.addTypedHandler<ExampleRequest>(
new typedrequest.TypedHandler('exampleMethod', async (requestData) => {
return {
reply: `Server received: ${requestData.message}`,
};
})
);
```
### Sending Requests from the Client
Use the client instance to send a request to the server and await a response.
```typescript
const exampleRequest = client.createTypedRequest<ExampleRequest>('exampleMethod');
const response = await exampleRequest.fire({
message: 'Hello from client!',
});
console.log(response.reply); // "Server received: Hello from client!"
```
### Advanced Usage
#### Tagging Connections
For more refined control, especially in scenarios with multiple clients, you can tag connections for targeted communication.
```typescript
// Add a tag to a client
client.addTag('role', 'admin');
// On the server, find connections with the tag
const adminConnections = await server.findAllTargetConnectionsByTag('role', 'admin');
// Send a message to all admin connections
for (const adminConnection of adminConnections) {
const request = server.createTypedRequest<ExampleRequest>('exampleMethod', adminConnection);
await request.fire({
message: 'Message to admins',
});
}
```
#### Handling Reconnections
`TypedSocket` automatically attempts to reconnect in the event of connection loss. Ensure your server and client logic accounts for reconnection, especially for maintaining state or re-subscribing to necessary events.
### Conclusion
Implementing `@api.global/typedsocket` provides a type-safe, real-time communication layer for your TypeScript applications, extending the functionality of `typedrequest` into the realm of websockets. This guide covered initialization, defining typed requests, sending requests, and advanced usage patterns like tagging connections and handling reconnections.
Integrating `@api.global/typedsocket` into your project harnesses the power of websockets with the benefits of type safety and structured request/response patterns, enabling more reliable and maintainable real-time applications.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,40 @@
---
title: "@apiclient.xyz/abuse.ch"
---
# @apiclient.xyz/abuse.ch
an unofficial client to retrieve abuse.ch data
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@apiclient.xyz/abuse.ch)
* [gitlab.com (source)](https://gitea.lossless.digital/apiclient.xyz/abuse.ch)
* [github.com (source mirror)](https://github.com/apiclient.xyz/abuse.ch)
* [docs (typedoc)](https://apiclient.xyz.gitlab.io/abuse.ch/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitea.lossless.digital/apiclient.xyz/abuse.ch/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitea.lossless.digital/apiclient.xyz/abuse.ch/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@apiclient.xyz/abuse.ch)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/apiclient.xyz/abuse.ch)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@apiclient.xyz/abuse.ch)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@apiclient.xyz/abuse.ch)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@apiclient.xyz/abuse.ch)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
## Legal
> MIT licensed | **&copy;** [Task Venture Capital GmbH](https://task.vc)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/bobcat"
---
# @mojoio/bobcat
a module to talk to bobcat miners
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/bobcat)
* [gitlab.com (source)](https://gitlab.com/mojoio/bobcat)
* [github.com (source mirror)](https://github.com/mojoio/bobcat)
* [docs (typedoc)](https://mojoio.gitlab.io/bobcat/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/bobcat/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/bobcat/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/bobcat)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/bobcat)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/bobcat)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/bobcat)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/bobcat)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/bunq"
---
# @mojoio/bunq
a bunq api abstraction package
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/bunq)
* [gitlab.com (source)](https://gitlab.com/mojoio/bunq)
* [github.com (source mirror)](https://github.com/mojoio/bunq)
* [docs (typedoc)](https://mojoio.gitlab.io/bunq/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/bunq/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/bunq/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/bunq)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/bunq)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/bunq)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/bunq)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/bunq)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use Typescript for best in class intellisense.
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,253 @@
---
title: "@apiclient.xyz/cloudflare"
---
# @apiclient.xyz/cloudflare
easy cloudflare management
## Install
To install the `@apiclient.xyz/cloudflare` package, you can use npm. Simply run the following command:
```bash
npm install @apiclient.xyz/cloudflare
```
Make sure to include it in your `dependencies` in `package.json`.
## Usage
### Initial Setup
First, let's start by importing the required modules and setting up an instance of `CloudflareAccount` with your API token. This instance will be used to interact with the Cloudflare API.
```typescript
import * as cflare from '@apiclient.xyz/cloudflare';
// Initialize Cloudflare Account
const myCflareAccount = new cflare.CloudflareAccount('mySuperAwesomeAccountToken');
```
### Managing Zones
#### List All Zones
To list all zones in your Cloudflare account, you can use the `listZones` method:
```typescript
const listAllZones = async () => {
const myZones = await myCflareAccount.convenience.listZones();
console.log(myZones);
};
```
#### Get Zone ID
To get the ID of a specific zone (domain), use the `getZoneId` method:
```typescript
const getZoneId = async (domainName: string) => {
try {
const zoneId = await myCflareAccount.convenience.getZoneId(domainName);
console.log(`Zone ID for ${domainName}:`, zoneId);
} catch (error) {
console.error('Error getting zone ID:', error);
}
};
```
#### Purge Cache for a Zone
To purge all cache for a specific zone:
```typescript
const purgeZoneCache = async (domainName: string) => {
await myCflareAccount.convenience.purgeZone(domainName);
console.log(`Purged cache for ${domainName}`);
};
```
### Managing DNS Records
#### List DNS Records
To list all DNS records for a specific zone:
```typescript
const listDnsRecords = async (domainName: string) => {
try {
const records = await myCflareAccount.convenience.listRecords(domainName);
console.log(`DNS Records for ${domainName}:`, records);
} catch (error) {
console.error('Error listing DNS records:', error);
}
};
```
#### Get a Specific Record
To get a specific DNS record by type (e.g., A, AAAA, CNAME, etc.):
```typescript
const getDnsRecord = async (domainName: string, recordType: string) => {
try {
const record = await myCflareAccount.convenience.getRecord(domainName, recordType);
console.log(`DNS Record (${recordType}) for ${domainName}:`, record);
} catch (error) {
console.error('Error getting DNS record:', error);
}
};
```
#### Create a DNS Record
To create a new DNS record:
```typescript
const createDnsRecord = async (domainName: string, recordType: string, content: string) => {
try {
const response = await myCflareAccount.convenience.createRecord(domainName, recordType, content, 120);
console.log(`Created DNS record (${recordType}) for ${domainName}:`, response);
} catch (error) {
console.error('Error creating DNS record:', error);
}
};
```
#### Remove a DNS Record
To remove a DNS record:
```typescript
const removeDnsRecord = async (domainName: string, recordType: string) => {
try {
await myCflareAccount.convenience.removeRecord(domainName, recordType);
console.log(`Removed DNS record (${recordType}) for ${domainName}`);
} catch (error) {
console.error('Error removing DNS record:', error);
}
};
```
#### Clean a DNS Record
To clean (remove) all records of a specific type for a domain:
```typescript
const cleanDnsRecord = async (domainName: string, recordType: string) => {
try {
await myCflareAccount.convenience.cleanRecord(domainName, recordType);
console.log(`Cleaned DNS records (${recordType}) for ${domainName}`);
} catch (error) {
console.error('Error cleaning DNS record:', error);
}
};
```
### Managing Workers
#### Create a Worker
To create a new Cloudflare Worker:
```typescript
const createWorker = async (workerName: string, workerScript: string) => {
try {
const worker = await myCflareAccount.workerManager.createWorker(workerName, workerScript);
console.log(`Created Worker (${workerName}):`, worker);
} catch (error) {
console.error('Error creating Worker:', error);
}
};
```
#### List Workers
To list all workers in your Cloudflare account:
```typescript
const listWorkers = async () => {
try {
const workers = await myCflareAccount.workerManager.listWorkers();
console.log('Workers:', workers);
} catch (error) {
console.error('Error listing workers:', error);
}
};
```
#### Set Worker Routes
To set routes for a Cloudflare Worker:
```typescript
import { CloudflareWorker } from '@apiclient.xyz/cloudflare';
const setWorkerRoutes = async (worker: CloudflareWorker, routes: Array<{ zoneName: string, pattern: string }>) => {
try {
await worker.setRoutes(routes);
console.log('Routes set successfully for Worker:', worker.id);
} catch (error) {
console.error('Error setting routes for Worker:', error);
}
};
```
#### Sample Complete Workflow
Below is a sample workflow that includes all the above features:
```typescript
import * as cflare from '@apiclient.xyz/cloudflare';
const myCflareAccount = new cflare.CloudflareAccount('mySuperAwesomeAccountToken');
const manageCloudflare = async () => {
try {
// List all zones
const myZones = await myCflareAccount.convenience.listZones();
console.log('Zones:', myZones);
// Get Zone ID for a specific domain
const myZoneId = await myCflareAccount.convenience.getZoneId('example.com');
console.log('Zone ID:', myZoneId);
// Purge cache for a zone
await myCflareAccount.convenience.purgeZone('example.com');
console.log('Cache purged for example.com');
// List DNS records for a domain
const myRecords = await myCflareAccount.convenience.listRecords('example.com');
console.log('DNS Records:', myRecords);
// Get a specific DNS record
const myRecord = await myCflareAccount.convenience.getRecord('sub.example.com', 'A');
console.log('Specific DNS Record:', myRecord);
// Create a DNS record
const createResponse = await myCflareAccount.convenience.createRecord('sub.example.com', 'A', '127.0.0.1');
console.log('Created DNS Record:', createResponse);
// Clean DNS records
await myCflareAccount.convenience.cleanRecord('sub.example.com', 'A');
console.log('Cleaned DNS Records for sub.example.com');
// Create a Cloudflare Worker
const myWorker = await myCflareAccount.workerManager.createWorker('myWorker', `addEventListener('fetch', event => { event.respondWith(fetch(event.request)) })`);
console.log('Created Worker:', myWorker);
// Set routes for the Worker
await myWorker.setRoutes([{ zoneName: 'example.com', pattern: 'https://*example.com/*' }]);
console.log('Routes set for Worker');
// List all Workers
const workers = await myCflareAccount.workerManager.listWorkers();
console.log('Workers:', workers);
} catch (error) {
console.error('Error managing Cloudflare:', error);
}
};
manageCloudflare();
```
This complete guide covers initialization, managing Cloudflare zones, DNS records, and Cloudflare Workers comprehensively using TypeScript for enhanced type safety and intellisense. Always ensure to keep your API keys secure and avoid hardcoding them directly in your scripts.
undefined

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/datev"
---
# @mojoio/datev
an unofficial api client for the datev connect online xml api
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/datev)
* [gitlab.com (source)](https://gitlab.com/mojoio/datev)
* [github.com (source mirror)](https://github.com/mojoio/datev)
* [docs (typedoc)](https://mojoio.gitlab.io/datev/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/datev/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/datev/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/datev)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/datev)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/datev)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/datev)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/datev)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,155 @@
---
title: "@apiclient.xyz/docker"
---
# @apiclient.xyz/docker
easy communication with docker remote api from node, TypeScript ready
## Install
To install @apiclient.xyz/docker, you can use npm (npm package manager). Run the following command in your terminal:
```bash
npm install @apiclient.xyz/docker --save
```
This command installs the package and adds it as a dependency to your project's `package.json` file.
## Usage
The `@apiclient.xyz/docker` package provides a TypeScript-ready interface for interacting with Docker's Remote API directly from Node.js applications. It leverages TypeScript for strong type definitions, ensuring more reliable and maintainable code.
### Prerequisites
Before you begin, ensure:
- You have Docker installed and running on your machine or a remote server.
- You are familiar with TypeScript and have it set up in your development environment.
### Getting Started
First, import the required classes from the package:
```typescript
import { DockerHost, DockerContainer, DockerService, DockerNetwork } from '@apiclient.xyz/docker';
```
### Instantiate DockerHost
Start by creating a `DockerHost` instance. This class is the entry point to communicate with the Docker Remote API.
```typescript
// Connect to local Docker instance
const localDockerHost = new DockerHost();
// Or specify a custom path or URL to a Docker host
const remoteDockerHost = new DockerHost('tcp://<REMOTE_DOCKER_HOST>:2375');
```
### Working with Containers
#### List All Containers
```typescript
async function listAllContainers() {
const containers = await localDockerHost.getContainers();
console.log(containers);
}
listAllContainers();
```
#### Create and Remove a Container
```typescript
import { IContainerCreationDescriptor } from '@apiclient.xyz/docker';
async function createAndRemoveContainer() {
const containerDescriptor: IContainerCreationDescriptor = {
Hostname: 'test-container',
Domainname: '',
// Additional settings here
};
// Create container
const container = await DockerContainer.create(localDockerHost, containerDescriptor);
console.log(`Container Created: ${container.Id}`);
// Remove container
await container.remove();
console.log(`Container Removed: ${container.Id}`);
}
createAndRemoveContainer();
```
### Working with Docker Services
#### Create a Docker Service
```typescript
import { IServiceCreationDescriptor } from '@apiclient.xyz/docker';
async function createDockerService() {
const serviceDescriptor: IServiceCreationDescriptor = {
name: 'my-service',
image: 'nginx:latest', // Docker Image
// Additional settings
};
const service = await DockerService.createService(localDockerHost, serviceDescriptor);
console.log(`Service Created: ${service.Id}`);
}
createDockerService();
```
### Working with Docker Networks
#### Listing and Creating Networks
```typescript
async function listAndCreateNetwork() {
// List all networks
const networks = await localDockerHost.getNetworks();
console.log(networks);
// Create a new network
const network = await DockerNetwork.createNetwork(localDockerHost, {
Name: 'my-network'
// Additional settings
});
console.log(`Network Created: ${network.Id}`);
}
listAndCreateNetwork();
```
### Advanced Usage
You can leverage the full potential of the Docker Remote API with `@apiclient.xyz/docker`. This includes managing images, volumes, swarms, and more. The package's design is consistent and intuitive, making it easy to extend your usage as needed.
Remember, the Docker Remote API offers extensive capabilities. Always refer to the [Docker API documentation](https://docs.docker.com/engine/api/latest/) for a comprehensive list of endpoints and actions you can perform.
### Conclusion
`@apiclient.xyz/docker` simplifies interaction with Docker's Remote API in TypeScript projects, providing strong typing and asynchronous operations. Whether you're managing containers, images, services or networks, it offers a comprehensive toolset to perform these tasks seamlessly.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,51 @@
---
title: "@apiclient.xyz/elasticsearch"
---
# @mojoio/elasticsearch
log to elasticsearch in a kibana compatible format
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/elasticsearch)
* [gitlab.com (source)](https://gitlab.com/mojoio/elasticsearch)
* [github.com (source mirror)](https://github.com/mojoio/elasticsearch)
* [docs (typedoc)](https://mojoio.gitlab.io/elasticsearch/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/elasticsearch/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/elasticsearch/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/elasticsearch)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/elasticsearch)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/elasticsearch)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/elasticsearch)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/elasticsearch)](https://lossless.cloud)
## Usage
Use TypeScript for best in class instellisense.
For further information read the linked docs at the top of this README.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://pushrocks.gitlab.io/assets/repo-footer.svg)](https://push.rocks)
## Contribute
We are always happy for code contributions. If you are not the code contributing type that is ok. + Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: [Contribute monthly :)](https://lossless.link/contribute)
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
## Legal
> MIT licensed | **&copy;** [Task Venture Capital GmbH](https://task.vc)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)

View File

@ -0,0 +1,265 @@
---
title: "@apiclient.xyz/ghost"
---
# @apiclient.xyz/ghost
An unofficial Ghost API package
## Install
To install the @apiclient.xyz/ghost package, you can use npm or yarn. Make sure you're using a package manager that supports ESM and TypeScript.
NPM:
```bash
npm install @apiclient.xyz/ghost
```
Yarn:
```bash
yarn add @apiclient.xyz/ghost
```
## Usage
Below is a detailed guide on how to use the `@apiclient.xyz/ghost` package in your TypeScript projects. We will cover everything from initialization to advanced usage scenarios.
### Initialization
First, you need to import the necessary classes and initialize the Ghost instance with the required API keys.
```typescript
import { Ghost } from '@apiclient.xyz/ghost';
// Initialize the Ghost instance
const ghostInstance = new Ghost({
baseUrl: 'https://your-ghost-url.com',
contentApiKey: 'your-content-api-key',
adminApiKey: 'your-admin-api-key'
});
```
### Basic Usage
#### Fetching Posts
You can fetch posts with the following method. This will give you an array of `Post` instances.
```typescript
// Fetch all posts
const posts = await ghostInstance.getPosts();
// Print titles of all posts
posts.forEach(post => {
console.log(post.getTitle());
});
```
#### Fetching a Single Post by ID
To fetch a single post by its ID:
```typescript
const postId = 'your-post-id';
const post = await ghostInstance.getPostById(postId);
console.log(post.getTitle());
console.log(post.getHtml());
```
### Post Class Methods
The `Post` class has several methods that can be useful for different scenarios.
#### Getting Post Data
These methods allow you to retrieve various parts of the post data.
```typescript
const postId = post.getId();
const postTitle = post.getTitle();
const postHtml = post.getHtml();
const postExcerpt = post.getExcerpt();
const postFeatureImage = post.getFeatureImage();
console.log(`ID: ${postId}`);
console.log(`Title: ${postTitle}`);
console.log(`HTML: ${postHtml}`);
console.log(`Excerpt: ${postExcerpt}`);
console.log(`Feature Image: ${postFeatureImage}`);
```
#### Updating a Post
To update a post, you can use the `update` method. Make sure you have the necessary permissions and fields.
```typescript
const updatedPostData = {
...post.toJson(),
title: 'Updated Title',
html: '<p>Updated HTML content</p>'
};
await post.update(updatedPostData);
console.log('Post updated successfully');
```
#### Deleting a Post
To delete a post:
```typescript
await post.delete();
console.log('Post deleted successfully');
```
### Advanced Scenarios
#### Creating a New Post
You can create a new post using the `createPost` method of the `Ghost` class.
```typescript
const newPostData = {
id: 'new-post-id',
title: 'New Post Title',
html: '<p>This is the content of the new post.</p>',
excerpt: 'New post excerpt',
feature_image: 'https://your-image-url.com/image.jpg'
};
const newPost = await ghostInstance.createPost(newPostData);
console.log('New post created successfully');
console.log(`ID: ${newPost.getId()}`);
console.log(`Title: ${newPost.getTitle()}`);
```
#### Error Handling
Both the `Ghost` and `Post` classes throw errors that you can catch and handle.
```typescript
try {
const posts = await ghostInstance.getPosts();
console.log('Posts fetched successfully');
} catch (error) {
console.error('Error fetching posts:', error);
}
```
Similarly, for updating or deleting a post:
```typescript
try {
await post.update({ title: 'Updated Title' });
console.log('Post updated successfully');
} catch (error) {
console.error('Error updating post:', error);
}
try {
await post.delete();
console.log('Post deleted successfully');
} catch (error) {
console.error('Error deleting post:', error);
}
```
#### Fetching Posts with Filters and Options
The `getPosts` method can accept various filters and options.
```typescript
const filteredPosts = await ghostInstance.getPosts({ limit: 10, include: 'tags,authors' });
filteredPosts.forEach(post => {
console.log(post.getTitle());
});
```
### Example Projects
To give you a comprehensive understanding, let's look at a couple of example projects.
#### Example 1: A Basic Blog
In this scenario, we will create a simple script to fetch all posts and display their titles.
```typescript
import { Ghost } from '@apiclient.xyz/ghost';
(async () => {
const ghostInstance = new Ghost({
baseUrl: 'https://your-ghost-url.com',
contentApiKey: 'your-content-api-key',
adminApiKey: 'your-admin-api-key'
});
try {
const posts = await ghostInstance.getPosts();
posts.forEach(post => console.log(post.getTitle()));
} catch (error) {
console.error('Error fetching posts:', error);
}
})();
```
#### Example 2: Post Management Tool
In this example, let's create a tool that can fetch, create, update, and delete posts.
```typescript
import { Ghost, Post, IPostOptions } from '@apiclient.xyz/ghost';
const ghostInstance = new Ghost({
baseUrl: 'https://your-ghost-url.com',
contentApiKey: 'your-content-api-key',
adminApiKey: 'your-admin-api-key'
});
(async () => {
// Fetch posts
const posts = await ghostInstance.getPosts();
console.log('Fetched posts:');
posts.forEach(post => console.log(post.getTitle()));
// Create a new post
const newPostData: IPostOptions = {
id: 'new-post-id',
title: 'New Post Title',
html: '<p>This is the content of the new post.</p>',
};
const newPost = await ghostInstance.createPost(newPostData);
console.log('New post created:', newPost.getTitle());
// Update the new post
const updatedPost = await newPost.update({ title: 'Updated Post Title' });
console.log('Post updated:', updatedPost.getTitle());
// Delete the new post
await updatedPost.delete();
console.log('Post deleted');
})();
```
### Unit Tests
This package includes unit tests written using the `@push.rocks/tapbundle` and `@push.rocks/qenv` libraries. Here is how you can run them.
1. Install the development dependencies:
```bash
npm install
```
2. Run the tests:
```bash
npm test
```
### Conclusion
The `@apiclient.xyz/ghost` package provides a comprehensive and type-safe way to interact with the Ghost CMS API using TypeScript. The features provided by the `Ghost` and `Post` classes allow for a wide range of interactions, from basic CRUD operations to advanced filtering and error handling.
For more information, please refer to the [documentation](https://apiclient.xyz.gitlab.io/ghost/).
undefined

View File

@ -0,0 +1,49 @@
---
title: "@apiclient.xyz/gitlab"
---
# @mojoio/gitlab
a gitlab api abstraction package
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/gitlab)
* [gitlab.com (source)](https://gitlab.com/mojoio/gitlab)
* [github.com (source mirror)](https://github.com/mojoio/gitlab)
* [docs (typedoc)](https://mojoio.gitlab.io/gitlab/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/gitlab/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/gitlab/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/gitlab)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/gitlab)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/gitlab)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/gitlab)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/gitlab)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class instellisense.
For further information read the linked docs at the top of this README.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://mojoio.gitlab.io/assets/repo-footer.svg)](https://mojo.io)
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,71 @@
---
title: "@apiclient.xyz/helium"
---
# @mojoio/helium
a helium api package
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/helium)
* [gitlab.com (source)](https://gitlab.com/mojoio/helium)
* [github.com (source mirror)](https://github.com/mojoio/helium)
* [docs (typedoc)](https://mojoio.gitlab.io/helium/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/helium/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/helium/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/helium)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/helium)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/helium)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/helium)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/helium)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
```typescript
import { expect, tap } from '@pushrocks/tapbundle';
import * as helium from '@mojoio/helium';
let testHelium: helium.Helium;
tap.test('should create a valid helium class', async () => {
testHelium = new helium.Helium();
expect(testHelium).toBeInstanceOf(helium.Helium);
});
tap.test('should create and update a wallet', async () => {
const wallet = await testHelium.addWalletByAddress('13L7By1BmboTx1hRUuN3MtMjNmTFaWj5C6EbRZCK2sceaRCWZev');
expect(wallet).toBeInstanceOf(helium.HeliumWallet);
console.log(wallet.earningsHnt24h);
console.log(wallet.earningsHnt7d);
console.log(wallet.earningsHnt14d);
console.log(wallet.earningsHnt30d);
console.log(wallet.hotspots);
expect(wallet.hotspots[0]).toBeInstanceOf(helium.HeliumHotspot);
// you can call wallet.update() at any time to update all wallet information
// also wallet.hotspots[0].update() will only update an individual hotspot;
})
tap.start();
```
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,270 @@
---
title: "@apiclient.xyz/hetznercloud"
---
# @apiclient.xyz/hetznercloud
An unofficial API client for the Hetzner Cloud API
## Install
You can install the `@apiclient.xyz/hetznercloud` package via npm:
```bash
npm install @apiclient.xyz/hetznercloud
```
Or using yarn:
```bash
yarn add @apiclient.xyz/hetznercloud
```
## Usage
The `@apiclient.xyz/hetznercloud` package provides a modern approach to interact with the Hetzner Cloud API. Below are some detailed examples demonstrating the usage of this package for different scenarios like managing accounts, servers, volumes, and firewalls.
### Initial Setup
To begin using the package, you need to import it and initialize your Hetzner account with an API token:
```typescript
import { HetznerAccount, HetznerServer, Volume, HetznerFirewall } from '@apiclient.xyz/hetznercloud';
// Initialize Hetzner account
const myHetznerAccount = new HetznerAccount('yourHetznerApiToken');
```
### Managing Servers
#### Creating a Server
You can create a new server using the `createServer` method in the `HetznerAccount` class. Provide the necessary options such as name, type, location, labels, and optional user data:
```typescript
const newServer = await myHetznerAccount.createServer({
name: 'my-server',
type: 'cpx31',
location: 'nbg1',
labels: {
purpose: 'test'
},
userData: '#!/bin/bash\necho Hello from your new server!'
});
console.log('New server details:', newServer.data);
```
#### Listing Servers
To list all servers in your account, you can use the `getServers` method:
```typescript
const servers = await myHetznerAccount.getServers();
console.log('Current servers:', servers);
```
#### Filtering Servers by Labels
You can filter servers based on specific labels:
```typescript
const filteredServers = await myHetznerAccount.getServersByLabel({ purpose: 'test' });
console.log('Filtered servers:', filteredServers);
```
#### Deleting a Server
To delete a server, call the `delete` method on the server instance:
```typescript
const serverToDelete = filteredServers[0]; // Example, choose the first filtered server
await serverToDelete.delete();
console.log('Server deleted successfully');
```
### Managing Volumes
#### Creating a Volume
To create a new volume, use the `Volume.create` method, passing in the necessary options:
```typescript
const newVolume = await Volume.create(myHetznerAccount, {
name: 'my-volume',
size: 10, // Size in GB
location: 'nbg1',
labels: {
purpose: 'test-volume'
},
server: newServer // Attach the volume to a specific server (newServer in this case)
});
console.log('New volume details:', newVolume.data);
```
#### Listing Volumes
You can list all volumes in your account with the `getVolumes` method:
```typescript
const volumes = await Volume.getVolumes(myHetznerAccount);
console.log('Current volumes:', volumes);
```
#### Filtering Volumes by Labels
To filter volumes based on specific labels:
```typescript
const filteredVolumes = await Volume.getVolumesByLabel(myHetznerAccount, { purpose: 'test-volume' });
console.log('Filtered volumes:', filteredVolumes);
```
#### Deleting a Volume
To delete a volume, call the `delete` method on the volume instance:
```typescript
const volumeToDelete = filteredVolumes[0]; // Example, choose the first filtered volume
await volumeToDelete.delete();
console.log('Volume deleted successfully');
```
### Managing Firewalls
#### Creating a Firewall
To create a new firewall, use the `create` method in the `HetznerFirewall` class:
```typescript
const newFirewall = await HetznerFirewall.create(myHetznerAccount, {
name: 'my-firewall',
labels: {
purpose: 'test-firewall'
},
rules: [
{
direction: 'in',
protocol: 'tcp',
port: '80',
source_ips: ['0.0.0.0/0', '::/0']
},
{
direction: 'in',
protocol: 'tcp',
port: '443',
source_ips: ['0.0.0.0/0', '::/0']
}
]
});
console.log('New firewall details:', newFirewall.data);
```
#### Listing Firewalls
To list all firewalls in your account:
```typescript
const firewalls = await HetznerFirewall.getFirewalls(myHetznerAccount);
console.log('Current firewalls:', firewalls);
```
#### Filtering Firewalls by Labels
To filter firewalls based on specific labels:
```typescript
const filteredFirewalls = await HetznerFirewall.getFirewallsByLabel(myHetznerAccount, { purpose: 'test-firewall' });
console.log('Filtered firewalls:', filteredFirewalls);
```
#### Deleting a Firewall
To delete a firewall, call the `delete` method on the firewall instance:
```typescript
const firewallToDelete = filteredFirewalls[0]; // Example, choose the first filtered firewall
await firewallToDelete.delete();
console.log('Firewall deleted successfully');
```
### Example: Full Lifecycle Management
Here is a complete example that demonstrates the full lifecycle of creating, listing, filtering, and deleting servers, volumes, and firewalls:
```typescript
import { HetznerAccount, HetznerServer, Volume, HetznerFirewall } from '@apiclient.xyz/hetznercloud';
// Initialize Hetzner account
const myHetznerAccount = new HetznerAccount('yourHetznerApiToken');
// Step 1: Create a new server
const newServer = await myHetznerAccount.createServer({
name: 'my-server',
type: 'cpx31',
location: 'nbg1',
labels: { purpose: 'test' },
userData: '#!/bin/bash\necho Hello from your new server!'
});
console.log('New server created:', newServer.data);
// Step 2: Create a new volume and attach it to the server
const newVolume = await Volume.create(myHetznerAccount, {
name: 'my-volume',
size: 10, // GB
location: 'nbg1',
labels: { purpose: 'test-volume' },
server: newServer
});
console.log('New volume created:', newVolume.data);
// Step 3: Create a new firewall and attach rules to it
const newFirewall = await HetznerFirewall.create(myHetznerAccount, {
name: 'my-firewall',
labels: { purpose: 'test-firewall' },
rules: [
{ direction: 'in', protocol: 'tcp', port: '80', source_ips: ['0.0.0.0/0', '::/0'] },
{ direction: 'in', protocol: 'tcp', port: '443', source_ips: ['0.0.0.0/0', '::/0'] }
]
});
console.log('New firewall created:', newFirewall.data);
// Step 4: List all servers, volumes, and firewalls
const servers = await myHetznerAccount.getServers();
console.log('All servers:', servers);
const volumes = await Volume.getVolumes(myHetznerAccount);
console.log('All volumes:', volumes);
const firewalls = await HetznerFirewall.getFirewalls(myHetznerAccount);
console.log('All firewalls:', firewalls);
// Step 5: Filter servers, volumes, and firewalls by labels
const filteredServers = await myHetznerAccount.getServersByLabel({ purpose: 'test' });
console.log('Filtered servers:', filteredServers);
const filteredVolumes = await Volume.getVolumesByLabel(myHetznerAccount, { purpose: 'test-volume' });
console.log('Filtered volumes:', filteredVolumes);
const filteredFirewalls = await HetznerFirewall.getFirewallsByLabel(myHetznerAccount, { purpose: 'test-firewall' });
console.log('Filtered firewalls:', filteredFirewalls);
// Step 6: Cleanup - Delete created resources
for (const server of filteredServers) {
await server.delete();
console.log('Server deleted:', server.data);
}
for (const volume of filteredVolumes) {
await volume.delete();
console.log('Volume deleted:', volume.data);
}
for (const firewall of filteredFirewalls) {
await firewall.delete();
console.log('Firewall deleted:', firewall.data);
}
```
This comprehensive example demonstrates how you can manage your Hetzner resources using the `@apiclient.xyz/hetznercloud` package efficiently and effectively.
undefined

View File

@ -0,0 +1,35 @@
---
title: "@apiclient.xyz/kubernetes"
---
# @mojoio/kubernetes
a simmplified kubernetes api abstraction
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/kubernetes)
* [gitlab.com (source)](https://gitlab.com/mojoio/kubernetes)
* [github.com (source mirror)](https://github.com/mojoio/kubernetes)
* [docs (typedoc)](https://mojoio.gitlab.io/kubernetes/)
## Status for master
[![pipeline status](https://gitlab.com/mojoio/kubernetes/badges/master/pipeline.svg)](https://gitlab.com/mojoio/kubernetes/commits/master)
[![coverage report](https://gitlab.com/mojoio/kubernetes/badges/master/coverage.svg)](https://gitlab.com/mojoio/kubernetes/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@mojoio/kubernetes.svg)](https://www.npmjs.com/package/@mojoio/kubernetes)
[![Known Vulnerabilities](https://snyk.io/test/npm/@mojoio/kubernetes/badge.svg)](https://snyk.io/test/npm/@mojoio/kubernetes)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
a simplified kubernetes api abstraction
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,53 @@
---
title: "@apiclient.xyz/letterxpress"
---
# @mojoio/letterxpress
an unofficial API package for the letterxpress API
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/letterxpress)
* [gitlab.com (source)](https://gitlab.com/mojoio/letterxpress)
* [github.com (source mirror)](https://github.com/mojoio/letterxpress)
* [docs (typedoc)](https://mojoio.gitlab.io/letterxpress/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/letterxpress/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/letterxpress/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/letterxpress)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/letterxpress)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/letterxpress)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/letterxpress)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/letterxpress)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense.
letterxpress implements the LXP API documented here: [LXP API Documentation](https://www.letterxpress.de/briefe-uebertragen/api)
```typescript
import * as letterxpress from '@mojoio/letterxpress';
const account = new letterxpress.LetterXpressAccount({
email: 'myemail@example.com',
apiToken: 'abcdefghijklmnop1234567890',
});
```
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/lexoffice"
---
# @mojoio/lexoffice
an unofficial api client for lexoffice
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/lexoffice)
* [gitlab.com (source)](https://gitlab.com/mojoio/lexoffice)
* [github.com (source mirror)](https://github.com/mojoio/lexoffice)
* [docs (typedoc)](https://mojoio.gitlab.io/lexoffice/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/lexoffice/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/lexoffice/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/lexoffice)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/lexoffice)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/lexoffice)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/lexoffice)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/lexoffice)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,84 @@
---
title: "@apiclient.xyz/logdna"
---
# @mojoio/logdna
an unoffical package for the logdna api
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/logdna)
* [gitlab.com (source)](https://gitlab.com/mojoio/logdna)
* [github.com (source mirror)](https://github.com/mojoio/logdna)
* [docs (typedoc)](https://mojoio.gitlab.io/logdna/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/logdna/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/logdna/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/logdna)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/logdna)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/logdna)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/logdna)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/logdna)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class instellisense.
This package is an unofficial package for the logdna.com service. It comes with the following features:
- aggregate logs that require the same uri query parameters and sends them as bundle. This ensures the correct order of logs within logdna.
- resend logs that failed to send.
- support smartlog messages and the smartlog ecosystem
- support giraffe.cloud ecosystem
```typescript
import { ILogPackage } from '@pushrocks/smartlog-interfaces';
import { LogdnaAccount, LogdnaMessage } from '@mojoio/logdna';
// lets create a logDnaAccount
const logDnaAccount = new LogdnaAccount(process.env.LOGDNA_APIKEY);
// lets create a smartlog message (smartlog normally takes care of creating those objects)
const smartlogPackage: ILogPackage = {
timestamp: Date.now(),
type: 'log',
level: 'info',
context: {
company: 'Lossless GmbH',
companyunit: 'lossless.cloud',
containerName: 'ci-mojoio-logdna',
environment: 'test',
runtime: 'node',
zone: 'shipzone',
},
message: 'this is an awesome log message sent by the tapbundle test',
};
const logdnaMessage = LogdnaMessage.fromSmartLogPackage(smartlogPackage);
logDnaAccount.sendLogdnaMessage(logdnaMessage);
// alternatively simply send the smartlogPackage
// creation of the LogdnaMessage is done for you
logDnaAccount.sendSmartlogPackage(smartlogPackage);
// most of the above funtions return promises should you want to wait for a log to be fully sent
```
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/logtail"
---
# @mojoio/logtail
an unofficial api abstraction package for logtail.com taolored to the smartlog ecosystem
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/logtail)
* [gitlab.com (source)](https://gitlab.com/mojoio/logtail)
* [github.com (source mirror)](https://github.com/mojoio/logtail)
* [docs (typedoc)](https://mojoio.gitlab.io/logtail/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/logtail/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/logtail/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/logtail)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/logtail)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/logtail)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/logtail)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/logtail)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/mailgun"
---
# @mojoio/mailgun
an api abstraction package for mailgun
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/mailgun)
* [gitlab.com (source)](https://gitlab.com/mojoio/mailgun)
* [github.com (source mirror)](https://github.com/mojoio/mailgun)
* [docs (typedoc)](https://mojoio.gitlab.io/mailgun/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/mailgun/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/mailgun/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/mailgun)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/mailgun)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/mailgun)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/mailgun)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/mailgun)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense.
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,247 @@
---
title: "@apiclient.xyz/medium"
---
# @apiclient.xyz/medium
An unofficial Medium.com API package that allows interaction with Medium's features using Node.js.
## Install
To install the `@apiclient.xyz/medium` package, ensure you have Node.js and npm installed on your system. Then, run the following command in your terminal:
```bash
npm install @apiclient.xyz/medium
```
## Usage
This guide will walk you through how to use the `@apiclient.xyz/medium` package to interact with the Medium API. This includes steps to initialize your Medium account, retrieve account and publication information, and create new posts. The examples will use ESM syntax and TypeScript to ensure you have the best experience with code intelligence and type safety.
### 1. Importing Required Classes
Start by importing the necessary classes from the `@apiclient.xyz/medium` package.
```typescript
import { MediumAccount, MediumPublication, MediumPost, IPostData } from '@apiclient.xyz/medium';
```
### 2. Initializing a Medium Account
To use the Medium API, you'll need to initialize a `MediumAccount` object with your access token.
```typescript
const mediumAccount = new MediumAccount('YOUR_ACCESS_TOKEN_HERE');
// Wait for the account to be ready
await mediumAccount.readyDeferred.promise;
```
### 3. Fetching Account Information
Retrieve account information such as ID, username, URL, and image URL.
```typescript
const accountInfo = await mediumAccount.getAccountInfo();
console.log(accountInfo);
```
### 4. Working with Publications
You can interact with publications associated with your account by fetching all publications, getting publications you own, and fetching publications by their names.
#### Fetch All Publications
```typescript
const publications = await mediumAccount.getAllPublications();
publications.forEach(pub => console.log(pub.name, pub.id));
```
#### Fetch Publications Owned By You
```typescript
const ownPublications = await mediumAccount.getOwnPublications();
ownPublications.forEach(pub => console.log(pub.name, pub.id));
```
#### Fetch a Publication by Name
```typescript
const pubName = 'Your Publication Name';
const specificPublication = await mediumAccount.getPublicationByName(pubName);
if (specificPublication) {
console.log(specificPublication);
} else {
console.log(`Publication with name ${pubName} not found.`);
}
```
### 5. Creating and Managing Posts
To create posts within a publication, you need to define the post data and use the publication object to create a post.
#### Define Post Data
```typescript
const newPostData: IPostData = {
title: 'My First Post',
contentFormat: 'markdown',
content: '# Hello World\nThis is my first post!',
canonicalUrl: 'https://yourcoolsite.com/first-post',
tags: ['example', 'first', 'post'],
publishStatus: 'draft'
};
```
#### Create a New Post
```typescript
if (specificPublication) {
const newPost = await specificPublication.createPost(newPostData);
console.log(newPost);
}
```
### 6. Error Handling
Effective error handling is essential when interacting with APIs. Make sure to wrap your asynchronous code in try/catch blocks to handle any rejected promises.
```typescript
try {
const result = await mediumAccount.getAccountInfo();
console.log(result);
} catch (error) {
console.error('Failed to fetch account information:', error);
}
```
### Complete Example
Here is a complete example script that demonstrates the major functionalities of the `@apiclient.xyz/medium` package.
```typescript
import { MediumAccount, IPostData } from '@apiclient.xyz/medium';
async function run() {
const mediumAccount = new MediumAccount('YOUR_ACCESS_TOKEN_HERE');
await mediumAccount.readyDeferred.promise;
// Fetch and display account information
const accountInfo = await mediumAccount.getAccountInfo();
console.log('Account Info:', accountInfo);
// Fetch and display all publications
const publications = await mediumAccount.getAllPublications();
publications.forEach(pub => console.log('Publication Name:', pub.name, 'ID:', pub.id));
// Fetch and display publications owned by the user
const ownPublications = await mediumAccount.getOwnPublications();
ownPublications.forEach(pub => console.log('Own Publication Name:', pub.name, 'ID:', pub.id));
// Fetch a specific publication by name
const pubName = 'Your Publication Name';
const specificPublication = await mediumAccount.getPublicationByName(pubName);
if (specificPublication) {
console.log('Specific Publication:', specificPublication);
// Define new post data
const newPostData: IPostData = {
title: 'My First Post',
contentFormat: 'markdown',
content: '# Hello World\nThis is my first post!',
canonicalUrl: 'https://yourcoolsite.com/first-post',
tags: ['example', 'first', 'post'],
publishStatus: 'draft'
};
// Create a new post
const newPost = await specificPublication.createPost(newPostData);
console.log('New Post:', newPost);
} else {
console.log(`Publication with name ${pubName} not found.`);
}
}
run().catch(error => {
console.error('Error:', error);
});
```
### Fetching Publication Contributors
If you want to see the contributors of a publication, you can fetch them and display the relevant details:
```typescript
const fetchContributors = async (publicationId: string) => {
const response = await mediumAccount.request(`/publications/${publicationId}/contributors`, 'GET');
const contributors: { publicationId: string; userId: string; role: string; }[] = response.data;
contributors.forEach(contributor => {
console.log(`User ID: ${contributor.userId}, Role: ${contributor.role}`);
});
};
await fetchContributors('SamplePublicationId');
```
### Advanced Post Management
Depending on the use case, you might need to fetch posts by specific criteria, update posts, or delete them. For this example, let's assume updating and deleting posts functions are supported by the Medium API, even though those capabilities aren't documented here.
#### Fetch a Post by ID
```typescript
const fetchPostById = async (publication: MediumPublication, postId: string) => {
const response = await mediumAccount.request(`/publications/${publication.id}/posts/${postId}`, 'GET');
const post = response.data;
console.log(post);
};
await fetchPostById(specificPublication, 'SamplePostId');
```
#### Update a Post
Let's assume we have an endpoint for updating posts. The method might look like this:
```typescript
const updatePost = async (publication: MediumPublication, postId: string, newData: Partial<IPostData>) => {
const response = await mediumAccount.request(`/publications/${publication.id}/posts/${postId}`, 'PUT', newData);
console.log('Updated Post:', response.data);
};
const updatedData: Partial<IPostData> = {
title: 'Updated Title',
content: '# Updated Content'
};
await updatePost(specificPublication, 'SamplePostId', updatedData);
```
#### Delete a Post
Similarly, assuming an endpoint exists for deleting posts:
```typescript
const deletePost = async (publication: MediumPublication, postId: string) => {
const response = await mediumAccount.request(`/publications/${publication.id}/posts/${postId}`, 'DELETE');
console.log('Deleted Post', response.statusCode);
};
await deletePost(specificPublication, 'SamplePostId');
```
By following this guide, you should be able to leverage the extensive features provided by the `@apiclient.xyz/medium` package. From account management to creating and managing posts within publications, this guide offers the complete scenarios you need in order to interact effectively with the Medium API using Node.js and TypeScript.
### Extensions
Consider creating more complex interactions by combining different endpoint requests. For example:
- Creating a scheduled post by integrating with a scheduling library like node-schedule.
- Fetching and analyzing post stats if such endpoints are provided by Medium.
- Automating cross-platform publication by combining Medium's API with other platforms' APIs.
The flexibility and power of Node.js along with the typed safety of TypeScript provide a robust environment for developing applications that interact with web APIs efficiently and effectively.
Start by running the complete example script to get familiar with the basic functionalities. Build upon these examples to create feature-rich applications that make extensive use of Medium's capabilities.
Always ensure to consult Medium's API documentation for any updates or additional features that may be available for further enhancement and optimization of your integrations.
undefined

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/ora"
---
# @mojoio/ora
an api abstraction package for ora.pm
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/ora)
* [gitlab.com (source)](https://gitlab.com/mojoio/ora)
* [github.com (source mirror)](https://github.com/mojoio/ora)
* [docs (typedoc)](https://mojoio.gitlab.io/ora/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/ora/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/ora/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/ora)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/ora)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/ora)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/ora)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/ora)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/paddle"
---
# @mojoio/paddle
an unofficial paddle API package
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/paddle)
* [gitlab.com (source)](https://gitlab.com/mojoio/paddle)
* [github.com (source mirror)](https://github.com/mojoio/paddle)
* [docs (typedoc)](https://mojoio.gitlab.io/paddle/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/paddle/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/paddle/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/paddle)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/paddle)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/paddle)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/paddle)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/paddle)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/paypal"
---
# @mojoio/paypal
an unofficial paypal API package
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/paypal)
* [gitlab.com (source)](https://gitlab.com/mojoio/paypal)
* [github.com (source mirror)](https://github.com/mojoio/paypal)
* [docs (typedoc)](https://mojoio.gitlab.io/paypal/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/paypal/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/paypal/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/paypal)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/paypal)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/paypal)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/paypal)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/paypal)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,42 @@
---
title: "@apiclient.xyz/sentry"
---
# @mojoio/sentry
an unofficial abstraction package for sentry.io
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/sentry)
* [gitlab.com (source)](https://gitlab.com/mojoio/sentry)
* [github.com (source mirror)](https://github.com/mojoio/sentry)
* [docs (typedoc)](https://mojoio.gitlab.io/sentry/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/mojoio/sentry/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/mojoio/sentry/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@mojoio/sentry)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/mojoio/sentry)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@mojoio/sentry)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@mojoio/sentry)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@mojoio/sentry)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense.
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,109 @@
---
title: "@apiclient.xyz/slack"
---
# @mojoio/slack
slack api abstraction for the mojo.io ecosystem
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@mojoio/slack)
* [gitlab.com (source)](https://gitlab.com/mojoio/slack)
* [github.com (source mirror)](https://github.com/mojoio/slack)
* [docs (typedoc)](https://mojoio.gitlab.io/slack/)
## Status for master
[![build status](https://gitlab.com/mojoio/slack/badges/master/build.svg)](https://gitlab.com/mojoio/slack/commits/master)
[![coverage report](https://gitlab.com/mojoio/slack/badges/master/coverage.svg)](https://gitlab.com/mojoio/slack/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@mojoio/slack.svg)](https://www.npmjs.com/package/@mojoio/slack)
[![Known Vulnerabilities](https://snyk.io/test/npm/@mojoio/slack/badge.svg)](https://snyk.io/test/npm/@mojoio/slack)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
Use TypeScript for best in class instellisense.
```javascript
import * as slackme from 'slackme'
// First setup the hook
const mySlackme = new Slackme('https://some.slack.webhook.url')
mySlackme.sendMessage:{{
// MessageOptions here
}, 'myAwesomeChannel'}
```
The message interface follows [Slack's docs (click here)](https://api.slack.com/docs/message-formatting) and looks like this:
```javascript
interface IAttachmentField {
title: string
value: string
short?: boolean
}
interface IMessageOptions {
/**
* "Required plain-text summary of the attachment."
*/
fallback?: string,
/**
* a side color
*/
color?: string,
/**
* a message to show above
*/
pretext?: string,
/**
* author name of the attachment
*/
author_name?: string,
/**
* a link to the author
*/
author_link?: string,
/**
* a string to the author
*/
author_icon?: string,
/**
* a title for the attachment
*/
title?: string,
/**
* a link for the title
*/
title_link?: string,
/**
* the main text of the message
*/
text?: string,
fields?: IAttachmentField[],
image_url?: string,
thumb_url?: string,
footer?: string,
footer_icon?: string,
/**
* timestamp as epoch time
*/
ts?: number
}
```
Alternatively, there is the option of specifying a SlackMessage class
```javascript
const mySlackMessage = new SlackMessage({ /* message options here } */, mySlackme)
mySlackMessage.title = 'new Title' // modify message options
mySlackMessage.sendToRoom('general')
mySlackMessage.title = 'another Title'
mySlackMessage.sendToRoom('anotherroom')
```
For further information read the linked docs at the top of this readme.
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,111 @@
---
title: "@apiclient.xyz/tink"
---
# @apiclient.xyz/tink
an unofficial api abstraction for tink.com
## Install
To install @apiclient.xyz/tink, use either `npm` or `yarn` as per your preference. Run the following command in your project directory:
```bash
npm install @apiclient.xyz/tink --save
```
Or if you prefer yarn, use:
```bash
yarn add @apiclient.xyz/tink
```
This will add the package to your project's dependencies.
## Usage
The `@apiclient.xyz/tink` library provides an unofficial TypeScript API abstraction for interacting with tink.com. To make the most out of this library, it's recommended to have a basic understanding of TypeScript and asynchronous programming in JavaScript.
### Getting Started
First, you need to import the necessary classes from the `@apiclient.xyz/tink` package. Here’s how you can get started with creating a `TinkAccount` instance and utilizing it to perform operations:
```typescript
import { TinkAccount, TinkUser, TinkProviderConsent } from '@apiclient.xyz/tink';
// Initialize a new TinkAccount with your clientId and clientSecret
const myTinkAccount = new TinkAccount('<YOUR_CLIENT_ID>', '<YOUR_CLIENT_SECRET>');
```
### Creating and Managing Tink Users
To interact with user-specific APIs, create a `TinkUser` object. You can also retrieve an already existing user or create a new one as follows:
```typescript
// Creating a new Tink User
const newUser = await myTinkAccount.createTinkUser('unique_external_user_id');
console.log('New TinkUser created:', newUser);
// Retrieving an existing Tink User
const existingUser = await myTinkAccount.getTinkUser('existing_unique_external_user_id');
console.log('Existing TinkUser retrieved:', existingUser);
```
### Generating Tink Link for Account Connection
To connect bank accounts to the Tink platform, you will need to generate a Tink Link URL and present it to your users. Here's how you can obtain it:
```typescript
const tinkLinkUrl = await existingUser.getTinkLinkForMarket({
countryId: 'SE', // Specify the market code, e.g., SE for Sweden
redirectUrl: 'https://yourapplication.com/callback', // Redirect URL after account connection
customState: 'your_custom_state', // Optional custom state to be included in the callback
testProviderBool: true // Set to true if using test providers
});
console.log('Tink Link URL:', tinkLinkUrl);
```
### Fetching Bank Accounts and Transactions
After the user has connected their bank accounts through the Tink Link, you can retrieve the connected accounts and their transactions:
```typescript
// Fetching provider consents to get bank accounts
const providerConsents = await existingUser.getProviderConsents();
for (const consent of providerConsents) {
console.log('Provider consent:', consent);
// For each consent, get associated bank accounts
const bankAccounts = await consent.getBankAccounts();
for (const account of bankAccounts) {
console.log('Bank account:', account);
// Fetch transactions for each bank account
const transactions = await account.getTransactions();
for (const transaction of transactions) {
console.log('Transaction:', transaction);
}
}
}
```
### Advanced Usage
The library offers advanced features like handling provider consents, refreshing data, and managing users. For instance, you can delete a user as follows:
```typescript
await existingUser.delete();
console.log('User deleted successfully.');
```
To explore more about the library, including handling errors, refreshing tokens, and more nuanced data retrieval, consult the official API documentation provided by Tink.com and refer to the TypeScript definitions in this package.
Remember to secure your credentials and tokens appropriately and follow Tink's guidelines for data handling and user privacy.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,121 @@
---
title: "@apiclient.xyz/zitadel"
---
# @apiclient.xyz/zitadel
An unofficial client for interacting with Zitadel API.
## Install
To get started with `@apiclient.xyz/zitadel`, ensure you have Node.js installed on your machine. Then, you can add this package to your project by running:
```bash
npm install @apiclient.xyz/zitadel --save
```
This module is written in TypeScript to take advantage of type safety and autocompletion in IDEs. If you haven't installed TypeScript globally, you can do so by running:
```bash
npm install -g typescript
```
## Usage
The `@apiclient.xyz/zitadel` package provides an unofficial TypeScript client for easy interaction with Zitadel's API, allowing for convenient management operations such as user and project management.
### Getting Started
First, ensure you import the core client class from the package:
```typescript
import { ZitaldelClient } from '@apiclient.xyz/zitadel';
```
Initialize the `ZitaldelClient` with your Zitadel instance URL and access token:
```typescript
const zitadelClient = new ZitaldelClient({
url: 'https://your-zitadel-instance.com', // Replace with your Zitadel instance URL.
accessToken: 'your_access_token_here' // Replace with your actual access token.
});
```
### User Management
The library allows performing user operations such as listing all users, getting info of the current user, and creating new users.
#### List All Users
```typescript
async function listUsers() {
const users = await zitadelClient.listUsers();
console.log(users); // Outputs user list
}
listUsers();
```
#### Get Current User Information
```typescript
async function getCurrentUser() {
const user = await zitadelClient.listOwnUser();
console.log(user); // Outputs current user information.
}
getCurrentUser();
```
#### Create a New User
```typescript
async function createUser() {
await zitadelClient.createUser({
email: 'newuser@example.com',
firstName: 'First',
lastName: 'Last'
});
console.log('User created successfully.');
}
createUser();
```
### Project Management
Beyond user management, the client also supports actions on projects—like listing and managing project roles.
#### List Projects
```typescript
async function listProjects() {
const projects = await zitadelClient.listProjects();
console.log(projects); // Outputs list of projects
}
listProjects();
```
#### Project Roles
Each project comes with roles that can be managed through the client.
##### Listing Project Roles
To inspect roles within a project:
```typescript
async function listProjectRoles(projectId: string) {
const projectRoles = await someProject.listProjectRoles(); // Assume `someProject` is an instance of `ZitadelProject`.
console.log(projectRoles);
}
```
Note: The `ZitadelProject` object would typically be obtained as part of the list from `listProjects`.
### Advanced Topics
For more complex scenarios, such as direct interaction with Zitadel's gRPC APIs, or detailed configuration, please refer to the comprehensive [official Zitadel documentation](https://docs.zitadel.ch/). This client offers a simplified abstraction over Zitadel's API functionalities but can be extended or used in conjunction with direct API calls to meet specific needs.
For instance, the `ZitaldelClient` class can be tweaked to support custom interceptors for logging, authentication flow enhancements, or to integrate with Zitadel's event system for real-time updates on resources.
---
This is a basic introduction to `@apiclient.xyz/zitadel`. The client simplifies the interaction with Zitadel's API, focusing on core functionalities like user and project management. For specific use cases, detailed configurations, or advanced features, you may need to extend the client or use it as a foundation for more complex interactions with the Zitadel API.
undefined

View File

@ -0,0 +1,218 @@
---
title: "@design.estate/dees-catalog"
---
# @design.estate/dees-catalog
An extensive library for building modern web applications with dynamic components using Web Components, JavaScript, and TypeScript.
## Install
To install the `@design.estate/dees-catalog` library, you can use npm or any other compatible JavaScript package manager. Using npm is recommended:
```bash
npm install @design.estate/dees-catalog
```
## Usage
### Overview
The `@design.estate/dees-catalog` is a powerful library that offers a suite of dynamic components designed for building sophisticated web applications. This library leverages modern web standards such as Web Components, and programming languages like JavaScript and TypeScript to provide developers with modular and reusable components. These components enhance the development workflow by offering ready-to-use solutions for UI design and interactivity, enabling developers to create intricate and functional applications efficiently.
Below, we will explore the diverse range of components available, demonstrating their integration and usage thoroughly within real-world scenarios. Each example will be crafted in TypeScript to ensure type safety and maintainable code. Let's navigate through the components by examining their setups, features, and potential applications in a comprehensive manner.
### Getting Started with Components
To use these components, you first need to import them into your project. Depending on your development environment, you might be using a module bundler that supports ES modules. In such cases, importing components is straightforward as demonstrated below:
```typescript
import {
DeesButton,
DeesModal,
DeesTable,
DeesAppuiBase,
DeesForm,
DeesInputText,
DeesAppuiMainmenu,
DeesAppuiMainselector
} from '@design.estate/dees-catalog';
```
### Button Component: `DeesButton`
`DeesButton` is a versatile button component that can be configured for various UI needs such as form submissions, navigation actions, or interactive interfaces. It supports multiple styles including normal, highlighted, discreet, and status-based variations (e.g., pending, success, error).
#### Example Usage
```typescript
import { DeesButton } from '@design.estate/dees-catalog';
// Create a simple button
const submitButton = document.createElement('dees-button');
submitButton.text = 'Submit';
submitButton.type = 'highlighted';
// Add functionality
submitButton.addEventListener('clicked', () => {
console.log('Submit button clicked!');
});
document.body.appendChild(submitButton);
// Handling status change
async function handleFormSubmission() {
submitButton.status = 'pending';
try {
await simulateNetworkRequest();
submitButton.status = 'success';
} catch {
submitButton.status = 'error';
}
}
function simulateNetworkRequest() {
return new Promise(resolve => setTimeout(resolve, 2000));
}
submitButton.addEventListener('clicked', handleFormSubmission);
```
### Modal Component: `DeesModal`
The `DeesModal` component is used to display content in an overlay. It is suitable for scenarios like alerts, dialog boxes, or interactive user forms. The modal can be highly customized with different header, content, and footer components.
#### Example Usage
```typescript
import { DeesModal } from '@design.estate/dees-catalog';
import { html } from '@design.estate/dees-element';
// Creating a modal
const modalContent = html`<p>Welcome to our platform</p>`;
const modal = DeesModal.createAndShow({
heading: 'Welcome',
content: modalContent,
menuOptions: [
{ name: 'Close', action: () => modal.destroy() },
{ name: 'Proceed', action: () => console.log('Proceeding') }
]
});
```
### Form Handling With `DeesForm`
The `DeesForm` and its related input elements simplify form creation and handling. The form component integrates validation, submission, and data collection functions.
#### Creating a Form
```typescript
import {
DeesForm,
DeesInputText,
DeesFormSubmit,
DeesInputDropdown
} from '@design.estate/dees-catalog';
const registrationForm = document.createElement('dees-form');
const nameInput = document.createElement('dees-input-text');
nameInput.label = 'Name';
nameInput.required = true;
const roleSelect = document.createElement('dees-input-dropdown');
roleSelect.label = 'Role';
roleSelect.options = [
{ option: 'Admin', key: 'admin' },
{ option: 'Editor', key: 'editor' }
];
const submitButton = document.createElement('dees-form-submit');
submitButton.text = 'Register';
registrationForm.appendChild(nameInput);
registrationForm.appendChild(roleSelect);
registrationForm.appendChild(submitButton);
registrationForm.addEventListener('formData', event => {
console.log('Form Data:', event.detail.data);
});
document.body.appendChild(registrationForm);
```
### Data Presentation with `DeesTable`
The `DeesTable` component allows for effective data management and presentation through dynamic tables. It supports features such as sorting, selecting, and action-triggering from table items.
#### Displaying a Data Table
```typescript
import { DeesTable } from '@design.estate/dees-catalog';
const data = [
{ name: 'Alice', status: 'Active' },
{ name: 'Bob', status: 'Inactive' }
];
const table = new DeesTable();
table.heading1 = 'User Table';
table.data = data;
document.body.appendChild(table);
// Custom Actions and Row Selection
table.addEventListener('rowSelected', (event) => console.log(event.detail));
```
### Structural Components
`DeesAppuiBase`, along with components such as `DeesAppuiMainmenu` and `DeesAppuiMainselector`, provide the scaffolding needed for application UIs, particularly dashboards.
#### Setting Up an Application Layout
```typescript
import { DeesAppuiBase } from '@design.estate/dees-catalog';
const appBase = document.createElement('dees-appui-base');
document.body.appendChild(appBase);
```
### Data Visualization with ApexCharts
`DeesChartArea` provides easy integration with ApexCharts for creating detailed visualizations.
#### Implementing a Chart
```typescript
import { DeesChartArea } from '@design.estate/dees-catalog';
// Create and configure a chart
const chart = new DeesChartArea();
document.body.appendChild(chart);
chart.chart.updateSeries([
{ name: 'Sales', data: [20, 40, 30, 50] }
]);
```
### Customization and Extensibility
The `@design.estate/dees-catalog` is built for extensibility and customization. You can extend components, integrate custom events, and style them as per your requirements. This ensures that your application remains unique and tailored to your audience.
The library not only saves development time by providing ready-made components but also enhances maintainability through its clean interfaces and TypeScript support, making your code robust and type-safe. With the library's expansive set of features, building modern web applications has never been easier. Enjoy the blend of simplicity and power that `@design.estate/dees-catalog` brings to the table.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,130 @@
---
title: "@design.estate/dees-comms"
---
# @design.estate/dees-comms
a comms module for communicating within the DOM
## Install
To integrate `@design.estate/dees-comms` into your project, run the following command in your terminal:
```bash
npm install @design.estate/dees-comms --save
```
This will add the package to your project dependencies.
## Usage
`@design.estate/dees-comms` facilitates communication within the DOM, especially between various workers and tabs in client-side JavaScript. Using TypeScript and the provided ESM syntax will enhance your development experience with better intellisense support and type safety.
### Setting Up
First, make sure to import the module in your TypeScript file:
```typescript
import { DeesComms } from '@design.estate/dees-comms';
```
### Initializing the Communication Module
Create an instance of the `DeesComms` class to start using the module. This instance will act as the central communication hub in your application.
```typescript
const myDeesComms = new DeesComms();
```
### Sending Messages
To send messages, you'll need to create a typed request. Let's assume we are sending a message that requires a response:
```typescript
// Define the message type
interface MyMessageType {
method: 'myMethod';
someData: string;
}
// Creating a typed request
const myTypedRequest = myDeesComms.createTypedRequest<MyMessageType>('myMethod');
// Firing the request
myTypedRequest.fire({
someData: 'Hello, World!',
}).then(response => {
console.log('Received response:', response);
});
```
### Receiving and Handling Messages
To handle incoming messages, you need to define handlers for the types of messages you expect to receive.
```typescript
// Define the handler for the 'myMethod' message
myDeesComms.createTypedHandler<MyMessageType>('myMethod', async (incomingMessage) => {
console.log('Message received:', incomingMessage);
// Process the incoming message...
// Return a response (if needed)
return {
response: 'Message received loud and clear!'
};
});
```
### Communication Between Tabs or Workers
`@design.estate/dees-comms` uses the Broadcast Channel API and a polyfill for environments where it's not available, enabling seamless communication between different contexts like tabs, iframes, or web workers.
### Clean Up
When you're done with communication, or before creating a new instance for any reason, ensure you clean up properly to prevent memory leaks or other unexpected behaviors:
```typescript
// Currently, the cleanup should be handled according to the specific needs of your application
// e.g., closing or nullifying references to the DeesComms instance.
```
### Complete Example
Putting it all together, let's create a small application that sends a message and listens for a response:
```typescript
import { DeesComms } from '@design.estate/dees-comms';
const appDeesComms = new DeesComms();
// Setting up the listener
appDeesComms.createTypedHandler<{ method: 'greet'; name: string }>('greet', async (message) => {
console.log(`Greetings received from ${message.name}`);
return { reply: `Hello ${message.name}, nice to meet you!` };
});
// Sending a greeting message
const greetRequest = appDeesComms.createTypedRequest<{ method: 'greet'; name: string }>('greet');
greetRequest.fire({ name: 'Alice' }).then(response => {
console.log(response.reply); // Expected output: "Hello Alice, nice to meet you!"
});
```
This module provides a powerful and flexible way to handle communications within the DOM, leveraging modern JavaScript features and patterns. The usage of TypeScript ensures type safety and enhances code understandability and maintainability.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,202 @@
---
title: "@design.estate/dees-document"
---
# @design.estate/dees-document
A comprehensive tool for dynamically generating and rendering business documents like invoices using modern web technologies.
## Install
To incorporate `@design.estate/dees-document` into your project, execute the following command in your terminal:
```shell
npm install @design.estate/dees-document --save
```
This command will install the package and add it to your project's dependencies, thus making all the necessary modules available within your `node_modules` directory.
## Usage
The `@design.estate/dees-document` package serves as a robust framework to facilitate the generation of business documents, such as invoices, contracts, and reports. Leveraging modern web technologies, this package integrates seamlessly with TypeScript and ES modules, offering a type-safe environment conducive to efficient, dynamic document creation.
Below, we provide a detailed guide for utilizing this package, from initializing your environment to generating complete PDF documents.
### Setting Up the Environment
Before diving into document creation, ensure your environment is properly configured. Make sure to import necessary dependencies and setup configurations:
```typescript
import { PdfService, IPdfServiceConstructorOptions } from '@design.estate/dees-document';
async function setupPdfService() {
const options: IPdfServiceConstructorOptions = {
// Configure your options here
};
const pdfService = await PdfService.createAndStart(options);
console.log('PDF Service started successfully.');
return pdfService;
}
```
In this setup snippet, you set up the `PdfService` which is the core component for PDF generation. The configuration options should be adjusted to fit your needs, especially considering options such as file paths, languages, and template directories.
### Creating a Document Template
To create documents, particularly invoices, you'll first need to define a template. This template describes the structure of your document:
```typescript
import { ILetter } from '@design.estate/dees-document';
const invoiceTemplate: ILetter = {
from: {
name: 'Your Company Name',
address: {
streetName: 'Your Street',
houseNumber: '123',
city: 'Your City',
country: 'Your Country',
postalCode: '12345',
},
email: 'your-email@example.com',
phone: '123-456-7890',
},
to: {
name: 'Recipient Company Name',
address: {
streetName: 'Recipient Street',
houseNumber: '456',
city: 'Recipient City',
country: 'Recipient Country',
postalCode: '67890',
},
email: 'recipient-email@example.com',
phone: '098-765-4321',
},
content: {
invoiceData: {
items: [
{
name: 'Service or Product Name',
unitQuantity: 2,
unitNetPrice: 100.0,
unitType: 'service',
vatPercentage: 19,
currency: 'EUR',
},
],
},
},
subject: 'Invoice for Services Rendered',
date: new Date().getTime(),
versionInfo: {
type: 'final',
version: '1.0.0',
},
};
```
The `invoiceTemplate` object utilizes the `ILetter` interface which specifies the structure for invoice data, including sender and recipient details, itemization, and pricing.
### Generating the Document
Once a template is established, the next step is generating a PDF:
```typescript
async function generateInvoice(pdfService: PdfService, invoiceData: ILetter) {
const pdfBuffer = await pdfService.createPdfFromLetterObject(invoiceData);
console.log('Invoice PDF generated successfully.');
// Here you could save the PDF to your filesystem, send it via email, etc.
}
```
In this function, the `createPdfFromLetterObject` method converts your invoice data into a `Buffer` containing the PDF. This `Buffer` can subsequently be saved as a file or sent over HTTP.
### Comprehensive Example
Below is an example integrating all previous steps into a single coherent script:
```typescript
async function main() {
const pdfService = await setupPdfService();
const invoiceData: ILetter = {
// Populate your invoice object
};
await generateInvoice(pdfService, invoiceData);
}
main().then(() => console.log('Invoice generation process completed.'));
```
This script encompasses initializing services and generating a PDF in a streamlined, efficient workflow.
### Advanced Features
`@design.estate/dees-document` provides several advanced functionalities, enabling rich document creation:
1. **Custom Templates & Styling**
- Customize the styling through CSS or using inline styles in TypeScript.
- Templates can be adjusted to present different document types (e.g., contracts, reports).
2. **Modular Components and Reuse**
- Utilize modular components to create reusable parts across different documents, enhancing maintainability and reducing redundancy.
3. **Interactive Documents**
- Integrate interactivities like forms, buttons, and interactive charts within your documents.
4. **Localization Support**
- Documents can be localized to support multiple languages, enhancing accessibility and usability.
5. **Responsive and Adaptive Designs**
- Create documents that adjust layout dynamically depending on print or digital medium, maintaining consistency across platforms.
6. **Security Features**
- Apply digital signatures and encrypt sensitive documents to ensure secure and authentic document distribution.
7. **Complex Business Logic**
- Implement complex logic for feature-rich documents such as inventory systems, automatic tax calculations, or real-time pricing adjustments.
### Utilize Translation for Localization
The package offers a translation mechanism to adapt your documents for international clients:
```typescript
import { translate } from '@design.estate/dees-document/shared';
const languageCode: 'DE' | 'EN' | 'ES' = 'EN'; // Set required language code
console.log(translate(languageCode, 'invoice', 'Invoice')); // Translated output
```
Different language settings can be applied, enabling the seamless presentation of document contents tailored to regional and linguistic preferences.
### Conclusion
The `@design.estate/dees-document` package is a versatile and powerful solution for businesses seeking to automate and streamline their document generation processes using modern web technologies. By integrating seamlessly with TypeScript, it offers robust capabilities for creating complex, customizable, and interactive documents that can meet a variety of business needs.
From custom templates to localization and advanced security features, this module provides the flexibility and power to create polished and professional documents efficiently. Whether you're generating invoices, contracts, or detailed reports, `@design.estate/dees-document` has the tools to support your enterprise workflows with ease and precision.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,119 @@
---
title: "@design.estate/dees-domtools"
---
# @design.estate/dees-domtools
tools to simplify complex css structures
## Install
To install `@design.estate/dees-domtools`, simply use npm:
```bash
npm install --save @design.estate/dees-domtools
```
Ensure your project supports TypeScript and ESM syntax for the best development experience.
## Usage
This documentation aims to give you comprehensive guidance on how to utilize `@design.estate/dees-domtools` in your web projects to simplify complex CSS structures. Whether you're building a sophisticated web application or need a more manageable way to handle your CSS, this toolkit offers a variety of features designed to enhance and streamline your workflow. Throughout this guide, we'll cover the installation process, key features, examples, and best practices when working with `@design.estate/dees-domtools`.
Before diving into the examples, please ensure that you've completed the installation step as described above.
### Key Features
- **CSS Simplification**: Tools and utilities designed to abstract and simplify the handling of complex CSS structures.
- **Responsive Design Helpers**: Tools for managing responsive designs more easily, with utilities for breakpoints, and adaptable grids.
- **Element Utilities**: Simplified interactions with DOM elements, including dynamic style manipulations and more.
- **Theme Management**: Simplify the process of theme toggling (dark mode/light mode) in your applications.
- **Keyboard Event Handling**: Utilities for managing keyboard events, facilitating better interaction handling.
- **External Resources Management**: Easily manage external CSS and JavaScript resources within your project.
### Getting Started
To get started with `@design.estate/dees-domtools`, you first need to import the modules you intend to use in your project. Here's a simple example to illustrate how to import and use the package:
```typescript
import { DomTools, elementBasic, breakpoints, css } from '@design.estate/dees-domtools';
// Setting up DomTools for your application
const domToolsInstance = await DomTools.setupDomTools();
// Example: Using elementBasic utilities
elementBasic.setup();
```
### Simplifying CSS with CSS Utilities
The package offers a variety of CSS utilities that simplify the handling of complex CSS structures. Here's how you can use them in your project:
```typescript
import { css } from '@design.estate/dees-domtools';
// Example: Creating a CSS grid with a specified number of columns and gap size
const gridStyles = css.cssGridColumns(3, 10); // 3 columns with a 10px gap
```
### Managing Responsive Design
Responsive design is critical for modern web development. `@design.estate/dees-domtools` provides utilities to make it easier to manage responsive designs and breakpoints.
```typescript
import { breakpoints } from '@design.estate/dees-domtools';
// Example: Applying styles for different viewport sizes
const tabletStyles = breakpoints.cssForTablet(myCssStyles);
const phoneStyles = breakpoints.cssForPhone(myCssStyles);
```
### Theme Management
Managing themes (such as toggling between dark and light mode) is simplified with the built-in theme management tools.
```typescript
// Toggle between light and dark themes
domToolsInstance.themeManager.toggleDarkBright();
```
### Handling Keyboard Events
Keyboard event handling is made easy with the utilities provided by the toolkit. This can be particularly useful for adding keyboard navigation and shortcuts.
```typescript
import { Keyboard } from '@design.estate/dees-domtools';
// Initialize keyboard handling
const keyboard = new Keyboard(document.body);
// Bind an event to a specific key combination
keyboard.on([Keyboard.Key.Ctrl, Keyboard.Key.S]).subscribe(() => {
console.log('Ctrl+S was pressed');
});
```
### Best Practices
- **Organize Your CSS**: Use the provided CSS utilities to structure your styles in a way that makes them easy to maintain and scale.
- **Embrace Responsiveness**: Leverage the responsive design helpers to ensure your application looks great on any device.
- **Consistent Theme Handling**: Utilize the theme management tools to provide a seamless experience for your users, allowing them to choose their preferred theme.
By integrating `@design.estate/dees-domtools` into your project, you can leverage a comprehensive suite of utilities designed to simplify complex CSS structures and enhance your web development workflow.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,121 @@
---
title: "@design.estate/dees-editor"
---
# @design.estate/dees-editor
an advanced editor for markdown documents based on monaco.
## Install
To install `@design.estate/dees-editor`, you need to run the following command using npm or Yarn. Make sure you have Node.js installed on your system before you proceed.
```bash
npm install @design.estate/dees-editor
# or if you prefer Yarn
yarn add @design.estate/dees-editor
```
## Usage
This guide walks you through the usage of `@design.estate/dees-editor`, an advanced editor for markdown documents based on Monaco Editor. This editor not only allows for high customization but also enhances your markdown editing with the robust features of Monaco Editor.
### Integrating `@design.estate/dees-editor` in Your Project
First, ensure you have installed `@design.estate/dees-editor` as described in the installation section.
#### Setting Up Your Project
Create a TypeScript file (e.g. `app.ts`) and import necessary functionalities using ESM syntax:
```typescript
import { DeesEditor, DeesTerminal, DeesEditorMarkdown, DeesEditorMarkdownOutlet } from '@design.estate/dees-editor';
```
### Displaying the Markdown Editor
To display the markdown editor in your web application, you will need to incorporate it into your HTML structure. Typically, you can use custom element tags provided by the library. Here's a simple example:
#### HTML Structure
Add the following HTML structure to your application's main HTML file (e.g., `index.html`):
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Markdown Editor</title>
<script type="module" src="./app.ts"></script>
</head>
<body>
<dees-editor></dees-editor>
</body>
</html>
```
#### Initializing the Editor
Within your `app.ts` file, initialize the markdown editor with desired options:
```typescript
const editorElement = document.querySelector('dees-editor');
if (editorElement) {
editorElement.language = 'markdown'; // Set the language to markdown
editorElement.content = '# Markdown Editor\n\nStart typing your markdown content here...'; // Initial content
}
```
### Advanced Usage
`@design.estate/dees-editor` offers an advanced markdown editor that leverages the Monaco Editor. This means you can utilize Monaco's extensive API for further customization and functionality enhancement.
#### Configuring the Editor
The editor can be tailored to meet your needs, such as theming, read-only mode, and more. Explore Monaco's [`IStandaloneEditorConstructionOptions`](https://microsoft.github.io/monaco-editor/api/interfaces/monaco.editor.IStandaloneEditorConstructionOptions.html) for all available configurations.
Example - Setting Dark Theme and Read-Only Mode:
```typescript
(async () => {
const editorInstance = await editorElement.editorDeferred.promise; // Wait for the editor to initialize
editorInstance.updateOptions({
theme: 'vs-dark', // Set theme to dark
readOnly: true // Make the editor read-only
});
})();
```
#### Integrating Terminal Emulator
`@design.estate/dees-editor` also includes a powerful terminal emulator, `DeesTerminal`, which can be embedded alongside your editor:
```html
<dees-terminal></dees-terminal>
```
And in your TypeScript file:
```typescript
const terminalElement = document.querySelector('dees-terminal');
if (terminalElement) {
// Initialize terminal with options or use it directly
}
```
#### Creating a Live Markdown Preview
`@design.estate/dees-editor` facilitates creating live markdown previews. Utilize `DeesEditorMarkdown` for binding the editor with a live preview outlet.
```html
<dees-editormarkdown></dees-editormarkdown>
```
This component divides the viewport into an editor pane and a live preview pane. As you type in the editor, the markdown content automatically renders in the live preview.
### Conclusion
`@design.estate/dees-editor` is a feature-rich markdown editor built on top of Monaco Editor, offering extensive customizability and advanced features such as a terminal emulator and live markdown preview. Its integration into your project is straightforward, whether embedding the editor directly into your webpage or leveraging its components for advanced functionality. The versatility of Monaco Editor ensures that your markdown documentation needs are met with efficiency and style.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,170 @@
---
title: "@design.estate/dees-element"
---
# @design.estate/dees-element
a custom element class extending lit element class
## Install
To install `@design.estate/dees-element`, you need to run the following command using npm:
```bash
npm install @design.estate/dees-element
```
Ensure you have TypeScript and the necessary compilers configured in your development environment since this package uses ESM syntax and TypeScript.
## Usage
This section provides a comprehensive exploration into the usage of `@design.estate/dees-element`, offering examples to illustrate its capabilities in creating custom elements by extending the lit element class. All examples assume the use of ESM syntax and TypeScript, aligning with modern best practices in web development.
`@design.estate/dees-element` serves as a robust foundation for building custom web components, leveraging the power of the Lit library for reactive updates and efficient rendering management. This guide takes you through the process of creating, styling, and interacting with your custom elements.
### Getting Started
Firstly, ensure you have installed the package as described in the installation section. Once installed, you can start creating custom elements. Let's begin with a simple example:
#### Define a Custom Element
Create a file named `MyElement.ts`:
```typescript
import { DeesElement, customElement, html, css, cssManager } from '@design.estate/dees-element';
@customElement('my-element')
class MyElement extends DeesElement {
render() {
return html`<div>My Custom Element</div>`;
}
}
```
This code snippet defines a custom element `<my-element>` that renders a simple div. `DeesElement` extends the LitElement class, bringing in all of its reactive rendering capabilities along with additional features that `@design.estate/dees-element` offers.
#### Styling the Element
To style the element, utilize the static `styles` property:
```typescript
@customElement('my-styled-element')
class MyStyledElement extends DeesElement {
static styles = [
css`
div {
color: blue;
padding: 16px;
border: 1px solid blue;
}
`,
];
render() {
return html`<div>A Styled Custom Element</div>`;
}
}
```
The `css` template tag allows you to define CSS styles scoped to your custom element.
#### Leveraging the `cssManager` for Theme Management
`@design.estate/dees-element` introduces a powerful `CssManager` class that facilitates dynamic theming and responsive designs:
```typescript
import { cssManager, DeesElement, customElement, html, css } from '@design.estate/dees-element';
@customElement('themed-element')
class ThemedElement extends DeesElement {
static styles = [
cssManager.defaultStyles,
css`
:host {
display: block;
background-color: var(--theme-background-color, #fff);
}
`,
];
constructor() {
super();
cssManager.bdTheme('#fff', '#000'); // Define themes
}
render() {
return html`<div>A Themed Custom Element</div>`;
}
}
```
The `CssManager` allows easy management of themes, breakpoints, and more, ensuring your custom elements remain consistent and responsive across different devices and themes.
### Reactive Properties and State Management
To make your elements interactive and data-driven, `@design.estate/dees-element` offers a seamless approach to managing properties and internal state:
```typescript
@customElement('interactive-element')
class InteractiveElement extends DeesElement {
@property({ type: String }) labelText = 'Click me';
@state() private count = 0;
render() {
return html`
<button @click="${this.incrementCount}">${this.labelText}: ${this.count}</button>
`;
}
incrementCount() {
this.count++;
}
}
```
Here, `@property` and `@state` decorators are used to reactively update your custom element whenever the internal state or properties change.
### Advanced Scenarios: Directives and Async Data
`@design.estate/dees-element` supports Lit's directives for handling asynchronous data, complex rendering conditions, and more. Here's an example using the `resolve` directive to render content asynchronously:
```typescript
import { resolve } from '@design.estate/dees-element';
@customElement('async-element')
class AsyncElement extends DeesElement {
private fetchData() {
return new Promise((resolve) => {
setTimeout(() => resolve('Data Loaded'), 2000);
});
}
render() {
return html`${resolve(this.fetchData())}`;
}
}
```
This example demonstrates how to render async data efficiently, ensuring your custom elements can handle dynamic content and states gracefully.
### Conclusion
`@design.estate/dees-element` enriches the development experience for building custom elements by extending the capabilities of LitElement. Through thoughtful design choices, such as enhanced theming with `CssManager` and the incorporation of useful plugins and decorators, it facilitates a seamless and powerful approach to developing custom web components.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,120 @@
---
title: "@design.estate/dees-wcctools"
---
# @design.estate/dees-wcctools
wcc tools for creating element catalogues
## Install
To install `@design.estate/dees-wcctools`, you can use npm:
```bash
npm install @design.estate/dees-wcctools --save
```
## Usage
The `@design.estate/dees-wcctools` package provides a set of tools for creating element catalogues using Web Components. It leverages LitElement for creating custom elements and provides a structured way to showcase and test these elements in various environments and themes.
### Setting Up
First, ensure that your project is set up to use TypeScript and ESM syntax. This guide assumes you have a basic understanding of TypeScript and modern JavaScript development practices.
Start by importing the necessary tools from `@design.estate/dees-wcctools` in your main TypeScript file.
```typescript
import { setupWccTools } from '@design.estate/dees-wcctools';
```
### Defining Custom Elements
Define your custom elements using LitElement. Here's a simple example of an element:
```typescript
import { LitElement, html, customElement } from 'lit';
@customElement('my-element')
class MyElement extends LitElement {
render() {
return html`<p>Hello, world!</p>`;
}
}
```
### Bootstrapping the WCCTools Dashboard
To showcase your elements, `@design.estate/dees-wcctools` provides a handy way to bootstrap a dashboard where your elements can be registered and displayed.
Create a bootstrap function in your main file or a separate module:
```typescript
async function bootstrapWCCTools() {
// Define your elements here
const elements = {
'my-element': MyElement, // Assuming MyElement is imported
};
// Optionally, define pages as functions returning Lit HTML Templates
const pages = {
home: () => html`<h1>Welcome to My Element Catalogue</h1>`,
};
// Setup the WCCTools dashboard
setupWccTools(elements, pages);
}
```
Call this function to initialize your catalogue:
```typescript
bootstrapWCCTools();
```
### Configurations and Customizations
The `setupWccTools` function accepts two arguments: `elements` and `pages`.
- `elements`: An object where keys are element tags (e.g., 'my-element') and values are the corresponding class definitions.
- `pages`: An optional object where keys are page identifiers and values are functions returning Lit HTML templates.
### Testing Elements
Once the dashboard is set up, navigate to your project in a web browser. You'll see a sidebar listing all registered elements and pages. Clicking on an element name will display it in the main view, allowing you to interact with it and see it in action.
### Theme and Environment Testing
The dashboard also provides options for testing your elements in different environments (e.g., desktop, tablet) and themes (light or dark). This helps ensure that your elements are versatile and adaptable to varying conditions.
### Expanding Your Catalogue
To add more elements to your catalogue, simply extend the `elements` object and rerun `bootstrapWCCTools()`. This modular approach makes it easy to maintain and expand your element catalogue.
### Leveraging TypeScript
Using TypeScript allows you to enforce typing and build more reliable web components. Define properties with decorators, and use TypeScript's features to enhance your component development process.
```typescript
import { LitElement, property, html, customElement } from 'lit';
@customElement('typed-element')
class TypedElement extends LitElement {
@property({type: String})
name: string = 'World';
render() {
return html`<p>Hello, ${this.name}!</p>`;
}
}
```
### Conclusion
`@design.estate/dees-wcctools` provides a powerful, flexible platform for developing, showcasing, and testing web components. By leveraging modern development practices like TypeScript and LitElement, you can build a robust catalogue of reusable web components ready for any project.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,103 @@
---
title: "@design.estate/fontloader"
---
# @designestate/fontloader
a fontloader for managing font loading from A to Z
## Install
To install `@designestate/fontloader`, ensure that you have Node.js and npm installed, then run the following command in your project directory:
```sh
npm install @designestate/fontloader --save
```
This will add `@designestate/fontloader` as a dependency to your project's `package.json` file and download it to your `node_modules` folder.
## Usage
The `@designestate/fontloader` package serves as a utility to manage and load fonts, specifically designed to cater to web development needs. It supports a range of fonts including 'Inter', 'MaterialIcons', and 'Courier Prime'. Below, you'll find comprehensive usage examples outlined in TypeScript to integrate and utilize the full potential offered by this font loader.
### Getting Started
First, ensure you're importing the `FontLoader` class and the type `TFonts` from the package at the top of your TypeScript file:
```typescript
import { FontLoader, TFonts } from '@designestate/fontloader';
```
### Loading Fonts
To load fonts into your project effectively, `FontLoader` provides a singleton pattern ensuring that fonts are loaded once and are accessible throughout the runtime of your application or site. Here's a basic example to get you started:
```typescript
// Define the fonts you want to load
const myFonts: TFonts[] = ['Inter', 'MaterialIcons'];
// Ensure fonts are loaded
FontLoader.ensureFonts(myFonts);
// Later in your application, you might want to explicitly load a specific font
const fontLoaderInstance = new FontLoader();
fontLoaderInstance.loadInter();
```
Note that `ensureFonts` method in this context is provided as a stub to showcase the expected functionality. It implies ensuring or checking that the desired fonts are loaded or making decisions to load them.
### Advanced Usage
Depending on your application's complexity and requirements, you might want to extend or customize the behavior of the `FontLoader`. Since the provided code snippets are primarily stubs to guide the implementation, here's an extended example illustrating potential custom functionalities:
```typescript
class AdvancedFontLoader extends FontLoader {
constructor() {
super();
// Custom initialization if required
}
public async loadCustomFont(fontName: TFonts) {
// Implement logic to load a custom font not available by default
// This could involve fetching the font from an API, loading it from local storage, etc.
console.log(`Loading custom font: ${fontName}`);
// Placeholder logic
return Promise.resolve();
}
}
// Usage
const advancedFontLoader = new AdvancedFontLoader();
advancedFontLoader.loadCustomFont('Courier Prime').then(() => {
console.log('Custom font loaded successfully');
});
```
### Best Practices
- **Caching:** Implement caching mechanisms to store loaded fonts, preventing redundant fetches and enhancing performance.
- **Error Handling:** Always include error handling logic, especially when loading fonts from external sources.
- **Cross-Browser Support:** Test font loading across different browsers to ensure consistency in user experience.
- **Font Fallbacks:** Specify font fallbacks in your CSS to maintain usability and design integrity even if a font fails to load.
### Conclusion
`@designestate/fontloader` offers a pragmatic foundation for managing fonts in web projects, catering to essential needs such as supporting popular fonts like 'Inter' and 'MaterialIcons'. By following the outlined examples in TypeScript, integrating and leveraging this package should streamline the font management process, allowing developers to focus on building engaging, visually consistent web experiences.
For further customization and advanced scenarios, extending the `FontLoader` class as shown in the advanced usage example provides a flexible pathway to accommodate project-specific requirements.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,122 @@
---
title: "@design.estate/navigation"
---
# @designestate/navigation
A module for opinionated navigation abstraction.
## Install
To use `@designestate/navigation` in your project, run:
```bash
npm install @designestate/navigation --save
```
This will install the package and add it to your project's dependencies.
## Usage
The `@designestate/navigation` module is designed to simplify the creation and management of navigational structures in your application. It provides a way to abstract navigation into manageable components, allowing for a more modular and maintainable codebase. Below are examples and explanations on how to utilize this module effectively in your projects.
### Getting Started
First, ensure that you import the necessary classes from the module:
```typescript
import { NavigationManager, NavigationEntry } from '@designestate/navigation';
```
### Creating a Navigation Manager
The `NavigationManager` acts as the central point for managing navigation entries and can be linked with other navigation managers to create a more complex navigation structure. Here's how you can initialize a new `NavigationManager`:
```typescript
const myNavigationManager = new NavigationManager();
```
### Adding Navigation Entries
`NavigationEntry` instances represent individual navigational elements. These can be pages, links, or any other components that you navigate to in your application. You can add navigation entries to the navigation manager like this:
```typescript
import { NavigationEntry } from '@designestate/navigation';
const dashboardNavEntry = new NavigationEntry();
dashboardNavEntry.level = 0;
dashboardNavEntry.group = 'main';
dashboardNavEntry.groupRanking = 1;
dashboardNavEntry.iconUrl = 'path/to/icon/url';
dashboardNavEntry.id = 'dashboard';
dashboardNavEntry.name = 'Dashboard';
dashboardNavEntry.callBack = (idArg?: string) => {
console.log(`Navigating to ${idArg}`);
};
myNavigationManager.addNavigationEntry(dashboardNavEntry);
```
### Compiling Navigation
Once you have added all necessary navigation entries, you can compile the navigation structure. This process transforms the added entries into a `CompiledNavigation` instance, which can be used to render navigational components or manage routing:
```typescript
myNavigationManager.compile().then(compiledNavigation => {
// Use the compiledNavigation instance as needed
});
```
### Observing Navigation Changes
`NavigationManager` provides an observable you can subscribe to for reacting to navigation changes. Whenever the navigation structure is compiled or updated, the observable emits a `CompiledNavigation` instance:
```typescript
myNavigationManager.compiledNavigationObservable.subscribe(compiledNavigation => {
// Handle navigation change
});
```
### Advanced Usage
#### Hierarchical Navigation
For complex applications, you might need hierarchical navigation. You can add a `NavigationManager` instance to another `NavigationManager`, enabling hierarchical navigation management:
```typescript
const subNavigationManager = new NavigationManager();
// Configure subNavigationManager
myNavigationManager.addNavigationManager(subNavigationManager);
// When you compile myNavigationManager, it will also include navigation entries from subNavigationManager
```
#### Dynamic Navigation Entries
Navigation entries can be dynamically added or removed based on application state or user permissions. This allows for a flexible and adaptive navigation structure:
```typescript
const adminNavEntry = new NavigationEntry();
// Configure adminNavEntry for admin level access
if (user.isAdmin) {
myNavigationManager.addNavigationEntry(adminNavEntry);
}
// You can also remove entries dynamically if needed
```
## Conclusion
The `@designestate/navigation` module offers a powerful and flexible way to manage navigation in your applications. By abstracting navigation into manageable components, it facilitates better organization and maintenance of your codebase. With the ability to create hierarchical and dynamic navigations, this module can cater to a wide range of application structures and scenarios.
Remember, the above examples are just the starting point. Explore the module further to harness its full capabilities in building intuitive and maintainable navigation structures for your applications.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,35 @@
---
title: What is foss.global?
---
# What is foss.global?
**foss.global** is an Open Source Organization that builds Open Source for startups and SMEs. It is funded by its sponsors.
Platinum sponsors right now are:
* [Task Venture Capital GmbH](https://task.vc)
## Motivation for creating foss.global
* a common and open way to think about technical shared across company borders, mergers and aquisitions
* fix once, fix everywhere
* accelerated growth due to symbiotically shared solutions
* no legal onboarding worries since no special contracts are needed, FOSS is FOSS.
* standards that investors cab research and trust
## foss.global Projects
* **[apiclient.xyz](https://apiclient.xyz/)**
simplified TypeScript API clients for third party services
* **[compute.cloud](https://compute.cloud)**
simplified cloud computing
* **[push.rocks](https://push.rocks/)**
solving scoped problems as well maintained TypeScript modules
* **[uptime.link](https://uptime.link/)**
status monitoring for websites and services
* **[lossless.com](https://lossless.com/)**
321 backups for your complete IT operations
* **[social.io](https://social.io/)**
customer support platform
* **[serve.zone](https://serve.zone/)**
scalable, simplified container management

5
docs/index.md Normal file
View File

@ -0,0 +1,5 @@
---
title: Home
---
# Home

View File

@ -0,0 +1,3 @@
---
title: "About the push.rocks project"
---

View File

@ -0,0 +1,252 @@
---
title: "@push.rocks/beautyfiglet"
---
# @push.rocks/beautyfiglet
A Node.js module that facilitates the creation of ASCII art using figlet with customizable fonts and layouts.
## Install
To install `@push.rocks/beautyfiglet`, ensure you have Node.js along with npm set up on your machine. Executing the following command in your terminal will install this module via npm:
```sh
npm install @push.rocks/beautyfiglet
```
Alternatively, you can add it as a dependency in your `package.json`:
```json
{
"dependencies": {
"@push.rocks/beautyfiglet": "^1.0.8"
}
}
```
Then execute:
```sh
npm install
```
## Usage
`@push.rocks/beautyfiglet` is a comprehensive Node.js package that empowers developers to generate visually engaging figlet-style ASCII art. This section will delve into detailed use-case scenarios, ensuring you have a robust understanding of how to integrate and utilize this module effectively within your projects.
### Getting Started
To begin using `@push.rocks/beautyfiglet`, import the `BeautyFiglet` class in your TypeScript file. This class serves as the gateway to generating your ASCII art.
```typescript
import { BeautyFiglet } from '@push.rocks/beautyfiglet';
console.log('Welcome to BeautyFiglet!'); // Outputs: Welcome to BeautyFiglet!
```
### Rendering Text with Figlet
The quintessential feature of this module is its ability to convert plain text into ASCII art using popular figlet formats. Below is an example of how to achieve this with `renderDefault`.
```typescript
(async () => {
const figletText = await BeautyFiglet.renderDefault('Hello, World!');
console.log(figletText); // Displays "Hello, World!" in ASCII format using the default font.
})();
```
### Custom Font Selection
One of the striking features of `BeautyFiglet` is the ability to select from a variety of fonts. This allows for a unique representation of your text.
```typescript
(async () => {
const customFiglet = await BeautyFiglet.renderText('Beautiful Text', 'Ghost');
console.log(customFiglet); // Renders the text "Beautiful Text" with the Ghost style.
})();
```
### Exploring Available Fonts
Knowing which fonts you can work with enhances your creative freedom. By listing available fonts, you can make informed choices.
```typescript
(async () => {
const fontsList = await BeautyFiglet.listFonts();
console.log('Available Fonts:');
console.log(fontsList.join(', ')); // Lists all fonts available for use in figlet.
})();
```
### Custom Text Layouts
Layouts, which refer to the arrangement of text, can be customized. Modify the horizontal and vertical layouts for dynamic artistry.
```typescript
import figlet from 'figlet';
const renderCustomLayout = (text: string, font: string, hLayout: string, vLayout: string): Promise<string> => {
return new Promise((resolve, reject) => {
figlet.text(text, { font, horizontalLayout: hLayout, verticalLayout: vLayout }, (err, data) => {
if (err) reject(`Error: ${err.message}`);
else resolve(data);
});
});
};
// Application Example
(async () => {
try {
const customLayoutText = await renderCustomLayout('Creative Layout', 'Ghost', 'full', 'full');
console.log(customLayoutText); // Renders with specified layout adjustments.
} catch (error) {
console.error(error);
}
})();
```
### Synchronous Text Rendering
For scenarios demanding immediate rendering results, such as testing or small scripts, `textSync` is a beneficial synchronous method.
```typescript
import { figlet } from '@push.rocks/beautyfiglet.plugins';
const artwork = figlet.textSync('Synchronicity!', {
font: 'Standard',
horizontalLayout: 'default',
verticalLayout: 'default'
});
console.log(artwork); // Output is rendered immediately without asynchronous behavior.
```
### Adding Color to the Output
To create more vibrant and visually appealing text displays, utilize libraries such as `chalk` to incorporate colors.
```typescript
import figlet from 'figlet';
import chalk from 'chalk';
(async () => {
const colorizedText = await BeautyFiglet.renderText('Color Me Beautiful', 'Standard');
console.log(chalk.magentaBright(colorizedText)); // Renders ASCII art in bright magenta.
})();
```
### Robust Error Handling
Effectively managing potential errors (e.g., when a specified font is unavailable) is essential to prevent application crashes.
```typescript
(async () => {
try {
const result = await BeautyFiglet.renderText('Error Test', 'NonExistentFont');
console.log(result);
} catch (error) {
console.error(`Caught an error: ${error}`); // Captures and logs errors without halting the program.
}
})();
```
### Web Server Integration
The functionality of this module can be extended to serve ASCII art over HTTP, allowing integration with web services. Here’s a demonstration using Express.
```typescript
import express from 'express';
import { BeautyFiglet } from '@push.rocks/beautyfiglet';
const app = express();
app.get('/api/art/:text', async (req, res) => {
const textToRender = req.params.text;
try {
const asciiArt = await BeautyFiglet.renderDefault(textToRender);
res.send(`<pre>${asciiArt}</pre>`); // Sends the rendered ASCII art in a preformatted text block over HTTP.
} catch (error) {
res.status(500).send(`Error: ${error.message}`); // Manages errors with a 500 Internal Server Error status code.
}
});
app.listen(4000, () => {
console.log('Server running at http://localhost:4000/');
});
```
### Command-Line Interface (CLI)
Creating a CLI tool enhances accessibility, allowing direct ASCII art generation from the terminal. Here's a demonstration:
```typescript
#!/usr/bin/env node
import { BeautyFiglet } from '@push.rocks/beautyfiglet';
import { Command } from 'commander';
const program = new Command();
program.version('1.0.8');
program
.option('-t, --text <text>', 'Text to render')
.option('-f, --font <font>', 'Font for rendering', 'Standard')
.action(async (cmd) => {
try {
const asciiArt = await BeautyFiglet.renderText(cmd.text, cmd.font);
console.log(asciiArt); // Renders text directly in CLI using specified options.
} catch (error) {
console.error(`Error: ${error.message}`);
}
});
program.parse(process.argv);
```
**CLI Tool Usage:**
1. Save the script as `beautyfiglet-cli.ts`.
2. Make it executable:
```sh
chmod +x ./beautyfiglet-cli.ts
```
3. Establish a link via npm:
```sh
npm link
```
4. Run the command using:
```sh
beautyfiglet-cli --text "Hello World" --font "Ghost"
```
This CLI approach demonstrates seamless integration into development workflows, adding simplicity and efficiency for users.
### Comprehensive Summary
Throughout this comprehensive guide, we have demonstrated the varied and extensive capabilities of the `@push.rocks/beautyfiglet` module. From initializing the module and employing basic rendering to exploring intricate font customization, layout configurations, and error handling, the guide has covered an exhaustive list of functionalities available within this versatile module.
Developers are encouraged to delve deeper into exploring font selections and engaging with additional configuration settings to thoroughly harness the potential of this tool. By integrating colorful text arrangements and utilizing robust error management, applications can balance both aesthetic appeal and operational reliability.
This expansive exploration into the `@push.rocks/beautyfiglet` module underscores the creativity and potential this tool offers for implementing ASCII art in your Node.js projects.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,80 @@
---
title: "@push.rocks/commitinfo"
---
# @push.rocks/commitinfo
bake commitinfos into code
## Install
To start using `@push.rocks/commitinfo`, you need to first install it via npm. To do this, run the following command in your terminal:
```sh
npm install @push.rocks/commitinfo --save
```
This command will add `@push.rocks/commitinfo` to your project's dependencies in your `package.json` file.
## Usage
The `@push.rocks/commitinfo` module is designed to help you incorporate commit information directly into your TypeScript codebase. Below are detailed steps and examples to utilize the module effectively.
### Basic Setup
First, ensure that your project is set up to use TypeScript and ESM syntax. Then, you can proceed to import and use `@push.rocks/commitinfo` in your project.
```typescript
import { CommitInfo } from '@push.rocks/commitinfo';
// Specify your project directory and the planned version type of your next commit
const commitInfo = new CommitInfo('./path/to/your/project', 'patch');
// Now you can use commitInfo to access or modify commit-related information
```
### Writing Commit Info into Your Project
One of the primary uses of `@push.rocks/commitinfo` is to bake commit information into your project dynamically. This is especially useful for including version information, project description, etc., within your build artifacts.
```typescript
// Assuming you've initialized `commitInfo` as shown previously
// Write commit info into potential directories like 'ts' or 'ts_web'
await commitInfo.writeIntoPotentialDirs(['ts', 'ts_web']);
```
This method will check for the existence of specified directories (e.g., 'ts' and 'ts_web') in your project and create a `00_commitinfo_data.ts` file with commit-related information in each present directory.
### Using Commit Info in Your Project
After running the `writeIntoPotentialDirs` function, `00_commitinfo_data.ts` will be generated in the specified directories. You can then import this file anywhere in your project to access the baked commit information.
```typescript
import { commitinfo } from './ts/00_commitinfo_data';
console.log(commitinfo.name); // Outputs: @push.rocks/commitinfo
console.log(commitinfo.version); // Outputs the version that was baked into the code
console.log(commitinfo.description); // Outputs: bake commitinfos into code
```
### Real-World Scenario: Automating Version Updates
A practical use case for `@push.rocks/commitinfo` is to automate the updating of version information across your project upon each new release. By integrating `commitInfo.writeIntoPotentialDirs()` into your CI/CD pipeline, you can ensure that each build artifact always contains the latest commit information, making it easier to trace back artifacts to specific versions and commits.
### Extending Usage
The above examples provide a basic understanding of how to use `@push.rocks/commitinfo`. However, feel free to explore more advanced scenarios that fit your project's needs, such as customizing the generated `00_commitinfo_data.ts` file or creating a dedicated workflow for handling version bumps and commit information updates.
### Conclusion
`@push.rocks/commitinfo` offers a streamlined and efficient way to incorporate dynamic commit information into your TypeScript projects. By following the examples and scenarios outlined above, you can enhance your project’s maintainability and traceability, ensuring that each piece of code can be unequivocally linked to specific commits and version updates.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,101 @@
---
title: "@push.rocks/consolecolor"
---
# @push.rocks/consolecolor
colors for beautylog
## Install
To install `@push.rocks/consolecolor`, you need Node.js installed on your system. If you have Node.js installed, you can add `@push.rocks/consolecolor` to your project by running:
```bash
npm install @push.rocks/consolecolor --save
```
This command will install `@push.rocks/consolecolor` and add it to your project's `package.json` file.
## Usage
In this guide, we'll explore how to use `@push.rocks/consolecolor` to colorize your console output in a Node.js application. We'll cover the basics, including coloring text, backgrounds, and combining both for striking effects. This package utilizes TypeScript and ESM syntax for modern, type-safe code examples.
### Getting Started
First, ensure you have imported the library in your TypeScript file:
```typescript
import * as consolecolor from '@push.rocks/consolecolor';
```
### Coloring Text
The foundation of using `@push.rocks/consolecolor` is to change the color of the text output. You can choose from a variety of colors including blue, red, green, and more. Here's how to color a string blue:
```typescript
let blueString = consolecolor.coloredString("This text is blue.", "blue");
console.log(blueString);
```
### Adding Background Color
In addition to coloring text, you can also set the background color of your text for greater emphasis:
```typescript
let redTextOnGreen = consolecolor.coloredString("Red text on a green background.", "red", "green");
console.log(redTextOnGreen);
```
### Combining Colors
You can easily mix and match text and background colors to suit your needs. Here's an example of a more detailed usage, where we add a function to create and log messages of different severities with appropriate coloring:
```typescript
function logMessage(message: string, type: 'info' | 'warning' | 'error') {
switch (type) {
case 'info':
console.log(consolecolor.coloredString(message, 'cyan'));
break;
case 'warning':
console.log(consolecolor.coloredString(message, 'orange', 'black'));
break;
case 'error':
console.log(consolecolor.coloredString(message, 'red', 'white'));
break;
}
}
logMessage('An informational message', 'info');
logMessage('A warning message', 'warning');
logMessage('An error message', 'error');
```
This example defines a `logMessage` function that accepts a message and a message type. It uses `@push.rocks/consolecolor` to color the message according to its severity.
### Advanced Usage
Beyond basic coloring, `@push.rocks/consolecolor` allows for intricate customization. For instance, you can create utilities that dynamically select colors based on conditions, enhance logging mechanisms, or implement theme-based console outputs in your Node.js applications.
Considering the capabilities of `@push.rocks/consolecolor` alongside Node.js's console object, you can create highly readable, colorful console applications that are easier to debug and pleasant to interact with.
### Conclusion
`@push.rocks/consolecolor` offers a simple yet powerful API for adding color to Node.js console applications. By following the examples provided, you can enhance the visual appeal and readability of your console output, making development and debugging a more enjoyable experience. For a comprehensive list of all available colors and more advanced features, refer to the official documentation and explore the module's possibilities.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,117 @@
---
title: "@push.rocks/early"
---
# @push.rocks/early
minimal and fast loading plugin for startup time measuring
## Install
To install `@push.rocks/early`, run the following command in your terminal:
```bash
npm install @push.rocks/early --save
```
This will add `@push.rocks/early` to your project's dependencies and prepare it for use.
## Usage
In this guide, we'll explore how to use `@push.rocks/early` to measure startup times in your application. This tool is designed to be minimal and fast, providing accurate measurements of how long it takes for parts of your application to load.
### Getting Started with `@push.rocks/early`
First, ensure that your project is set up with TypeScript and that you are familiar with working with ES modules. `@push.rocks/early` is built with TypeScript in mind, offering excellent IntelliSense support in compatible editors.
#### Importing `@push.rocks/early`
To begin, import the library into your module:
```typescript
import * as early from '@push.rocks/early';
```
#### Starting Measurement
The first step in using `@push.rocks/early` is to start the measurement. This should be done as early as possible in your application's startup sequence:
```typescript
early.start('myModuleName');
```
Replace `'myModuleName'` with a string identifier for the module or application part you are measuring. This is purely for identification purposes and aids in debugging or logging.
#### Performing Your Loading Operations
After starting the measurement, proceed with the operations or loading tasks you wish to measure. This could involve loading modules, reading files, or any setup tasks required for your application to start:
```typescript
// Example loading operations
await myModule.initialize();
await myOtherModule.loadConfig();
```
#### Stopping Measurement and Retrieving Results
Once your loading operations are complete, stop the measurement to retrieve the loading time:
```typescript
early.stop().then((loadingTime: number) => {
console.log(`Loading time: ${loadingTime} milliseconds`);
});
```
This will output the total loading time in milliseconds, giving you a precise measure of the startup performance.
### Advanced Features
`@push.rocks/early` allows for more advanced use cases, such as measuring multiple segments individually or in parallel. Each `start` can be matched with a corresponding `stop` to measure different parts of your application independently:
```typescript
early.start('partOne');
// Load operations for part one...
early.stop().then((time: number) => console.log(`Part one loading time: ${time}`));
early.start('partTwo');
// Load operations for part two...
early.stop().then((time: number) => console.log(`Part two loading time: ${time}`));
```
### High Resolution Time Measurement Class
For more granular control or to measure very short operations, `@push.rocks/early` offers a `HrtMeasurement` class for high-resolution time measurements:
```typescript
import { HrtMeasurement } from '@push.rocks/early';
const hrtMeasurement = new HrtMeasurement();
hrtMeasurement.start();
// perform short duration tasks
hrtMeasurement.stop();
console.log(`Operation took ${hrtMeasurement.milliSeconds} milliseconds`);
```
This can be particularly useful for micro-benchmarks or when measuring the performance impact of optimization efforts.
### Conclusion
`@push.rocks/early` is a powerful yet minimalistic tool for measuring startup times and performance in Node.js applications. Its straightforward API, coupled with TypeScript support, makes it an excellent choice for developers looking to optimize their applications or simply understand their loading characteristics better.
By integrating `@push.rocks/early` into your development process, you can gain valuable insights into your application's performance, helping you make informed decisions about optimizations and improvements.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,109 @@
---
title: "@push.rocks/gulp-function"
---
# @push.rocks/gulp-function
[@push.rocks/gulp-function](https://www.npmjs.com/package/@push.rocks/gulp-function) is a Gulp plugin designed to execute custom functions within a Gulp pipeline. It accepts a function call as a parameter and allows for flexible task executions, including asynchronous tasks, with easy integration into the Gulp workflow.
## Install
To use @push.rocks/gulp-function in your project, you'll first need to install it via npm. You can do this by running the following command in your project's root directory:
```bash
npm install @push.rocks/gulp-function --save-dev
```
This command will add `@push.rocks/gulp-function` as a development dependency to your project, making it available for use in your Gulp tasks.
## Usage
The primary use case for `@push.rocks/gulp-function` is to incorporate custom function executions into your Gulp pipelines. This can be particularly useful for tasks that require conditional processing, external API calls, or any other logic that extends beyond the capabilities of existing Gulp plugins.
Here's how you can use `@push.rocks/gulp-function` within your Gulp setup:
### Basic Example
Let's start with a simple scenario where you want to log the path of files processed by Gulp.
```typescript
import gulp from 'gulp';
import gulpFunction, { forEach } from '@push.rocks/gulp-function';
const logFilePath = async (file: Buffer, enc: string) => {
console.log(`Processing file: ${file.path}`);
};
gulp.task('log', () => {
return gulp.src('./src/**/*.ts')
.pipe(forEach(logFilePath))
.pipe(gulp.dest('./dist'));
});
```
In this example, we're using the `forEach` method exported by `@push.rocks/gulp-function` to execute `logFilePath` for each file matched by `gulp.src`. The file's path is logged to the console during the build process.
### Advanced Use Case: Asynchronous Function Execution
`@push.rocks/gulp-function` truly shines when you need to perform asynchronous operations within your Gulp tasks. Here's an example that demonstrates making an asynchronous API call for each file:
```typescript
import gulp from 'gulp';
import gulpFunction, { forEach } from '@push.rocks/gulp-function';
import axios from 'axios';
const uploadFileToServer = async (file: Buffer, enc: string) => {
const formData = new FormData();
formData.append('file', file.contents, file.relative);
await axios.post('https://example.com/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
});
console.log(`Uploaded file: ${file.path}`);
};
gulp.task('uploadFiles', () => {
return gulp.src('./uploads/**/*')
.pipe(forEach(uploadFileToServer))
.pipe(gulp.dest('./dist/uploads'));
});
```
In this more advanced example, we use the `forEach` method to upload each file to a remote server using `axios`. The function `uploadFileToServer` is executed for each file, where an HTTP POST request is made to upload the file. This shows how you can integrate asynchronous operations seamlessly into your Gulp pipeline.
### Execution Modes
`@push.rocks/gulp-function` supports three execution modes for your functions: `forEach`, `forFirst`, and `atEnd`.
- **forEach**: Executes the provided function for each file in the stream.
- **forFirst**: Executes the provided function only for the first file that passes through the stream.
- **atEnd**: Executes the provided function once after all files have passed through the stream.
These modes provide flexibility in determining when your custom functions should be triggered during the build process.
### Conclusion
`@push.rocks/gulp-function` is a powerful tool for integrating custom processing logic into Gulp workflows. Whether you need to execute simple synchronous tasks or complex asynchronous operations, `@push.rocks/gulp-function` offers the flexibility and ease of use to enhance your Gulp builds significantly.
Remember, the examples provided are starting points. The real power of `@push.rocks/gulp-function` lies in its ability to adapt to your specific use cases, enabling you to automate and streamline your build processes as never before.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,96 @@
---
title: "@push.rocks/isohash"
---
# @push.rocks/isohash
a hash package that works cross environment
## Install
To start using @push.rocks/isohash in your project, you need to install it via npm. Ensure you have Node.js and npm installed on your system before proceeding. Then, run the following command in your project's root directory:
```bash
npm install @push.rocks/isohash --save
```
This will add `@push.rocks/isohash` as a dependency to your `package.json` file and download the package to the `node_modules` folder.
## Usage
This section provides detailed examples and explanations on how to use the `@push.rocks/isohash` package effectively in your projects. The package offers a seamless way to compute hash values, specifically SHA-256, in various environments such as Node.js and modern web browsers.
### Computing SHA-256 Hash
The primary feature of `@push.rocks/isohash` is computing SHA-256 hash values from strings. This process varies depending on the environment—Node.js or the browser. The package abstracts these differences, providing a unified API.
#### TypeScript Example
Below is a TypeScript example demonstrating how to compute a SHA-256 hash from a given string. This example is applicable regardless of your environment, thanks to the cross-environment capabilities of @push.rocks/isohash.
First, ensure you have TypeScript and the necessary types installed in your project.
```bash
npm install typescript @types/node --save-dev
```
Then, you can compute a SHA-256 hash as follows:
```typescript
import { sha256FromString } from '@push.rocks/isohash';
// Example string to hash
const exampleString = 'Hello, world!';
(async () => {
// Compute the SHA-256 hash of the example string
const hashResult = await sha256FromString(exampleString);
console.log(`SHA-256 Hash: ${hashResult}`);
})();
```
This function asynchronously returns the SHA-256 hash of the input string in hexadecimal format. The package internally handles the computation differences between Node.js and browser environments, providing a consistent API.
### Understanding Cross-Environment Hashing
@push.rocks/isohash leverages different underlying technologies based on the execution environment:
- **In Node.js**, it uses the `crypto` module available in the Node.js standard library to compute hashes.
- **In Browsers**, it utilizes the Web Crypto API (`crypto.subtle`).
This design choice ensures that the library is lightweight and performs well in both environments by using the most efficient and secure methods available in each.
### Real-World Use Cases
Here are a few scenarios where computing hashes with @push.rocks/isohash can be beneficial:
- Verifying the integrity of data transmitted over a network.
- Generating unique identifiers for data that can be compared efficiently.
- Implementing secure password storage mechanisms (when combined with salts).
The cross-environment capability makes @push.rocks/isohash an excellent choice for applications that need to perform hashing operations both client-side and server-side, such as Single Page Applications (SPAs) with Node.js backends.
### Contributions
Contributing to the development of `@push.rocks/isohash` is encouraged. Whether you're improving the documentation, adding new features, or reporting bugs, your contributions are welcome. Visit the [repository](https://gitlab.com/pushrocks/isohash) to get started.
### Wrapping Up
In conclusion, `@push.rocks/isohash` offers a streamlined, environment-agnostic approach to computing SHA-256 hash values in TypeScript projects. By abstracting away the environmental differences, it enables developers to write cleaner, more maintainable code for both server-side and client-side hashing needs.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,106 @@
---
title: "@push.rocks/isotransport"
---
# @push.rocks/isotransport
a bi-directional, multiplatform, best-effort transport
## Install
To install `@push.rocks/isotransport`, use the following command in your project directory:
```bash
npm install @push.rocks/isotransport --save
```
This will fetch and install the `isotransport` package and add it as a dependency to your project's `package.json` file.
## Usage
The `@push.rocks/isotransport` module is designed as a versatile transport layer that abstracts away the complexity of bi-directional communication across different platforms. Its goal is to provide a "best effort" transport, meaning it aims to optimize communication reliability and efficiency without guaranteeing message delivery under all circumstances.
In the following sections, various aspects of using `@push.rocks/isotransport` are covered, including setting up a simple server-client connection, handling messages, and configuring the transport layer for different environments.
### Basic Setup
First, ensure that you are using TypeScript and have it configured in your project. `@push.rocks/isotransport` is developed with TypeScript in mind, offering type definitions out of the box for enhanced development experience.
#### Importing
Start by importing the necessary components from `@push.rocks/isotransport` in your TypeScript file:
```typescript
import { IsotransportServer, IsotransportClient } from '@push.rocks/isotransport';
```
### Setting Up a Server
To set up a server instance that listens for incoming connections, use the `IsotransportServer` class:
```typescript
const transportServer = new IsotransportServer({
port: 8080, // Specify the port on which the server should listen
});
// Start listening for connections
transportServer.listen().then(() => {
console.log('Server is listening for incoming connections...');
});
// Handling client connections
transportServer.on('connection', (client) => {
console.log('Client connected:', client.id);
client.on('message', (message) => {
console.log('Message from client:', message);
});
client.send('Welcome to isotransport server!');
});
```
### Setting Up a Client
Setting up a client that connects to an isotransport server is straightforward with the `IsotransportClient` class:
```typescript
const transportClient = new IsotransportClient({
url: 'ws://localhost:8080', // URL of the isotransport server
});
// Connecting to the server
transportClient.connect().then(() => {
console.log('Connected to the server.');
});
// Sending a message to the server
transportClient.send('Hello, server!');
// Receiving messages from the server
transportClient.on('message', (message) => {
console.log('Message from server:', message);
});
```
### Multiplatform Communication
`@push.rocks/isotransport` shines in scenarios where communication needs to happen across different platforms, for example, between a Node.js server and a web client. The design of isotransport abstracts the underlying transport mechanisms (like WebSockets for web clients and TCP sockets for Node.js), offering a unified API for sending and receiving messages.
### Advanced Configuration
Isotransport provides hooks and configuration options for tweaking its behavior to fit specific use cases. For instance, you can configure retry strategies for message delivery, set custom serializers for message encoding/decoding, or integrate with custom logging solutions to monitor communication flows.
Due to the scope of this guide, these advanced topics are not covered in detail here. However, they are well-documented in the isotransport API documentation, offering comprehensive insights into enhancing the capabilities of your transport layer.
### Conclusion
`@push.rocks/isotransport` is a powerful tool for creating reliable, efficient, and scalable communication layers in your application. By abstracting the complexities of bi-directional multiplatform communication, it allows developers to focus on building the core features of their applications. Whether you're developing a real-time chat application, a distributed microservices architecture, or any system that requires robust communication, isotransport provides the foundational elements needed to bring your project to life.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,176 @@
---
title: "@push.rocks/levelcache"
---
# @push.rocks/levelcache
A cache that utilizes memory, disk, and S3 for data storage and backup.
## Install
To install `@push.rocks/levelcache`, you can use npm or yarn:
```bash
npm install @push.rocks/levelcache --save
```
or
```bash
yarn add @push.rocks/levelcache
```
This installs `@push.rocks/levelcache` and adds it to your project's dependencies.
## Usage
`@push.rocks/levelcache` provides a comprehensive solution for multi-level caching that takes advantage of memory, disk, and Amazon S3 storage, making it a versatile tool for data caching and backup. The package is built with TypeScript, enabling strict type checks and better development experience. Below, we'll explore how to effectively employ `@push.rocks/levelcache` in your projects, discussing its features and demonstrating its usage with code examples.
### 1. Overview
The `LevelCache` class handles all cache operations. It decides where to store data based on pre-configured thresholds corresponding to the data size and the total storage capacity allocated for each storage type (memory/disk/S3). This mechanism optimizes both speed and persistence, allowing for efficient data storage and retrieval.
### 2. Getting Started: Initialization
To use `@push.rocks/levelcache`, you'll need to import the main classes: `LevelCache` and `CacheEntry`. `LevelCache` is the primary class, while `CacheEntry` represents individual pieces of cached data.
```typescript
import { LevelCache, CacheEntry } from '@push.rocks/levelcache';
```
#### Initialization with Optional Configurations
To create a cache, instantiate the `LevelCache` class with desired configurations. You can specify the limits for memory and disk storage, setup S3 configurations if needed, and more.
```typescript
const myCache = new LevelCache({
cacheId: 'myUniqueCacheId', // Unique ID for cache delineation
maxMemoryStorageInMB: 10, // Maximum memory use in MB (default 0.5 MB)
maxDiskStorageInMB: 100, // Maximum disk space in MB (default 10 MB)
diskStoragePath: './myCache', // Path for storing disk cache; default is '.nogit'
s3Config: {
accessKeyId: 'yourAccessKeyId', // AWS S3 access key
secretAccessKey: 'yourSecretAccessKey', // Corresponding secret key
region: 'us-west-2' // AWS region, e.g., 'us-west-2'
},
s3BucketName: 'myBucketName', // Designated name for S3 bucket
immutableCache: false, // Whether stored cache entries should remain unaltered
persistentCache: true, // Should the cache persist upon restarts
});
```
### 3. Storing and Retrieving Data
`LevelCache` methods enable seamless data storage and retrieval, handling complexity under the hood.
#### Storing Data
Create a `CacheEntry` specifying the data content and time-to-live (`ttl`). Use `storeCacheEntryByKey` to add this entry to the cache.
```typescript
async function storeData() {
// Wait for cache to be ready before operations
await myCache.ready;
const entryContents = Buffer.from('Caching this data');
const myCacheEntry = new CacheEntry({
ttl: 7200000, // Time-to-live in milliseconds (2 hours)
contents: entryContents,
});
// Storing the cache entry associated with a specific key
await myCache.storeCacheEntryByKey('someDataKey', myCacheEntry);
}
```
#### Retrieving Data
Retrieve stored data using `retrieveCacheEntryByKey`. The retrieved `CacheEntry` will give access to the original data.
```typescript
async function retrieveData() {
const retrievedEntry = await myCache.retrieveCacheEntryByKey('someDataKey');
if (retrievedEntry) {
const data = retrievedEntry.contents.toString();
console.log(data); // Expected output: Caching this data
} else {
console.log('Data not found or expired.');
}
}
```
### 4. Key Management: Updating and Deleting
#### Deleting Cache Entries
Remove entries with `deleteCacheEntryByKey`, enabling clean cache management.
```typescript
async function deleteData() {
// Removes an entry using its unique key identifier
await myCache.deleteCacheEntryByKey('someDataKey');
}
```
### 5. Cache Cleaning
Often, managing storage limits or removing outdated data becomes essential. The library supports these scenarios.
#### Automated Cleaning
While cache entries will naturally expire with `ttl` values, you can force-remove outdated entries.
```typescript
// Clean outdated or expired entries
await myCache.cleanOutdated();
```
#### Full Cache Reset
Clear all entries, efficiently resetting your cache storage.
```typescript
// Flush entire cache content
await myCache.cleanAll();
```
### 6. Configuring and Managing Advanced Use Cases
The flexible nature of `@push.rocks/levelcache` grants additional customization suited for more advanced requirements.
#### Custom Route Management
For certain demands, you might want to specify distinct data handling policies or routing logic.
- Adjust S3 handling, size thresholds, or immutability options dynamically.
- Utilize internal API expansions defined within the library for fine-grained operations.
#### Handling Large Datasets
Tailor the cache levels (memory, disk, S3) to accommodate higher loads:
```typescript
const largeDatasetCache = new LevelCache({
cacheId: 'largeDatasetCache',
// Customize limits and behavior for particular patterns
maxMemoryStorageInMB: 1024, // 1 GB memory allocation
maxDiskStorageInMB: 2048, // 2 GB disk space allowance
maxS3StorageInMB: 10240, // 10 GB S3 backup buffering
});
```
With intelligent routing and management embedded, `LevelCache` ensures optimal trade-offs between speed and stability.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,207 @@
---
title: "@push.rocks/lik"
---
# @push.rocks/lik
light little helpers for node
## Install
To install `@push.rocks/lik`, you can use npm (Node Package Manager). Simply run the following command in your terminal:
```bash
npm install @push.rocks/lik --save
```
This will download `@push.rocks/lik` and add it to your project's `package.json` dependencies.
## Usage
`@push.rocks/lik` is a versatile package offering a variety of helper classes designed to simplify common tasks in Node.js development. From managing asynchronous operations to handling collections efficiently, this library provides lightweight solutions to enhance your coding workflow. Below, we explore several key features of `@push.rocks/lik`, presenting TypeScript examples to demonstrate their practical application in real-world scenarios.
### AsyncExecutionStack
`AsyncExecutionStack` allows for managing asynchronous task execution with exclusive and non-exclusive slots, ensuring effective handling of resource-intensive operations.
```typescript
import { AsyncExecutionStack } from '@push.rocks/lik';
const myAsyncStack = new AsyncExecutionStack();
// Exclusive execution ensures this task doesn't run in parallel with others
await myAsyncStack.getExclusiveExecutionSlot(async () => {
// some asynchronous operation
}, 2500);
// Non-exclusive slots can run in parallel
myAsyncStack.getNonExclusiveExecutionSlot(async () => {
// another asynchronous operation
}, 1500);
```
### FastMap
`FastMap` offers a high-performance, key-value map optimized for rapid access and modifications, ideal for scenarios requiring frequent read/write operations.
```typescript
import { FastMap } from '@push.rocks/lik';
const myFastMap = new FastMap<string>();
// Add items
myFastMap.addToMap('key1', 'value1');
myFastMap.addToMap('key2', 'value2');
// Retrieve item
const value = myFastMap.getByKey('key1'); // 'value1'
```
### LimitedArray
`LimitedArray` enforces a maximum size on an array, automatically managing its length to prevent it from exceeding a defined limit.
```typescript
import { LimitedArray } from '@push.rocks/lik';
const myLimitedArray = new LimitedArray<number>(5); // limit size to 5
myLimitedArray.addMany([1, 2, 3, 4, 5, 6]);
console.log(myLimitedArray.array); // [2, 3, 4, 5, 6]
```
### LoopTracker
`LoopTracker` helps detect and prevent infinite loops by tracking object references during iterations.
```typescript
import { LoopTracker } from '@push.rocks/lik';
const myLoopTracker = new LoopTracker<object>();
const obj1 = {};
if (myLoopTracker.checkAndTrack(obj1)) {
// proceed with operation
} else {
// potential loop detected
}
```
### ObjectMap
`ObjectMap` facilitates object management, providing functionalities for adding, finding, and removing objects with ease.
```typescript
import { ObjectMap } from '@push.rocks/lik';
interface MyObject {
id: number;
name: string;
}
const myObjectMap = new ObjectMap<MyObject>();
const obj: MyObject = { id: 1, name: 'Test Object' };
// Add object
myObjectMap.add(obj);
// Find object
const found = myObjectMap.findSync(item => item.id === 1);
```
### StringMap
`StringMap` simplifies string collection management, allowing you to add, remove, and query strings effectively.
```typescript
import { Stringmap } from '@push.rocks/lik';
const myStringMap = new Stringmap();
// Add strings
myStringMap.addString('hello');
myStringMap.addStringArray(['world', 'example']);
// Check string presence
const exists = myStringMap.checkString('hello'); // true
```
### TimedAggregator
`TimedAggregator` batches operations over a specified time interval, useful for aggregating logs, metrics, or any data points over time.
```typescript
import { TimedAggregtor } from '@push.rocks/lik';
const myAggregator = new TimedAggregtor<string>({
aggregationIntervalInMillis: 5000, // 5 seconds
functionForAggregation: (items) => {
console.log('Aggregated items:', items);
}
});
// Add items
myAggregator.add('item1');
myAggregator.add('item2');
// After 5 seconds, the functionForAggregation will log the aggregated items
```
### InterestMap and Tree
`InterestMap` provides a structure for managing subscriptions or interests in certain events or entities, optimizing notification mechanisms.
```typescript
import { InterestMap } from '@push.rocks/lik';
const myInterestMap = new InterestMap<string, number>((str) => str);
myInterestMap.addInterest('event1').then((interest) => {
interest.fullfillInterest(42);
});
```
`Tree` offers a way to handle hierarchical data structures, allowing for the composition and traversal of tree-like data sets.
```typescript
import { Tree } from '@push.rocks/lik';
class TreeNode {
constructor(public value: string) {}
}
const myTree = new Tree<TreeNode>();
const rootNode = new TreeNode('root');
myTree.initialize(rootNode);
// Add child nodes
const childNode = new TreeNode('child');
myTree.appendChild(rootNode, childNode);
```
### Utilizing @push.rocks/lik in Your Project
With `@push.rocks/lik`, you gain access to a comprehensive set of lightweight utilities that can significantly simplify and expedite the development process in Node.js environments. By leveraging the library's classes and functions, you can implement efficient data structures, manage asynchronous operations gracefully, and streamline complex logic with ease.
By integrating `@push.rocks/lik` into your project, you'll benefit from improved code clarity, reduced boilerplate, and enhanced performance, allowing you to focus on developing the core functionalities of your application. Whether you're managing various collections, executing asynchronous tasks in controlled manners, or dealing with hierarchical data, `@push.rocks/lik` provides the tools you need to achieve your objectives with minimal overhead.
Remember, continuous exploration of `@push.rocks/lik`'s capabilities and experimenting with its various components in different scenarios will help you unlock its full potential. As your familiarity with the library grows, you'll discover even more ways to optimize your codebase and streamline your development workflow.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,34 @@
---
title: "@push.rocks/metadoc"
---
# @push.rocks/metadoc
a metadoc module for progressivly enhancing documents
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@push.rocks/metadoc)
* [gitlab.com (source)](https://code.foss.global/push.rocks/metadoc)
* [github.com (source mirror)](https://github.com/push.rocks/metadoc)
* [docs (typedoc)](https://push.rocks.gitlab.io/metadoc/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://code.foss.global/push.rocks/metadoc/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://code.foss.global/push.rocks/metadoc/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@push.rocks/metadoc)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/push.rocks/metadoc)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@push.rocks/metadoc)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@push.rocks/metadoc)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@push.rocks/metadoc)](https://lossless.cloud)
## Usage
Use TypeScript for best in class intellisense
For further information read the linked docs at the top of this readme.
## Legal
> MIT licensed | **&copy;** [Task Venture Capital GmbH](https://task.vc)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)

View File

@ -0,0 +1,94 @@
---
title: "@push.rocks/mongodump"
---
# @push.rocks/mongodump
a tool to handle dumps of MongoDB databases
## Install
To use @push.rocks/mongodump in your project, run:
```bash
npm install @push.rocks/mongodump --save
```
## Usage
This guide provides an overview of how to work with @push.rocks/mongodump to handle dumps of MongoDB databases efficiently.
### Setting up a MongoDB Dump Target
First, you'll need to describe your MongoDB database using an interface provided by the module. Here's a sample descriptor:
```typescript
import { IMongoDescriptor } from '@tsclass/tsclass';
import { MongoDump, MongoDumpTarget } from '@push.rocks/mongodump';
const myMongoDescriptor: IMongoDescriptor = {
mongoDbName: '<database_name>',
mongoDbUser: '<database_user>',
mongoDbPass: '<database_password>',
mongoDbUrl: 'mongodb+srv://<user>:<password>@<cluster_url>/<dbname>?retryWrites=true&w=majority',
};
```
### Creating and Using the MongoDump Instance
To interact with MongoDB for dumping purposes, you'll use the `MongoDump` class:
```typescript
async function setupMongoDump() {
const mongoDump = new MongoDump();
const mongoDumpTarget = await mongoDump.addMongoTargetByMongoDescriptor(myMongoDescriptor);
// mongoDumpTarget can now be used for further operations
}
setupMongoDump();
```
### Dumping Collections to a Directory
To dump the collections of a database into a directory with files representing each document, you can use the `dumpCollectionToDir` method. This method is useful for creating backups or migrating data:
```typescript
async function dumpCollections() {
const mongoDump = new MongoDump();
const mongoDumpTarget = await mongoDump.addMongoTargetByMongoDescriptor(myMongoDescriptor);
await mongoDumpTarget.dumpAllCollectionsToDir('./path/to/dumpDir', null, true);
// This dumps all collections to the specified directory, cleaning the directory before dumping.
}
dumpCollections();
```
### Advanced Dumping Options
For more control over the dumping process, including naming conventions for dumped files or handling specific collections, you can explore methods like `dumpCollectionToDir` for individual collections and advanced configurations concerning directory cleanliness and document naming.
### Shutting Down Properly
It's important to close down database connections properly once your dumping operations are complete:
```typescript
async function shutDownMongoDump() {
const mongoDump = new MongoDump();
await mongoDump.stop();
// Closes all open database connections gracefully
}
shutDownMongoDump();
```
### Conclusion
The @push.rocks/mongodump module provides a flexible approach to handling MongoDB database dumps, whether it's for backup, migration, or other purposes. By leveraging TypeScript and modern async patterns, it integrates smoothly into modern Node.js applications focused on MongoDB interactions.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,314 @@
---
title: "@push.rocks/npmextra"
---
# @push.rocks/npmextra
A utility to enhance npm with additional configuration, tool management capabilities, and a key-value store for project setups.
## Install
To install `@push.rocks/npmextra`, use the following npm command:
```bash
npm install @push.rocks/npmextra --save
```
This package is available on [npm](https://www.npmjs.com/package/@push.rocks/npmextra) and can be installed into your project as a dependency to enhance npm with additional configuration and tool management capabilities.
## Usage
`@push.rocks/npmextra` is designed to supplement npm functionalities with enhanced configuration and tool management. It facilitates the management of project configurations and tool setups in a consolidated manner, enabling a smoother workflow and maintenance process. Below are detailed use cases and examples implemented with ESM syntax and TypeScript.
### Initial Setup and Configuration
To start using `npmextra` in your project, first include it with an import statement:
```typescript
import { Npmextra } from '@push.rocks/npmextra';
```
Instantiate the `Npmextra` class optionally with a custom path to your project's working directory. If no path is provided, the current working directory (`process.cwd()`) is used.
```typescript
const npmExtraInstance = new Npmextra('/path/to/your/project');
```
### Managing Tool Configurations with `npmextra.json`
`@push.rocks/npmextra` excels in unifying tool configurations through a single `npmextra.json` file. Instead of scattering configurations across multiple files, `npmextra` enables you to define tool-specific settings within this centralized configuration file, which can then be accessed programmatically.
#### Creating and Utilizing `npmextra.json`
Create a `npmextra.json` in your project root with the following structure:
```json
{
"toolname": {
"setting1": "value1",
"setting2": "value2"
}
}
```
For example, to configure a hypothetical tool named `toolname`, define its settings as shown above.
#### Accessing Configuration in Your Project
With the configuration defined, you can easily access these settings in your TypeScript code as follows:
```typescript
// Import the npmextra module
import { Npmextra } from '@push.rocks/npmextra';
// Create an instance pointing at the current directory
const npmExtraInstance = new Npmextra();
// Retrieve the configuration for 'toolname', merging defaults with any found in npmextra.json
const toolConfig = npmExtraInstance.dataFor<{ setting1: string, setting2: string }>('toolname', {
setting1: 'defaultValue1',
setting2: 'defaultValue2'
});
// toolConfig now contains the merged settings from npmextra.json and provided defaults
console.log(toolConfig);
```
### Key-Value Store Management
`@push.rocks/npmextra` also includes a Key-Value Store (KeyValueStore) functionality enabling persistent storage of key-value pairs between script executions.
#### Setting Up KeyValueStore
To utilize the KeyValueStore, create an instance specifying its scope (e.g., 'userHomeDir') and a unique identity for your application or tool:
```typescript
import { KeyValueStore } from '@push.rocks/npmextra';
const kvStore = new KeyValueStore<'userHomeDir'>({
typeArg: 'userHomeDir',
identityArg: 'myUniqueAppName'
});
```
You can then use the `writeKey`, `readKey`, `writeAll`, and `readAll` methods to manage your store respectively.
#### Example: Storing and Retrieving Data
```typescript
// Write a single key-value pair
await kvStore.writeKey('username', 'johnDoe');
// Read a single key
const username = await kvStore.readKey('username');
console.log(username); // Outputs: johnDoe
// Write multiple key-value pairs
await kvStore.writeAll({
email: 'john@example.com',
isAdmin: true
});
// Read all key-value pairs
const allData = await kvStore.readAll();
console.log(allData); // Outputs the entire store's contents
```
### Advanced Key-Value Store Management
In addition to basic read/write operations, `npmextra`’s `KeyValueStore` supports advanced scenarios like mandatory keys and custom file paths.
#### Example: Mandatory Keys and Custom Paths
Consider a scenario where your application requires specific keys to be present in the KeyValueStore. You can define mandatory keys and use a custom path for your store like this:
```typescript
import { KeyValueStore } from '@push.rocks/npmextra';
interface CustomData {
key1: string;
key2: number;
key3?: boolean;
}
const kvStore = new KeyValueStore<CustomData>({
typeArg: 'custom',
identityArg: 'customApp',
customPath: '/custom/path/to/store.json',
mandatoryKeys: ['key1', 'key2']
});
// Ensure all mandatory keys are present
const missingKeys = await kvStore.getMissingMandatoryKeys();
if (missingKeys.length) {
console.log(`Missing mandatory keys: ${missingKeys.join(', ')}`);
}
// Use the KeyValueStore
await kvStore.writeKey('key1', 'value1');
await kvStore.writeKey('key2', 123);
const key1Value = await kvStore.readKey('key1');
const allData = await kvStore.readAll();
console.log(key1Value); // Outputs: value1
console.log(allData); // Outputs: { key1: 'value1', key2: 123 }
```
### Combining AppData and KeyValueStore
The `AppData` class extends the functionality of `KeyValueStore` by integrating environmental variables, specifying additional configurations, and providing a more structured approach to data management.
#### Example: AppData Usage
```typescript
import { AppData } from '@push.rocks/npmextra';
interface AppSettings {
settingA: string;
settingB: number;
nestedSetting: {
innerSetting: boolean;
}
}
const appDataInstance = await AppData.createAndInit<AppSettings>({
dirPath: '/custom/path/to/appdata',
requiredKeys: ['settingA', 'settingB'],
envMapping: {
settingA: 'MY_ENV_A',
settingB: 'hard:42',
nestedSetting: {
innerSetting: 'MY_ENV_INNER'
}
}
});
const appDataKvStore = await appDataInstance.getKvStore();
// Writing values
await appDataKvStore.writeKey('settingA', 'exampleValue');
await appDataKvStore.writeKey('settingB', 100);
await appDataKvStore.writeKey('nestedSetting', { innerSetting: true });
// Reading values
const settingA = await appDataKvStore.readKey('settingA');
const allSettings = await appDataKvStore.readAll();
console.log(settingA); // Outputs: 'exampleValue'
console.log(allSettings); // Outputs: { settingA: 'exampleValue', settingB: 100, nestedSetting: { innerSetting: true } }
```
### Error Handling and Debugging
Proper error handling ensures your integrations with `npmextra` are robust and stable. Below are some strategies for error handling and debugging potential issues.
#### Example: Error Handling in KeyValueStore
```typescript
import { KeyValueStore } from '@push.rocks/npmextra';
const kvStore = new KeyValueStore('userHomeDir', 'errorHandlingApp');
try {
await kvStore.writeKey('importantKey', 'importantValue');
const value = await kvStore.readKey('importantKey');
console.log(value); // Outputs: importantValue
} catch (error) {
console.error('Error managing key-value store:', error);
}
```
#### Debugging Configuration Issues in `npmextra.json`
To debug configuration issues, you can utilize conditional logging and checks:
```typescript
import { Npmextra } from '@push.rocks/npmextra';
const npmExtraInstance = new Npmextra();
const toolConfig = npmExtraInstance.dataFor('toolname', {
configKey1: 'defaultValue1',
configKey2: 'defaultValue2'
});
if (!toolConfig.configKey1) {
console.error('configKey1 is missing in npmextra.json');
}
console.log(toolConfig);
```
### Integration Tests
Writing tests ensures that your integration with `npmextra` works as expected. Below are examples of integration tests for both `Npmextra` and `KeyValueStore`.
#### Example: Testing `Npmextra` Class
```typescript
import { expect, tap } from '@push.rocks/tapbundle';
import { Npmextra } from '@push.rocks/npmextra';
let npmExtraInstance: Npmextra;
tap.test('should create an instance of Npmextra', async () => {
npmExtraInstance = new Npmextra();
expect(npmExtraInstance).toBeInstanceOf(Npmextra);
});
tap.test('should load configuration from npmextra.json', async () => {
const config = npmExtraInstance.dataFor('toolname', {
defaultKey1: 'defaultValue1',
});
expect(config).toHaveProperty('defaultKey1');
});
tap.start();
```
#### Example: Testing `KeyValueStore` Class
```typescript
import { expect, tap } from '@push.rocks/tapbundle';
import { KeyValueStore } from '@push.rocks/npmextra';
let kvStore: KeyValueStore<{ key1: string, key2: number }>;
tap.test('should create a KeyValueStore instance', async () => {
kvStore = new KeyValueStore({
typeArg: 'userHomeDir',
identityArg: 'testApp'
});
expect(kvStore).toBeInstanceOf(KeyValueStore);
});
tap.test('should write and read back a value', async () => {
await kvStore.writeKey('key1', 'value1');
const result = await kvStore.readKey('key1');
expect(result).toEqual('value1');
});
tap.test('should write and read back multiple values', async () => {
await kvStore.writeAll({ key1: 'updatedValue1', key2: 2 });
const result = await kvStore.readAll();
expect(result).toEqual({ key1: 'updatedValue1', key2: 2 });
});
tap.start();
```
### Summary
By centralizing configuration management and offering a versatile key-value store, `@push.rocks/npmextra` significantly simplifies the setup and management of tools and settings in modern JavaScript and TypeScript projects. Whether you're managing project-wide configurations or need persistent storage for key-value pairs, `npmextra` provides an efficient and streamlined solution. Leveraging these robust features will ensure your project is well-configured and maintainable.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,106 @@
---
title: "@push.rocks/projectinfo"
---
# @push.rocks/projectinfo
gather information about projects. supports npm, git etc.
## Install
To install `@push.rocks/projectinfo`, you need a Node.js environment with npm. It's recommended to have TypeScript and ts-node installed for the best development experience. Run the following command:
```bash
npm install @push.rocks/projectinfo --save
```
This will add it to your project's `package.json` file and download the package into the `node_modules` folder.
## Usage
The `@push.rocks/projectinfo` module provides a powerful interface to gather detailed information about your projects, focusing on common project management tools like npm and git. Below are various examples and use cases demonstrating how to use this module effectively.
### Setup
First, make sure to import `ProjectInfo` from the package in your TypeScript file. Here's how to get started:
```typescript
import { ProjectInfo } from '@push.rocks/projectinfo';
```
### Gathering NPM Information
If you wish to extract npm-related information such as the project name and version from your `package.json`, you can instantiate `ProjectInfo` and access the `npm` property.
```typescript
const projectInfo = new ProjectInfo('./path/to/your/project');
console.log(`Project Name: ${projectInfo.npm.name}`);
console.log(`Project Version: ${projectInfo.npm.version}`);
```
This example assumes that your current working directory (`cwd`) is set correctly relative to your project. Adjust `'./path/to/your/project'` as necessary.
### Accessing Git Information
Similarly, to extract git-related information, you can access the `git` property. This allows you to get details about the git repository;
```typescript
console.log(`Git Repository: ${projectInfo.git.gitrepo}`);
// Outputs the git repository name
console.log(`Git User/Organization: ${projectInfo.git.gituser}`);
// Outputs the git user or organization name
```
It is important to note that these git properties are parsed from the local git configuration, so your project needs to be initialized with git and properly configured.
### Working with Asynchronous Operations
While the basic usage examples above are synchronous, `@push.rocks/projectinfo` might also offer functionality that requires async/await for operations that involve I/O processes, such as reading files or fetching data from remote APIs. Always refer to the specific method documentation to understand its nature (synchronous or asynchronous) and use it appropriately in your code.
### Integrating with Other Push.rocks Modules
The `@push.rocks/projectinfo` package is designed to work seamlessly with other packages from the Push.rocks suite. For instance, it utilizes `@push.rocks/smartfile` for efficient file handling, `@push.rocks/smartpath` for path manipulations, and `@push.rocks/smartpromise` for enhanced promise-based operations. This interconnectivity allows for a more integrated and efficient toolset when managing complex project setups.
### Advanced Usage and Customization
For more advanced use cases, such as customizing the way information is gathered or integrating `@push.rocks/projectinfo` into larger workflows, you are encouraged to explore the package's source code and accompanying documentation. The modular design and comprehensive TypeScript typings facilitate customization and extension to meet specific project requirements.
### Error Handling
When utilizing `@push.rocks/projectinfo` in your project automation or scripts, make sure to implement proper error handling. This helps in gracefully handling situations where project information might be missing, malformatted, or when underlying tools (npm, git) are not available in the environment.
```typescript
try {
const projectInfo = new ProjectInfo('./path/to/your/project');
// Use projectInfo as needed
} catch (error) {
console.error('Failed to gather project info:', error);
}
```
### Summary
`@push.rocks/projectinfo` offers a versatile and powerful API for gathering and managing project information, making it an invaluable tool for developers looking to automate project setups, CI/CD pipelines, or simply organize and access project metadata more efficiently. Its integration with npm and git provides a solid foundation for extracting, analyzing, and utilizing essential project data across various aspects of software development and deployment workflows.
By leveraging TypeScript for development, users are afforded the benefits of static typing, including better autocompletion, easier refactorings, and improved code quality. This document has outlined basic and advanced usage scenarios, aiming to equip developers with the knowledge to effectively incorporate `@push.rocks/projectinfo` into their projects.
Note: The examples above are designed to be straightforward and easy to follow. Depending on the complexity and requirements of your specific project, you might need to adapt these examples. Always refer to the official documentation and TypeScript typings for the most accurate and up-to-date information.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,128 @@
---
title: "@push.rocks/qenv"
---
# @push.rocks/qenv
easy promised environments
## Install
To install `@push.rocks/qenv`, you need to have Node.js installed on your system. Once Node.js is installed, you can add `@push.rocks/qenv` to your project by running the following command in your project's root directory:
```bash
npm install @push.rocks/qenv --save
```
This command will add `@push.rocks/qenv` as a dependency to your project, and you will be ready to use it in your application.
## Usage
`@push.rocks/qenv` provides a convenient way to manage and access environment variables in your Node.js projects, especially when dealing with different environments like development, testing, and production. Its primary use is to load environment-specific variables in an easy and organized manner. Below is an extensive guide on how to use this module effectively in various scenarios, ensuring you can handle environment variables efficiently in your projects.
### Getting Started
First, ensure you have TypeScript configured in your project. `@push.rocks/qenv` is fully typed, providing excellent IntelliSense support when working in editors that support TypeScript, such as Visual Studio Code.
#### Importing Qenv
To get started, import the `Qenv` class from `@push.rocks/qenv`:
```typescript
import { Qenv } from '@push.rocks/qenv';
```
#### Basic Configuration
`@push.rocks/qenv` works with two main files: `qenv.yml` for specifying required environment variables, and `env.yml` for specifying values for these variables. These files should be placed in your project directory.
##### qenv.yml
This file specifies the environment variables that are required by your application. An example `qenv.yml` might look like this:
```yaml
required:
- DB_HOST
- DB_USER
- DB_PASS
```
##### env.yml
This file contains the actual values for the environment variables in a development or testing environment. An example `env.yml` could be:
```yaml
DB_HOST: localhost
DB_USER: user
DB_PASS: pass
```
#### Instantiating Qenv
Create an instance of `Qenv` by providing paths to the directories containing the `qenv.yml` and `env.yml` files, respectively:
```typescript
const myQenv = new Qenv('./path/to/dir/with/qenv', './path/to/dir/with/env');
```
If the `env.yml` file is in the same directory as `qenv.yml`, you can omit the second argument:
```typescript
const myQenv = new Qenv('./path/to/dir/with/both');
```
#### Accessing Environment Variables
After instantiating `Qenv`, you can access the loaded environment variables directly from `process.env` in Node.js or through the `myQenv` instance for more complex scenarios like asynchronous variable resolution:
```typescript
// Accessing directly via process.env
console.log(process.env.DB_HOST); // 'localhost' in development environment
// Accessing via Qenv instance for more advanced scenarios
(async () => {
const dbHost = await myQenv.getEnvVarOnDemand('DB_HOST');
console.log(dbHost); // 'localhost'
})();
```
### Advanced Usage
#### Handling Missing Variables
By default, `Qenv` will throw an error and exit if any of the required environment variables specified in `qenv.yml` are missing. You can disable this behavior by passing `false` as the third argument to the constructor, which allows your application to handle missing variables gracefully:
```typescript
const myQenv = new Qenv('./path/to/dir/with/qenv', './path/to/dir/with/env', false);
```
#### Dynamic Environment Variables
For dynamic or computed environment variables, you can define functions that resolve these variables asynchronously. This is particularly useful for variables that require fetching from an external source:
```typescript
// Define a function to fetch a variable
const fetchDbHost = async () => {
// Logic to fetch DB_HOST from an external service
return 'dynamic.host';
};
// Use the function with getEnvVarOnDemand
(async () => {
const dbHost = await myQenv.getEnvVarOnDemand(fetchDbHost);
console.log(dbHost); // 'dynamic.host'
})();
```
#### Reading Variables from Docker Secrets or Other Sources
Internally, `@push.rocks/qenv` supports reading from Docker secrets, providing flexibility for applications deployed in Docker environments. The module attempts to read each required variable from the process environment, a provided `env.yml` file, Docker secrets, or any custom source you integrate.
### Conclusion
`@push.rocks/qenv` simplifies handling environment variables across different environments, making your application's configuration more manageable and secure. By separating variable definitions from their values and providing support for dynamic resolution, `@push.rocks/qenv` offers a robust solution for managing configuration in Node.js projects. Whether you're working in a local development environment, CI/CD pipelines, or production, `@push.rocks/qenv` ensures that you have the correct configuration for the task at hand.
Note: Due to the complexity and depth of `@push.rocks/qenv`, this documentation aims to cover general and advanced usage comprehensively. Please refer to the module's official documentation and typed definitions for further details on specific features or configuration options.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,104 @@
---
title: "@push.rocks/searchquery"
---
# @push.rocks/searchquery
a module for dealing with searchqueries
## Install
To use `@push.rocks/searchquery` in your project, you need to install it via npm. You can do so by running the following command in your terminal:
```sh
npm install @push.rocks/searchquery --save
```
This will add `@push.rocks/searchquery` to your project's dependencies and allow you to start using it in your code.
## Usage
`@push.rocks/searchquery` is designed to enhance the handling of search queries within your application. It leverages the power of `search-query-parser` and `@pushrocks/smartrx` for parsing and reactive management of search queries. In this guide, we'll explore how to effectively use this module to its full potential.
### Initializing SearchQuery
First, let's start by importing and initializing the `SearchQuery` class from `@push.rocks/searchquery`. You will need to provide it with appropriate options.
```typescript
import { SearchQuery } from '@push.rocks/searchquery';
const searchQueryOptions = {
debounceMs: 300, // Milliseconds to debounce the search input
searchParserOptions: { // Options passed to 'search-query-parser'
keywords: ['tag', 'author'],
ranges: ['date'],
tokenize: true,
alwaysArray: true,
},
};
const mySearchQuery = new SearchQuery(searchQueryOptions);
```
The `debounceMs` option allows you to set a debounce time for processing the search query, which can help in reducing the frequency of search operation execution, making it more efficient especially for applications that perform real-time search query processing.
The `searchParserOptions` are directly passed to the `search-query-parser`. In this example, we specify that we want to parse for keywords such as `tag` and `author`, and for range queries like `date`. We also configure the parser to always return the results as an array and to tokenize the input.
### Feeding the Search String
To process a search string, you'll need to feed it into your `SearchQuery` instance. Typically, you'd do this in response to a user action, such as typing in a search input on a UI. Below is an example of how you might do this:
```typescript
// Placeholder function to simulate user input
async function simulateUserInput(input: string) {
// Here you would feed the user input to the search query
// In a real application, this might be triggered by an event listener on a search input field
}
// Example usage
simulateUserInput('tag:important author:John');
```
### Subscribing to Search Query Changes
`SearchQuery` utilizes reactive programming principles by using a Subject from the `@pushrocks/smartrx` package. You can subscribe to the search query's changes and get notified whenever the search query is updated. This is particularly useful for implementing real-time search features where the search results are dynamically updated as the user types.
```typescript
mySearchQuery.querySubject.subscribe({
next: (searchQueryResult) => {
console.log('New search query result:', searchQueryResult);
// Here you would typically update the search results in your UI based on the new searchQueryResult
},
error: (err) => {
console.error('Something went wrong with the search query subscription:', err);
},
});
```
This setup allows you to build highly interactive and responsive search experiences in your web application while keeping the complexity of handling search queries and results manageable.
### Advanced Usage
`@push.rocks/searchquery` is designed to be flexible and extensible. You can further customize its behavior by exploring additional options available in the `search-query-parser` library and integrating more features from the `@pushrocks/smartrx` package for advanced reactive programming patterns.
Remember to explore the APIs and documentation of these underlying libraries to fully leverage the power of `@push.rocks/searchquery` in your projects.
## Conclusion
`@push.rocks/searchquery` offers a powerful and flexible way to handle search queries in your application. By combining the capabilities of `search-query-parser` for parsing complex queries and `@pushrocks/smartrx` for reactive programming, it provides a robust solution for managing and responding to user-generated search queries in real time. Whether you are building a search-intensive application or just need a sophisticated mechanism to deal with search queries, `@push.rocks/searchquery` is a valuable tool to have in your development toolkit.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,290 @@
---
title: "@push.rocks/smartacme"
---
```markdown
# @push.rocks/smartacme
A TypeScript-based ACME client with an easy yet powerful interface for LetsEncrypt certificate management.
## Install
To install `@push.rocks/smartacme`, you can use npm or yarn. Run one of the following commands in your project directory:
```bash
npm install @push.rocks/smartacme --save
```
or
```bash
yarn add @push.rocks/smartacme
```
Make sure your project is set up to use TypeScript and supports ECMAScript Modules (ESM).
## Usage
This guide will walk you through using `@push.rocks/smartacme` to set up and manage ACME (Automated Certificate Management Environment) certificates with a focus on the Let's Encrypt service, which provides free SSL certificates. The library provides an easy yet powerful TypeScript interface to automate the process of obtaining, renewing, and installing your SSL certificates.
### Table of Contents
1. [Setting Up Your Project](#setting-up-your-project)
2. [Creating a SmartAcme Instance](#creating-a-smartacme-instance)
3. [Initializing SmartAcme](#initializing-smartacme)
4. [Obtaining a Certificate for a Domain](#obtaining-a-certificate-for-a-domain)
5. [Automating DNS Challenges](#automating-dns-challenges)
6. [Managing Certificates](#managing-certificates)
7. [Environmental Considerations](#environmental-considerations)
8. [Complete Example](#complete-example)
### Setting Up Your Project
Ensure your project includes the necessary TypeScript configuration and dependencies. You'll need to have TypeScript installed and configured for ECMAScript Modules. If you are new to TypeScript, review its [documentation](https://www.typescriptlang.org/docs/) to get started.
### Creating a SmartAcme Instance
Start by importing the `SmartAcme` class from the `@push.rocks/smartacme` package. You'll also need to import or define interfaces for your setup options:
```typescript
import { SmartAcme } from '@push.rocks/smartacme';
const smartAcmeInstance = new SmartAcme({
accountEmail: 'youremail@example.com', // Email used for Let's Encrypt registration and recovery
accountPrivateKey: null, // Private key for the account (optional, if not provided it will be generated)
mongoDescriptor: {
mongoDbUrl: 'mongodb://yourmongoURL',
mongoDbName: 'yourDbName',
mongoDbPass: 'yourDbPassword',
},
removeChallenge: async (dnsChallenge) => {
// Implement logic here to remove DNS challenge records
},
setChallenge: async (dnsChallenge) => {
// Implement logic here to create DNS challenge records
},
environment: 'integration', // Use 'production' for actual certificates
});
```
### Initializing SmartAcme
Before proceeding to request certificates, initialize your SmartAcme instance:
```typescript
await smartAcmeInstance.init();
```
### Obtaining a Certificate for a Domain
To obtain a certificate for a specific domain, use the `getCertificateForDomain` method. This function ensures that if a valid certificate is already present, it will be reused; otherwise, a new certificate is obtained:
```typescript
const myDomain = 'example.com';
const myCert = await smartAcmeInstance.getCertificateForDomain(myDomain);
console.log('Certificate:', myCert);
```
### Automating DNS Challenges
Part of the ACME protocol involves responding to DNS challenges issued by the certificate authority to prove control over a domain. Implement the `setChallenge` and `removeChallenge` functions in your SmartAcme configuration to automate this process. These functions receive a `dnsChallenge` argument containing details needed to create or remove the necessary DNS records.
```typescript
import * as cloudflare from '@apiclient.xyz/cloudflare';
import { Qenv } from '@push.rocks/qenv';
const testQenv = new Qenv('./', './.nogit/');
const testCloudflare = new cloudflare.CloudflareAccount(testQenv.getEnvVarOnDemand('CF_TOKEN'));
const smartAcmeInstance = new SmartAcme({
accountEmail: 'domains@example.com',
accountPrivateKey: null,
mongoDescriptor: {
mongoDbName: testQenv.getEnvVarRequired('MONGODB_DATABASE'),
mongoDbPass: testQenv.getEnvVarRequired('MONGODB_PASSWORD'),
mongoDbUrl: testQenv.getEnvVarRequired('MONGODB_URL'),
},
removeChallenge: async (dnsChallenge) => {
testCloudflare.convenience.acmeRemoveDnsChallenge(dnsChallenge);
},
setChallenge: async (dnsChallenge) => {
testCloudflare.convenience.acmeSetDnsChallenge(dnsChallenge);
},
environment: 'integration',
});
await smartAcmeInstance.init();
```
### Managing Certificates
The library automatically handles fetching, renewing, and storing your certificates in a MongoDB database specified in your configuration. Ensure your MongoDB instance is accessible and properly configured for use with SmartAcme.
```typescript
const mongoDescriptor = {
mongoDbUrl: 'mongodb://yourmongoURL',
mongoDbName: 'yourDbName',
mongoDbPass: 'yourDbPassword',
};
```
### Environmental Considerations
When creating an instance of `SmartAcme`, you can specify an `environment` option. This is particularly useful for testing, as you can use the `integration` environment to avoid hitting rate limits and for testing your setup without issuing real certificates. Switch to `production` when you are ready to obtain actual certificates.
### Complete Example
Below is a complete example demonstrating how to use `@push.rocks/smartacme` to obtain and manage an ACME certificate with Let's Encrypt:
```typescript
import { SmartAcme } from '@push.rocks/smartacme';
import * as cloudflare from '@apiclient.xyz/cloudflare';
import { Qenv } from '@push.rocks/qenv';
const qenv = new Qenv('./', './.nogit/');
const cloudflareAccount = new cloudflare.CloudflareAccount(qenv.getEnvVarOnDemand('CF_TOKEN'));
async function main() {
const smartAcmeInstance = new SmartAcme({
accountEmail: 'youremail@example.com',
accountPrivateKey: null,
mongoDescriptor: {
mongoDbUrl: qenv.getEnvVarRequired('MONGODB_URL'),
mongoDbName: qenv.getEnvVarRequired('MONGODB_DATABASE'),
mongoDbPass: qenv.getEnvVarRequired('MONGODB_PASSWORD'),
},
setChallenge: async (dnsChallenge) => {
await cloudflareAccount.convenience.acmeSetDnsChallenge(dnsChallenge);
},
removeChallenge: async (dnsChallenge) => {
await cloudflareAccount.convenience.acmeRemoveDnsChallenge(dnsChallenge);
},
environment: 'integration',
});
await smartAcmeInstance.init();
const myDomain = 'example.com';
const myCert = await smartAcmeInstance.getCertificateForDomain(myDomain);
console.log('Certificate:', myCert);
await smartAcmeInstance.stop();
}
main().catch(console.error);
```
In this example, `Qenv` is used to manage environment variables, and `cloudflare` library is used to handle DNS challenges required by Let's Encrypt ACME protocol. The `setChallenge` and `removeChallenge` methods are essential for automating the DNS challenge process, which is a key part of domain validation.
## Additional Details
### Certificate Object
The certificate object obtained from the `getCertificateForDomain` method has the following properties:
- `id`: Unique identifier for the certificate.
- `domainName`: The domain name for which the certificate is issued.
- `created`: Timestamp of when the certificate was created.
- `privateKey`: The private key associated with the certificate.
- `publicKey`: The public key or certificate itself.
- `csr`: Certificate Signing Request (CSR) used to obtain the certificate.
- `validUntil`: Timestamp indicating the expiration date of the certificate.
### Methods Summary
- **start()**: Initializes the SmartAcme instance, sets up the ACME client, and registers the account with Let's Encrypt.
- **stop()**: Closes the MongoDB connection and performs any necessary cleanup.
- **getCertificateForDomain(domainArg: string)**: Retrieves or obtains a certificate for the specified domain name. If a valid certificate exists in the database, it is returned. Otherwise, a new certificate is requested and stored.
- **setChallenge(dnsChallenge: any)**: Automates the process of setting DNS challenge records.
- **removeChallenge(dnsChallenge: any)**: Automates the process of removing DNS challenge records.
### Handling Domain Matching
The `SmartacmeCertMatcher` class is responsible for matching certificates with the broadest scope for wildcard certificates. The `getCertificateDomainNameByDomainName` method ensures that domains at various levels are correctly matched.
```typescript
import { SmartacmeCertMatcher } from '@push.rocks/smartacme';
const certMatcher = new SmartacmeCertMatcher();
const certDomainName = certMatcher.getCertificateDomainNameByDomainName('subdomain.example.com');
console.log('Certificate Domain Name:', certDomainName); // Output: example.com
```
### Testing
Automated tests can be added to ensure that the setup and functions work as expected. Using a testing framework such as `tap` and mock services for DNS providers (e.g., Cloudflare), you can simulate the process of obtaining and managing certificates without the need for actual domain ownership.
```typescript
import { tap, expect } from '@push.rocks/tapbundle';
import { Qenv } from '@push.rocks/qenv';
import * as cloudflare from '@apiclient.xyz/cloudflare';
import * as smartacme from '@push.rocks/smartacme';
const testQenv = new Qenv('./', './.nogit/');
const testCloudflare = new cloudflare.CloudflareAccount(testQenv.getEnvVarOnDemand('CF_TOKEN'));
let smartAcmeInstance: smartacme.SmartAcme;
tap.test('should create a valid instance of SmartAcme', async () => {
smartAcmeInstance = new smartacme.SmartAcme({
accountEmail: 'domains@lossless.org',
accountPrivateKey: null,
mongoDescriptor: {
mongoDbName: testQenv.getEnvVarRequired('MONGODB_DATABASE'),
mongoDbPass: testQenv.getEnvVarRequired('MONGODB_PASSWORD'),
mongoDbUrl: testQenv.getEnvVarRequired('MONGODB_URL'),
},
setChallenge: async (dnsChallenge) => {
await testCloudflare.convenience.acmeSetDnsChallenge(dnsChallenge);
},
removeChallenge: async (dnsChallenge) => {
await testCloudflare.convenience.acmeRemoveDnsChallenge(dnsChallenge);
},
environment: 'integration',
});
await smartAcmeInstance.init();
expect(smartAcmeInstance).toBeInstanceOf(smartacme.SmartAcme);
});
tap.test('should get a domain certificate', async () => {
const certificate = await smartAcmeInstance.getCertificateForDomain('example.com');
console.log('Certificate:', certificate);
expect(certificate).toHaveProperty('domainName', 'example.com');
});
tap.test('certmatcher should correctly match domains', async () => {
const certMatcher = new smartacme.SmartacmeCertMatcher();
const matchedCert = certMatcher.getCertificateDomainNameByDomainName('subdomain.example.com');
expect(matchedCert).toBe('example.com');
});
tap.test('should stop correctly', async () => {
await smartAcmeInstance.stop();
expect(smartAcmeInstance).toHaveProperty('client', null);
});
tap.start();
```
This comprehensive guide ensures you can set up, manage, and test ACME certificates efficiently and effectively using `@push.rocks/smartacme`.
---
```
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,107 @@
---
title: "@push.rocks/smartaction"
---
# @push.rocks/smartaction
a module for managing actions. What was done? What needs to be done? How often should it be done? What's currently being done?
## Install
To start using `@push.rocks/smartaction` in your project, you need to install it using npm or yarn. Run one of the following commands in your project root:
```bash
npm install @push.rocks/smartaction --save
```
or if you prefer yarn:
```bash
yarn add @push.rocks/smartaction
```
## Usage
`@push.rocks/smartaction` is designed to help manage actions within your application. It can keep track of actions' states, frequency, and dependencies, making it easier to handle complex workflows. Below, we'll dive into how you can integrate `@push.rocks/smartaction` into your TypeScript projects.
### Setting Up
First, make sure you import the necessary classes from the package at the beginning of your TypeScript file.
```typescript
import { Action, ActionStore } from '@push.rocks/smartaction';
```
### Creating Actions
Actions are the building blocks of your workflow management. Each action represents a task or a series of tasks that need to be performed.
```typescript
const myFirstAction = new Action({
name: 'initialSetup',
description: 'Performs the initial setup tasks',
});
```
In the example above, we create a simple action called `initialSetup`. The constructor takes an object where you can specify various properties of the action, such as its name and description.
### Managing Actions with ActionStore
While `Action` instances represent the individual tasks, `ActionStore` is where you manage them collectively. It allows you to add, retrieve, and execute actions based on your criteria.
```typescript
import { ActionStore } from '@push.rocks/smartaction';
const myActionStore = new ActionStore();
// Adding an action to the store
myActionStore.addAction(myFirstAction);
// Executing an action by name
await myActionStore.executeAction('initialSetup');
```
`ActionStore` provides a range of methods to work with the actions, such as adding new actions to the store, executing them, and checking their status.
### Advanced Usage: Dependencies and Scheduling
`@push.rocks/smartaction` supports more sophisticated use cases, including action dependencies and scheduling.
For instance, if you have actions that should only run after certain other actions have completed, you can set up these dependencies explicitly.
```typescript
const prepareDatabaseAction = new Action({
name: 'prepareDatabase',
description: 'Prepares the database for use',
});
const loadDataAction = new Action({
name: 'loadData',
description: 'Loads initial data into the database',
dependencies: ['prepareDatabase'], // This action depends on the 'prepareDatabase' action
});
myActionStore.addAction(prepareDatabaseAction);
myActionStore.addAction(loadDataAction);
// When executed, `loadDataAction` will wait for `prepareDatabaseAction` to complete
await myActionStore.executeAction('loadData');
```
Scheduling actions allows you to control when actions should be executed, potentially on a recurring basis. While `@push.rocks/smartaction` provides a foundation for action management, scheduling might require integration with other libraries or your custom code, depending on your project's needs.
### Conclusion
`@push.rocks/smartaction` is a powerful module for managing actions within your applications. From simple task execution to handling complex dependencies and scheduling, it can help streamline your workflow management process. As demonstrated, integrating `@push.rocks/smartaction` into your TypeScript application is straightforward, and it can significantly enhance your project's capability to manage and execute actions efficiently.
Remember, the examples provided here are just starting points. Depending on your application's complexity and requirements, you might find yourself extending classes or contributing new features to handle your specific use cases better.
For more information and advanced configurations, please refer to the official documentation and explore the TypeScript declaration files to understand all available options and methods. Happy coding!
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,114 @@
---
title: "@push.rocks/smartai"
---
# @push.rocks/smartai
Provides a standardized interface for integrating and conversing with multiple AI models, supporting operations like chat and potentially audio responses.
## Install
To add @push.rocks/smartai to your project, run the following command in your terminal:
```bash
npm install @push.rocks/smartai
```
This command installs the package and adds it to your project's dependencies.
## Usage
The `@push.rocks/smartai` package is a comprehensive solution for integrating and interacting with various AI models, designed to support operations ranging from chat interactions to possibly handling audio responses. This documentation will guide you through the process of utilizing `@push.rocks/smartai` in your applications, focusing on TypeScript and ESM syntax to demonstrate its full capabilities.
### Getting Started
Before you begin, ensure you have installed the package in your project as described in the **Install** section above. Once installed, you can start integrating AI functionalities into your application.
### Initializing SmartAi
The first step is to import and initialize the `SmartAi` class with appropriate options, including tokens for the AI services you plan to use:
```typescript
import { SmartAi } from '@push.rocks/smartai';
const smartAi = new SmartAi({
openaiToken: 'your-openai-access-token',
anthropicToken: 'your-anthropic-access-token'
});
await smartAi.start();
```
### Creating Conversations with AI
`SmartAi` provides a flexible interface to create and manage conversations with different AI providers. You can create a conversation with any supported AI provider like OpenAI or Anthropic by specifying the provider you want to use:
```typescript
const openAiConversation = await smartAi.createConversation('openai');
const anthropicConversation = await smartAi.createConversation('anthropic');
```
### Chatting with AI
Once you have a conversation instance, you can start sending messages to the AI and receive responses. Each conversation object provides methods to interact in a synchronous or asynchronous manner, depending on your use case.
#### Synchronous Chat Example
Here's how you can have a synchronous chat with OpenAI:
```typescript
const response = await openAiConversation.chat({
systemMessage: 'This is a greeting from the system.',
userMessage: 'Hello, AI! How are you today?',
messageHistory: [] // Previous messages in the conversation
});
console.log(response.message); // Log the response from AI
```
#### Streaming Chat Example
For real-time, streaming interactions, you can utilize the streaming capabilities provided by the conversation object. This enables a continuous exchange of messages between your application and the AI:
```typescript
const inputStreamWriter = openAiConversation.getInputStreamWriter();
const outputStream = openAiConversation.getOutputStream();
inputStreamWriter.write('Hello, AI! Can you stream responses?');
const reader = outputStream.getReader();
reader.read().then(function processText({done, value}) {
if (done) {
console.log('Stream finished.');
return;
}
console.log('AI says:', value);
reader.read().then(processText); // Continue reading messages
});
```
### Extending Conversations
The modular design of `@push.rocks/smartai` allows you to extend conversations with additional features, such as handling audio responses or integrating other AI-powered functionalities. Utilize the provided AI providers' APIs to explore and implement a wide range of AI interactions within your conversations.
### Conclusion
With `@push.rocks/smartai`, integrating AI functionalities into your applications becomes streamlined and efficient. By leveraging the standardized interface provided by the package, you can easily converse with multiple AI models, expanding the capabilities of your applications with cutting-edge AI features. Whether you're implementing simple chat interactions or complex, real-time communication flows, `@push.rocks/smartai` offers the tools and flexibility needed to create engaging, AI-enhanced experiences.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,123 @@
---
title: "@push.rocks/smartantivirus"
---
# @push.rocks/smartantivirus
A package for performing antivirus testing, especially suitable for use with ClamAV.
## Install
Installing `@push.rocks/smartantivirus` is straightforward. You'll need Node.js and npm installed on your machine to get started. Once they are ready, you can add the `@push.rocks/smartantivirus` package to your project by running the following command:
```bash
npm install @push.rocks/smartantivirus
```
This will add the package to your project's dependencies and allow you to integrate antivirus scanning capabilities directly into your application.
## Usage
The `@push.rocks/smartantivirus` package provides tools to easily integrate antivirus scanning capabilities into your Node.js application by interfacing with the ClamAV daemon. Below is a comprehensive guide on how to use the features of this library.
### Setting Up the ClamAV Daemon
Before using this package, make sure you have ClamAV installed and running on your system. You can find installation instructions for various operating systems on the [ClamAV official website](https://www.clamav.net/documents/installing-clamav).
After installing ClamAV, start the ClamAV daemon (`clamd`). Make sure it is configured to listen on a port accessible to your Node.js application. You can configure this in the `clamd.conf` file, typically located in `/etc/clamav/clamd.conf`.
### Basic Usage
The primary interface provided by the package is the `ClamAvService` class. It allows you to scan data in memory or verify the connection to the ClamAV daemon.
```typescript
import { ClamAvService } from '@push.rocks/smartantivirus';
async function main() {
const clamService = new ClamAvService('127.0.0.1', 3310); // Replace with your ClamAV host and port
// Verify connection to ClamAV
const isConnected = await clamService.verifyConnection();
console.log(`Connection to ClamAV: ${isConnected ? 'successful' : 'failed'}`);
if (!isConnected) {
console.error('Could not connect to ClamAV daemon. Please check your configuration.');
return;
}
// Scan a text string
const testString = 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*';
const scanResult = await clamService.scanString(testString);
console.log('Scan Result:', scanResult);
}
main().catch(console.error);
```
**Breaking Down the Example:**
1. **Initialization**: We start by creating an instance of the `ClamAvService` class. It takes two optional parameters: the host and port where your ClamAV daemon is running. By default, it assumes `127.0.0.1` and `3310`.
2. **Verify Connection**: The `verifyConnection` method is called to ensure that our application can communicate with the ClamAV daemon. It returns a promise that resolves to `true` if the connection is successful, and `false` otherwise.
3. **Scan Strings**: We utilize the `scanString` method to scan a text string (in this example, the EICAR test virus string is used). This method converts the string to a buffer and sends it to the ClamAV daemon for scanning.
### Handling Buffers
Below is an example demonstrating scanning raw binary data in the form of buffers:
```typescript
import { ClamAvService } from '@push.rocks/smartantivirus';
async function scanBufferExample() {
const clamService = new ClamAvService();
// This buffer should represent the binary data you want to scan.
const buffer = Buffer.from('Sample buffer contents', 'utf8');
try {
const scanResult = await clamService.scanBuffer(buffer);
console.log('Buffer Scan Result:', scanResult);
} catch (error) {
console.error('Error scanning buffer:', error);
}
}
scanBufferExample();
```
**Explanation:**
- We create an instance of `ClamAvService`.
- A buffer is created and passed to the `scanBuffer` method, which scans the in-memory data for potential viruses.
### Error Handling and Debugging
The methods of `ClamAvService` throw errors if there are issues with communication or processing data. Wrap your code in try-catch blocks and use appropriate logging to handle errors gracefully.
```typescript
try {
const scanResult = await clamService.scanString('Some suspicious string...');
console.log(`Infection Status: ${scanResult.isInfected ? 'Infected' : 'Clean'}`);
if (scanResult.isInfected) {
console.log(`Reason: ${scanResult.reason}`);
}
} catch (error) {
console.error('An error occurred during the scanning process:', error);
}
```
### Testing your setup
A preconfigured test script is provided, which demonstrates how to use the package with the Tap bundle testing framework. You can find the test script in `test/test.ts`. This is configured to run with the default `@push.rocks/tapbundle` setup:
```bash
npm run test
```
The tests include creating and utilizing a `ClamAvService` instance and attempts to scan the well-known EICAR test string. They ensure that the basic functionality of the package is working as intended.
### Advanced Usage and Integration
Beyond scanning strings and buffers, you can implement additional advanced use cases based on your specific application needs, such as integrating into web services or automating file scans in cloud environments. Consider building upon provided functionalities and adapting them to meet the requirements of your application architecture.
With the help of Node.js worker threads or external task queues like RabbitMQ, you can distribute scanning tasks efficiently within high-traffic environments.

View File

@ -0,0 +1,285 @@
---
title: "@push.rocks/smartarchive"
---
# @push.rocks/smartarchive
`@push.rocks/smartarchive` is a powerful library designed for managing archive files. It provides utilities for compressing and decompressing data in various formats such as zip, tar, gzip, and bzip2. This library aims to simplify the process of handling archive files, making it an ideal choice for projects that require manipulation of archived data.
## Install
To install `@push.rocks/smartarchive`, you can either use npm or yarn. Run one of the following commands in your project directory:
```shell
npm install @push.rocks/smartarchive --save
```
or if you prefer yarn:
```shell
yarn add @push.rocks/smartarchive
```
This will add `@push.rocks/smartarchive` to your project's dependencies.
## Usage
`@push.rocks/smartarchive` provides an easy-to-use API for extracting, creating, and analyzing archive files. Below, we'll cover how to get started and explore various features of the module.
### Importing SmartArchive
First, import `SmartArchive` from `@push.rocks/smartarchive` using ESM syntax:
```typescript
import { SmartArchive } from '@push.rocks/smartarchive';
```
### Extracting Archive Files
You can extract archive files from different sources using `SmartArchive.fromArchiveUrl`, `SmartArchive.fromArchiveFile`, and `SmartArchive.fromArchiveStream`. Here's an example of extracting an archive from a URL:
```typescript
import { SmartArchive } from '@push.rocks/smartarchive';
async function extractArchiveFromURL() {
const url = 'https://example.com/archive.zip';
const targetDir = '/path/to/extract';
const archive = await SmartArchive.fromArchiveUrl(url);
await archive.exportToFs(targetDir);
console.log('Archive extracted successfully.');
}
extractArchiveFromURL();
```
### Extracting an Archive from a File
Similarly, you can extract an archive from a local file:
```typescript
import { SmartArchive } from '@push.rocks/smartarchive';
async function extractArchiveFromFile() {
const filePath = '/path/to/archive.zip';
const targetDir = '/path/to/extract';
const archive = await SmartArchive.fromArchiveFile(filePath);
await archive.exportToFs(targetDir);
console.log('Archive extracted successfully.');
}
extractArchiveFromFile();
```
### Stream-Based Extraction
For larger files, you might prefer a streaming approach to prevent high memory consumption. Here’s an example:
```typescript
import { SmartArchive } from '@push.rocks/smartarchive';
import { createReadStream } from 'fs';
async function extractArchiveUsingStream() {
const archiveStream = createReadStream('/path/to/archive.zip');
const archive = await SmartArchive.fromArchiveStream(archiveStream);
const extractionStream = await archive.exportToStreamOfStreamFiles();
extractionStream.pipe(createWriteStream('/path/to/destination'));
}
extractArchiveUsingStream();
```
### Analyzing Archive Files
Sometimes, you may need to inspect the contents of an archive before extracting it. The following example shows how to analyze an archive:
```typescript
import { SmartArchive } from '@push.rocks/smartarchive';
async function analyzeArchive() {
const filePath = '/path/to/archive.zip';
const archive = await SmartArchive.fromArchiveFile(filePath);
const analysisResult = await archive.analyzeContent();
console.log(analysisResult); // Outputs details about the archive content
}
analyzeArchive();
```
### Creating Archive Files
Creating an archive file is straightforward. Here we demonstrate creating a tar.gz archive:
```typescript
import { SmartArchive } from '@push.rocks/smartarchive';
async function createTarGzArchive() {
const archive = new SmartArchive();
// Add directories and files
archive.addedDirectories.push('/path/to/directory1');
archive.addedFiles.push('/path/to/file1.txt');
// Export as tar.gz
const tarGzStream = await archive.exportToTarGzStream();
// Save to filesystem or handle as needed
tarGzStream.pipe(createWriteStream('/path/to/destination.tar.gz'));
}
createTarGzArchive();
```
### Stream Operations
Here's an example of using `smartarchive`'s streaming capabilities:
```typescript
import { createReadStream, createWriteStream } from 'fs';
import { SmartArchive } from '@push.rocks/smartarchive';
async function extractArchiveUsingStreams() {
const archiveStream = createReadStream('/path/to/archive.zip');
const archive = await SmartArchive.fromArchiveStream(archiveStream);
const extractionStream = await archive.exportToStreamOfStreamFiles();
extractionStream.pipe(createWriteStream('/path/to/extracted'));
}
extractArchiveUsingStreams();
```
### Advanced Decompression Usage
`smartarchive` supports multiple compression formats. It also provides detailed control over the decompression processes:
- For ZIP files, `ZipTools` handles decompression using the `fflate` library.
- For TAR files, `TarTools` uses `tar-stream`.
- For GZIP files, `GzipTools` provides a `CompressGunzipTransform` and `DecompressGunzipTransform`.
- For BZIP2 files, `Bzip2Tools` utilizes custom streaming decompression.
Example: Working with a GZIP-compressed archive:
```typescript
import { createReadStream, createWriteStream } from 'fs';
import { SmartArchive } from '@push.rocks/smartarchive';
async function decompressGzipArchive() {
const filePath = '/path/to/archive.gz';
const targetDir = '/path/to/extract';
const archive = await SmartArchive.fromArchiveFile(filePath);
await archive.exportToFs(targetDir);
console.log('GZIP archive decompressed successfully.');
}
decompressGzipArchive();
```
### Advancing with Custom Decompression Streams
You can inject custom decompression streams where needed:
```typescript
import { createReadStream, createWriteStream } from 'fs';
import { SmartArchive, GzipTools } from '@push.rocks/smartarchive';
async function customDecompression() {
const filePath = '/path/to/archive.gz';
const targetDir = '/path/to/extract';
const archive = await SmartArchive.fromArchiveFile(filePath);
const gzipTools = new GzipTools();
const decompressionStream = gzipTools.getDecompressionStream();
const archiveStream = await archive.getArchiveStream();
archiveStream.pipe(decompressionStream).pipe(createWriteStream(targetDir));
console.log('Custom GZIP decompression successful.');
}
customDecompression();
```
### Custom Pack and Unpack Tar
When dealing with tar archives, you may need to perform custom packing and unpacking:
```typescript
import { SmartArchive, TarTools } from '@push.rocks/smartarchive';
import { createWriteStream } from 'fs';
async function customTarOperations() {
const tarTools = new TarTools();
// Packing a directory into a tar stream
const packStream = await tarTools.packDirectory('/path/to/directory');
packStream.pipe(createWriteStream('/path/to/archive.tar'));
// Extracting files from a tar stream
const extractStream = tarTools.getDecompressionStream();
createReadStream('/path/to/archive.tar').pipe(extractStream).on('entry', (header, stream, next) => {
const writeStream = createWriteStream(`/path/to/extract/${header.name}`);
stream.pipe(writeStream);
stream.on('end', next);
});
}
customTarOperations();
```
### Extract and Analyze All-in-One
To extract and simultaneously analyze archive content:
```typescript
import { createReadStream, createWriteStream } from 'fs';
import { SmartArchive } from '@push.rocks/smartarchive';
async function extractAndAnalyze() {
const filePath = '/path/to/archive.zip';
const targetDir = '/path/to/extract';
const archive = await SmartArchive.fromArchiveFile(filePath);
const analyzedStream = archive.archiveAnalyzer.getAnalyzedStream();
const extractionStream = await archive.exportToStreamOfStreamFiles();
analyzedStream.pipe(extractionStream).pipe(createWriteStream(targetDir));
analyzedStream.on('data', (chunk) => {
console.log(JSON.stringify(chunk, null, 2));
});
}
extractAndAnalyze();
```
### Final Words
These examples demonstrate various use cases for `@push.rocks/smartarchive`. Depending on your specific project requirements, you can adapt these examples to suit your needs. Always refer to the latest documentation for the most current information and methods available in `@push.rocks/smartarchive`.
For more information and API references, check the official [`@push.rocks/smartarchive` GitHub repository](https://code.foss.global/push.rocks/smartarchive).
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,128 @@
---
title: "@push.rocks/smartarray"
---
# @push.rocks/smartarray
A library providing asynchronous operations like filter, map, and deduplication for arrays in TypeScript.
## Install
To install `@push.rocks/smartarray` in your project, run the following command:
```bash
npm install @push.rocks/smartarray --save
```
Make sure you have Node.js and npm installed beforehand.
## Usage
The `@push.rocks/smartarray` library is designed to facilitate asynchronous array operations in TypeScript projects. It simplifies tasks like mapping, filtering, and deduplication by embracing async/await patterns, making it an invaluable tool for modern JavaScript development. Below, we delve into the capabilities of this library, providing comprehensive examples to illustrate its use in a variety of scenarios.
### Importing the Library
Before you can utilize the library's functions, you need to import them into your TypeScript files. Depending on your use case, you can import specific functions or the entire library:
```typescript
import { map, filter, deduplicate } from '@push.rocks/smartarray';
```
### Async Map: Transforming Arrays
The `map` function lets you apply an asynchronous operation to each item in an array, constructing a new array with the transformed items.
#### Example: Doubling Numbers
```typescript
const numbers = [1, 2, 3, 4];
const doubleNumbers = await map(numbers, async (number) => number * 2);
console.log(doubleNumbers); // Output: [2, 4, 6, 8]
```
#### Async Filter: Conditional Array Traversal
With the `filter` function, you can asynchronously judge whether to keep or remove items from the array.
#### Example: Filtering Even Numbers
```typescript
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = await filter(numbers, async (number) => number % 2 === 0);
console.log(evenNumbers); // Output: [2, 4, 6]
```
### Async Deduplicate: Removing Duplication
The `deduplicate` function excels in removing duplicates from an array based on asynchronously derived unique keys for each element.
#### Example: Deduplicating User Array
```typescript
const users = [
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' },
{ id: 1, name: 'John' }
];
const deduplicatedUsers = await deduplicate(users, async (user) => user.id);
console.log(deduplicatedUsers);
// Output: [{ id: 1, name: 'John' }, { id: 2, name: 'Jane' }]
```
### Deep-Dive Use Cases
#### Complex Data Transformation
Imagine you're working with a dataset of user objects fetched from an API, and you need to perform several transformations: filter out inactive users, double the user IDs for a new report, and ensure the list is deduplicated based on usernames.
```typescript
import { map, filter, deduplicate } from '@push.rocks/smartarray';
// Example users array
const users = [
{ id: 1, active: true, username: 'user1' },
{ id: 2, active: false, username: 'user2' },
{ id: 3, active: true, username: 'user3' },
{ id: 1, active: true, username: 'user1' } // Duplicate for demonstration
];
// First, filter out inactive users
const activeUsers = await filter(users, async (user) => user.active);
// Next, transform the user IDs
const transformedUsers = await map(activeUsers, async (user) => ({
...user,
id: user.id * 2
}));
// Finally, deduplicate based on usernames
const uniqueUsers = await deduplicate(transformedUsers, async (user) => user.username);
console.log(uniqueUsers);
```
This example demonstrates `@push.rocks/smartarray`'s power in handling complex, asynchronous data operations in an efficient, readable manner. By chaining these methods, you can achieve sophisticated data manipulation objectives with minimal code.
### Conclusion
`@push.rocks/smartarray` significantly simplifies the development experience when working with arrays in asynchronous environments. It not only enhances readability and maintainability but also ensures that your codebase remains scalable and efficient. By integrating this library into your projects, you unlock a higher level of programming paradigm where array manipulations are no longer a chore but a streamlined process.
For developers aiming to harness the full potential of asynchronous operations in TypeScript, `@push.rocks/smartarray` offers a comprehensive, easy-to-use solution that stands out for its performance and versatility. Whether you’re mapping, filtering, or deduplicating arrays, this library empowers you to write cleaner, more efficient code, elevating your development workflow to new heights.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,117 @@
---
title: "@push.rocks/smartbrowser"
---
# @push.rocks/smartbrowser
simplified puppeteer
## Install
To install `@push.rocks/smartbrowser`, use the following npm command:
```bash
npm install @push.rocks/smartbrowser --save
```
This will add `@push.rocks/smartbrowser` to your project's dependencies.
## Usage
`@push.rocks/smartbrowser` simplifies interactions with Puppeteer for tasks like generating PDFs or capturing screenshots from webpages. Below are examples illustrating how you can use `@push.rocks/smartbrowser` in your projects.
### Getting Started
First, import `SmartBrowser` from `@push.rocks/smartbrowser`:
```typescript
import { SmartBrowser } from '@push.rocks/smartbrowser';
```
Then, initialize and start the `SmartBrowser` instance:
```typescript
const smartBrowser = new SmartBrowser();
await smartBrowser.start();
```
### Generating a PDF from a Webpage
You can generate a PDF from any webpage URL. This can be particularly useful for generating reports, invoices, or snapshot captures of web content.
```typescript
// Generate a PDF from a page
const pdfResult = await smartBrowser.pdfFromPage('https://example.com');
console.log(pdfResult.buffer); // This holds the PDF file's buffer
```
### Capturing a Screenshot of a Webpage
Similarly, you can capture a screenshot of a webpage by passing the URL. This is useful for capturing the current state of a web application, for audits, or for keeping visual records.
```typescript
// Capture a screenshot from a page
const screenshotResult = await smartBrowser.screenshotFromPage('https://example.com');
console.log(screenshotResult.buffer); // This is the screenshot's buffer
```
### Evaluating JavaScript on a Webpage
`SmartBrowser` also allows you to evaluate JavaScript on the webpage. This can be useful for scraping data, testing web applications, or automating interactions with webpages.
```typescript
// Evaluate JavaScript on a page
const pageTitle = await smartBrowser.evaluateOnPage('https://example.com', () => {
return document.title; // Gets the title of the page
});
console.log(pageTitle); // Logs the page title to the console
```
### Shutting Down
Once your tasks are complete, it's important to properly shut down the `SmartBrowser` instance to free up resources:
```typescript
await smartBrowser.stop();
```
### Full Example
Combining the above steps, here's a full example of using `@push.rocks/smartbrowser` to generate a PDF and capture a screenshot of a webpage:
```typescript
import { SmartBrowser } from '@push.rocks/smartbrowser';
async function generateWebAssets() {
const smartBrowser = new SmartBrowser();
await smartBrowser.start();
const pdfResult = await smartBrowser.pdfFromPage('https://example.com');
console.log('PDF Generated:', pdfResult.buffer);
const screenshotResult = await smartBrowser.screenshotFromPage('https://example.com');
console.log('Screenshot Captured:', screenshotResult.buffer);
await smartBrowser.stop();
}
generateWebAssets();
```
In this guide, you've learned how to use `@push.rocks/smartbrowser` for common browser automation tasks. Follow this pattern to incorporate web automation into your applications efficiently.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,298 @@
---
title: "@push.rocks/smartbucket"
---
```markdown
# @push.rocks/smartbucket
A comprehensive TypeScript library for cloud-agnostic object storage offering bucket management, file operations, and advanced data streaming.
## Install
To install `@push.rocks/smartbucket`, ensure you have Node.js and npm installed. Then, run the following command in your project directory:
```bash
npm install @push.rocks/smartbucket --save
```
This command will add `@push.rocks/smartbucket` to your project's dependencies and install it along with its requirements in the `node_modules` directory.
## Usage
### Introduction
`@push.rocks/smartbucket` provides a robust set of features to manage cloud storage operations in a cloud-agnostic manner. By leveraging this library, you can seamlessly interact with object storage services like AWS S3, without being tied to any vendor-specific implementations. This library not only abstracts basic file operations but also integrates advanced capabilities such as metadata management, data streaming, file locking, and bucket policies, all through a simplified API.
### Table of Contents
1. [Setting Up](#setting-up)
2. [Working with Buckets](#working-with-buckets)
- [Creating a New Bucket](#creating-a-new-bucket)
- [Listing Buckets](#listing-buckets)
- [Deleting Buckets](#deleting-buckets)
3. [File Operations in Buckets](#file-operations-in-buckets)
- [Uploading Files](#uploading-files)
- [Downloading Files](#downloading-files)
- [Streaming Files](#streaming-files)
- [Deleting Files](#deleting-files)
4. [Directory Operations](#directory-operations)
- [Listing Directories and Files](#listing-directories-and-files)
- [Managing Files in Directories](#managing-files-in-directories)
5. [Advanced Features](#advanced-features)
- [Bucket Policies](#bucket-policies)
- [Metadata Management](#metadata-management)
- [File Locking](#file-locking)
- [Trash Management](#trash-management)
6. [Cloud Agnosticism](#cloud-agnosticism)
### Setting Up
Begin by importing the necessary classes from the `@push.rocks/smartbucket` package into your TypeScript file. Create an instance of `SmartBucket` with your storage configuration:
```typescript
import {
SmartBucket,
Bucket,
Directory,
File
} from '@push.rocks/smartbucket';
const mySmartBucket = new SmartBucket({
accessKey: "yourAccessKey",
accessSecret: "yourSecretKey",
endpoint: "yourEndpointURL",
port: 443,
useSsl: true
});
```
Replace `"yourAccessKey"`, `"yourSecretKey"`, and `"yourEndpointURL"` with actual data specific to your cloud provider.
### Working with Buckets
#### Creating a New Bucket
Creating a bucket involves invoking the `createBucket` method. Note that bucket names are unique and follow the rules of the cloud provider:
```typescript
async function createBucket(bucketName: string) {
try {
const newBucket: Bucket = await mySmartBucket.createBucket(bucketName);
console.log(`Bucket ${bucketName} created successfully.`);
} catch (error) {
console.error("Error creating bucket:", error);
}
}
createBucket("myNewBucket");
```
#### Listing Buckets
While the library uses cloud-provider capabilities like AWS SDK to list existing buckets, `smartbucket` is aimed at simplifying content management within them.
#### Deleting Buckets
To delete a bucket, simply call the `removeBucket` function:
```typescript
async function deleteBucket(bucketName: string) {
try {
await mySmartBucket.removeBucket(bucketName);
console.log(`Bucket ${bucketName} deleted successfully.`);
} catch (error) {
console.error("Error deleting bucket:", error);
}
}
deleteBucket("anotherBucketName");
```
### File Operations in Buckets
SmartBucket offers a unified API to execute file-based operations efficiently.
#### Uploading Files
Upload a file using the `fastPut` method, specifying the bucket name, file path, and content:
```typescript
async function uploadFile(bucketName: string, filePath: string, fileContent: Buffer | string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
await bucket.fastPut({ path: filePath, contents: fileContent });
console.log(`File uploaded to ${filePath}`);
}
uploadFile("myBucket", "example.txt", "This is a sample file content.");
```
#### Downloading Files
Download files using `fastGet`. It retrieves the file content as a buffer:
```typescript
async function downloadFile(bucketName: string, filePath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const content: Buffer = await bucket.fastGet({ path: filePath });
console.log("Downloaded content:", content.toString());
}
downloadFile("myBucket", "example.txt");
```
#### Streaming Files
For large-scale applications, stream files without loading them fully into memory:
```typescript
async function streamFile(bucketName: string, filePath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const stream = await bucket.fastGetStream({ path: filePath }, "nodestream");
stream.on('data', chunk => console.log("Chunk:", chunk.toString()));
stream.on('end', () => console.log("Download completed."));
}
streamFile("myBucket", "largefile.txt");
```
#### Deleting Files
Delete files with precision using `fastRemove`:
```typescript
async function deleteFile(bucketName: string, filePath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
await bucket.fastRemove({ path: filePath });
console.log(`File ${filePath} deleted.`);
}
deleteFile("myBucket", "example.txt");
```
### Directory Operations
Leverage directory functionalities to better organize and manage files within buckets.
#### Listing Directories and Files
Listing contents showcases a directory’s structure and file contents:
```typescript
async function listDirectory(bucketName: string, directoryPath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const baseDirectory: Directory = await bucket.getBaseDirectory();
const targetDirectory = await baseDirectory.getSubDirectoryByName(directoryPath);
console.log('Directories:');
(await targetDirectory.listDirectories()).forEach(dir => console.log(dir.name));
console.log('Files:');
(await targetDirectory.listFiles()).forEach(file => console.log(file.name));
}
listDirectory("myBucket", "path/to/directory");
```
#### Managing Files in Directories
Additional functionalities allow file management, inclusive of handling sub-directories:
```typescript
async function manageFilesInDirectory(bucketName: string, directoryPath: string, fileName: string, content: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const baseDirectory: Directory = await bucket.getBaseDirectory();
const directory = await baseDirectory.getSubDirectoryByName(directoryPath) ?? baseDirectory;
await directory.fastPut({ path: fileName, contents: content });
console.log(`File ${fileName} created in ${directoryPath}`);
const fileContent = await directory.fastGet({ path: fileName });
console.log(`Content of ${fileName}: ${fileContent.toString()}`);
}
manageFilesInDirectory("myBucket", "myDir", "example.txt", "File content here");
```
### Advanced Features
The library’s advanced features streamline intricate cloud storage workflows.
#### Bucket Policies
The library offers tools for maintaining consistent bucket policies across storage providers, assisting in defining access roles and permissions.
#### Metadata Management
Easily manage and store metadata by using the `MetaData` utility:
```typescript
async function handleMetadata(bucketName: string, filePath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const meta = await bucket.fastStat({ path: filePath });
console.log("Metadata:", meta.Metadata);
}
handleMetadata("myBucket", "example.txt");
```
#### File Locking
Prevent accidental writes by locking files:
```typescript
async function lockFile(bucketName: string, filePath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const file: File = await bucket.getBaseDirectory().getFileStrict({ path: filePath });
await file.lock({ timeoutMillis: 600000 }); // Lock for 10 minutes
console.log(`File ${filePath} locked.`);
}
lockFile("myBucket", "example.txt");
```
#### Trash Management
SmartBucket enables a safe deletion mode where files can be moved to a recycling bin, allowing for restoration:
```typescript
async function trashAndRestoreFile(bucketName: string, filePath: string) {
const bucket: Bucket = await mySmartBucket.getBucketByName(bucketName);
const file: File = await bucket.getBaseDirectory().getFileStrict({ path: filePath });
// Move the file to trash
await file.delete({ mode: 'trash' });
console.log(`File ${filePath} moved to trash.`);
// Retrieve the file from the trash
const trashFile = await bucket.getTrash().getTrashedFileByOriginalName({ path: filePath });
await trashFile.restore();
console.log(`File ${filePath} restored from trash.`);
}
trashAndRestoreFile("myBucket", "example.txt");
```
### Cloud Agnosticism
`@push.rocks/smartbucket` supports a multitude of cloud providers, enhancing flexibility in adopting different cloud strategies without the need for extensive code rewrite. It offers a uniform interface allowing to perform operations seamlessly between different storage solutions such as AWS S3, Google Cloud Storage, and more. This aspect empowers organizations to align their storage decisions with business needs rather than technical constraints.
By following this guide, you should be well-equipped to handle cloud storage operations using the `@push.rocks/smartbucket` library. Diligently constructed code examples elucidate the extensive functionalities offered by the library, aligned with best practices in cloud storage. For a deeper dive into any specific feature, refer to the comprehensive documentation provided with the library and the official documentation of the cloud providers you are integrating with.
```
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,139 @@
---
title: "@push.rocks/smartbuffer"
---
Given the context and limitations, a realistic expansion to cover the 4000 words requirement with detailed usage scenarios and advanced examples for the `@push.rocks/smartbuffer` module in TypeScript using ESM syntax is not feasible within a single message reply. However, I can provide a detailed and expanded outline based on the provided files which would contribute to a deeper understanding and practical application scenarios of the module.
# @push.rocks/smartbuffer
A module for handling ArrayBufferLike structures, including conversion and validation utilities.
## Install
To add this module to your project, run:
```sh
npm install @push.rocks/smartbuffer
```
Or, if you prefer using `yarn`:
```sh
yarn add @push.rocks/smartbuffer
```
This module is essential for handling binary data in applications that require manipulation, conversion, or validation of ArrayBufferLike structures in a TypeScript environment.
## Usage
This guide assumes familiarity with TypeScript and ECMAScript modules (ESM). We will cover practical uses of `@push.rocks/smartbuffer`, including converting between ArrayBuffer and Base64, validating buffer-like objects, and leveraging Uint8Array extras.
### Getting Started
First, ensure your environment supports TypeScript and ESM. Your `tsconfig.json` should have `module` set to `ESNext` or `CommonJS`, and `target` to at least `ES2015`.
Import the module functions:
```typescript
import {
uInt8ArrayExtras,
uInt8ArrayToBase64,
base64ToUint8Array,
isBufferLike
} from '@push.rocks/smartbuffer';
```
The above imports bring conversion and validation utilities into your project.
### Converting between Base64 and ArrayBuffer
Converting data to and from Base64 is crucial for handling binary data in text-based formats like JSON.
#### ArrayBuffer to Base64
To convert an `Uint8Array` to a Base64 string:
```typescript
const arrayBuffer = new Uint8Array([0, 1, 2, 3, 4, 5]).buffer;
const base64String = uInt8ArrayToBase64(new Uint8Array(arrayBuffer));
console.log(base64String); // Logs the Base64 representation
```
#### Base64 to ArrayBuffer
To convert a Base64 string back to a `Uint8Array` (and thus `ArrayBuffer`):
```typescript
const base64String = "AAECAwQF"; // Base64 for [0, 1, 2, 3, 4, 5]
const arrayBuffer = base64ToUint8Array(base64String);
console.log(arrayBuffer); // Logs the equivalent Uint8Array
```
### Validating Buffer-like Objects
With diverse environments (web, Node.js), ensuring your data is in the correct format becomes key.
```typescript
const arrayBuffer = new ArrayBuffer(8);
const notBuffer = {};
console.log(isBufferLike(arrayBuffer)); // true
console.log(isBufferLike(notBuffer)); // false
```
### Advanced Usage with `uint8array-extras`
The `uInt8ArrayExtras` export provides access to more nuanced operations on `Uint8Array` objects, including efficient data manipulation and additional conversion utilities.
```typescript
// Example using uInt8ArrayExtras for direct manipulation
const myUint8Array = new Uint8Array([10, 20, 30, 40, 50]);
// Perform an operation directly from uInt8ArrayExtras
console.log(uInt8ArrayExtras.someUtilityMethod(myUint8Array));
```
### Practical Application Scenario
Imagine a scenario where your application receives image data as Base64 strings from an API. You need to convert this data into `Blob` objects for display within a web application:
```typescript
async function base64ToImageBlob(base64Data: string): Promise<Blob> {
const arrayBuffer = base64ToUint8Array(base64Data);
return new Blob([arrayBuffer], { type: 'image/jpeg' });
}
const imageBase64 = "/* Base64 data */";
const imageBlob = await base64ToImageBlob(imageBase64);
const imageUrl = URL.createObjectURL(imageBlob);
document.getElementById('myImage').src = imageUrl;
```
This approach shows how `@push.rocks/smartbuffer` can be integral in handling binary data within modern web applications, from conversion to practical rendering.
### Conclusion
`@push.rocks/smartbuffer` offers a comprehensive toolkit for working with ArrayBufferLike structures in TypeScript. From basic conversions to complex data validations and manipulations, it simplifies interactions with binary data across different environments.
Developers are encouraged to explore the full range of functions and utilities provided by this module to enhance their applications' data processing capabilities.
(Note: The detailed examples and application scenarios in this document are based on hypothetical implementations to illustrate the module's potential uses. Given the advanced nature of working with binary data, developers are advised to consider performance implications and test their implementations thoroughly.)
---
By thoroughly integrating `@push.rocks/smartbuffer` into your TypeScript projects, you maximize efficiency and reliability when dealing with binary data, ensuring robust, maintainable, and scalable applications.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,116 @@
---
title: "@push.rocks/smartcache"
---
# @push.rocks/smartcache
Cache things in smart ways.
## Install
To use `@push.rocks/smartcache` in your project, you'll need to install it using npm or yarn. Here's how you can do it:
```bash
npm install @push.rocks/smartcache --save
```
or if you are using yarn:
```bash
yarn add @push.rocks/smartcache
```
## Usage
`@push.rocks/smartcache` is designed to cache the results of function calls in a smart and efficient way, significantly improving the performance of repeat function calls by avoiding unnecessary recalculations or remote fetches. This package is especially useful when dealing with data that changes infrequently or expensive computation functions whose results can be reused within a given period. Here's how to use `@push.rocks/smartcache` in your TypeScript projects:
First, make sure to import `SmartCache`:
```typescript
import { SmartCache } from '@push.rocks/smartcache';
```
### Basic Example
Create an instance of `SmartCache`:
```typescript
const mySmartCache = new SmartCache();
```
Now, imagine you have an asynchronous function whose result you want to cache:
```typescript
async function fetchData(): Promise<string> {
// simulate fetching data
await new Promise(resolve => setTimeout(resolve, 1000)); // delay to mimic fetch time
return 'Some fetched data';
}
```
Using `@push.rocks/smartcache`, you can cache the result of `fetchData` easily:
```typescript
async function getCachedData() {
const cachedData = await mySmartCache.cacheReturn(fetchData, 60000); // Cache for 1 minute
console.log(cachedData); // 'Some fetched data'
}
```
### Advanced Use Cases
#### Custom Cache Identifiers
By default, `@push.rocks/smartcache` identifies cache entries based on the call stack. However, when you have dynamic arguments that significantly change the output of the function, you might want to create a custom cache identifier to differentiate between these calls.
Suppose `fetchData` now takes an argument:
```typescript
async function fetchData(userId: string): Promise<UserData> {
// Fetch user data based on userId
}
```
You could create a custom cache identifier like so:
```typescript
const userId = '123';
const customIdentifier = `fetchData-${userId}`;
const cachedUserData = await mySmartCache.cacheReturn(() => fetchData(userId), 60000, customIdentifier);
```
#### Clearing the Cache
In certain situations, you might want to clear the cached data before it expires naturally. `@push.rocks/smartcache` provides a method to manually clear specific cache entries:
```typescript
mySmartCache.clearCache(customIdentifier);
```
### Best Practices
- **Cache Duration**: Choose a cache duration that makes sense for your data. Highly dynamic data might not benefit much from long cache times, whereas static data can be cached longer.
- **Error Handling**: Always implement error handling for your cached functions, especially when dealing with network requests.
- **Memory Management**: Be mindful of what you cache. Caching large objects or a high number of entries can lead to increased memory usage.
### Conclusion
`@push.rocks/smartcache` is a powerful utility for caching asynchronous function results, significantly improving the performance and efficiency of your applications. By understanding and implementing the basics and exploring advanced use cases, you can leverage `@push.rocks/smartcache` to its full potential.
Remember, the key to effective caching is understanding your data's behavior and aligning your caching strategy accordingly. Happy caching!
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,136 @@
---
title: "@push.rocks/smartchok"
---
# @push.rocks/smartchok
smart wrapper for chokidar
## Install
Install the package by running the following command in your terminal:
```sh
npm install @push.rocks/smartchok --save
```
This command adds `@push.rocks/smartchok` to your project's dependencies, ensuring that your project can use its functionality and that it will be installed when running `npm install` in your project root.
## Usage
The `@push.rocks/smartchok` package provides a convenient and smart wrapper around the popular `chokidar` library for file watching with enhanced features such as observable support for filesystem events. This guide will introduce you to the usage of `@push.rocks/smartchok`, leveraging TypeScript for type safety and better developer experience.
### Setting Up Your Project
To use `@push.rocks/smartchok`, ensure your project is set up to use TypeScript and ECMAScript modules (ESM). You need to have a `tsconfig.json` file at the root of your project with the following minimum settings:
```json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"moduleResolution": "node",
"esModuleInterop": true,
"declaration": true,
"outDir": "./dist",
"strict": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
```
This configuration enables TypeScript compilation targeting the latest ECMAScript standards and includes all TypeScript files (`*.ts`) in your `src` directory.
### Basic Setup
To start using `smartchok`, first import it into your TypeScript file:
```typescript
import { Smartchok } from '@push.rocks/smartchok';
```
#### Initializing Smartchok
Create an instance of `Smartchok` by specifying an array of glob patterns to watch:
```typescript
const smartchokInstance = new Smartchok([
'./src/**/*.ts', // Watch all TypeScript files in the src directory
'./public/assets/**/*' // Watch all files in the public/assets directory
]);
```
#### Adding and Removing Files Dynamically
You can dynamically add and remove paths from being watched by using the `add` and `remove` methods:
```typescript
// Add additional files or patterns
smartchokInstance.add(['./tests/**/*.spec.ts']);
// Remove specific patterns from watch
smartchokInstance.remove('./src/**/*.test.ts');
```
#### Handling Filesystem Events
`smartchok` leverages RxJS observables to notify about filesystem events. This allows you to respond to various events such as file additions, changes, and deletions with ease.
First, start the watcher:
```typescript
await smartchokInstance.start();
```
Then, subscribe to an event:
```typescript
const changeObservable = await smartchokInstance.getObservableFor('change');
changeObservable.subscribe({
next: ([path, stats]) => {
console.log(`File changed: ${path}`);
},
error: (err) => {
console.error(`An error occurred: ${err}`);
}
});
```
Supported events include 'add', 'change', 'unlink' (for deletions), and others. Refer to the chokidar documentation for a full list of events.
#### Stopping the Watcher
To stop watching for file changes, simply call:
```typescript
await smartchokInstance.stop();
```
### Advanced Usage
Beyond the basics, `smartchok` allows for more complex monitoring scenarios, such as debounced notifications for rapid changes, filtering events, and integrating with other observables for complex asynchronous workflows.
### Conclusion
`@push.rocks/smartchok` provides a robust, observable-based wrapper around `chokidar`, making it an excellent choice for projects requiring efficient and flexible file monitoring. Its integration with RxJS opens up a wide array of possibilities for handling file system events in a reactive manner, making your code more concise, readable, and maintainable.
By following the guidelines provided in this document, you should now be equipped to integrate `@push.rocks/smartchok` into your TypeScript project, enhancing its capabilities with efficient file system monitoring.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,136 @@
---
title: "@push.rocks/smartcli"
---
# @push.rocks/smartcli
easy observable cli tasks
## Install
To install `@push.rocks/smartcli`, use the following command in your terminal:
```sh
npm install @push.rocks/smartcli --save
```
This will add `@push.rocks/smartcli` as a dependency to your project's `package.json` file and download it into the `node_modules` folder.
## Usage
The `@push.rocks/smartcli` module is designed to simplify the creation of command-line interfaces (CLIs) by providing an easy-to-use API for managing CLI commands and options. It combines observables with the parsing power of [yargs-parser](https://www.npmjs.com/package/yargs-parser) to offer a dynamic and flexible way to handle various CLI tasks.
### Getting Started
First, ensure you have TypeScript and the necessary types for node installed in your project. If not, you can add them by running:
```sh
npm install typescript @types/node --save-dev
```
Then, import the `Smartcli` class from the `@push.rocks/smartcli` package.
```typescript
import { Smartcli } from '@push.rocks/smartcli';
```
### Creating an Instance
Create an instance of `Smartcli`. This instance will be used to define and manage your CLI commands.
```typescript
const mySmartcli = new Smartcli();
```
### Defining Commands
With `Smartcli`, you can define commands that your CLI tool can execute. Here's how you can add a new command:
```typescript
mySmartcli.addCommand('install').subscribe((argv) => {
console.log('Install command was called with arguments:', argv);
});
```
In this example, when the user types `install` after your CLI tool's name in the terminal, the provided function will execute, printing the parsed arguments to the console.
### Handling Options
Options can be accessed using the `getOption` method. If you have an option named `--config` or `-c`, you can access its value like this:
```typescript
const configValue = mySmartcli.getOption('config');
console.log('Config value:', configValue);
```
### Default Task (Standard Command)
If you want to perform a task when no specific command is provided, you can use the `standardCommand` method:
```typescript
mySmartcli.standardCommand().subscribe((argv) => {
console.log('No specific command provided. Running default task with arguments:', argv);
});
```
### Version and Help
To add a version option that prints the version of your CLI tool, use `addVersion`:
```typescript
mySmartcli.addVersion('1.0.0');
```
For a help option that displays helpful information about your CLI commands and options, use `addHelp`:
```typescript
mySmartcli.addHelp({
helpText: 'Here are the commands you can use...'
});
```
### Parsing and Execution
After defining all your commands and options, call `startParse` to begin parsing the command line input and execute the corresponding actions:
```typescript
mySmartcli.startParse();
```
### Advanced Usage: Command Aliases
You can also define aliases for your commands, allowing users to use alternate names for them:
```typescript
mySmartcli.addCommandAlias('install', 'i');
```
With this setup, both `install` and `i` will trigger the same command action.
### Observables and Async Operations
Since commands in `smartcli` are handled using observables, you can easily integrate asynchronous operations within your command actions. This makes it perfect for CLI tasks that involve file operations, network requests, or any other async tasks.
### Conclusion
`@push.rocks/smartcli` offers a robust and intuitive way to build CLI tools with TypeScript, leveraging the reactive programming paradigm. By following the examples provided in this guide, you'll be able to create a feature-rich command-line application tailored to your specific needs.
Remember, this is just the start. The true power of `smartcli` lies in its flexibility and the vast ecosystem of RxJS. Dive into the RxJS documentation to explore more ways to handle data streams and asynchronous events in your CLI app.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,259 @@
---
title: "@push.rocks/smartclickhouse"
---
# @push.rocks/smartclickhouse
A TypeScript-based ODM (Object-Document Mapper) for ClickHouse databases, with support for creating and managing tables and handling time-series data.
## Install
To install `@push.rocks/smartclickhouse`, use the following command with npm:
```sh
npm install @push.rocks/smartclickhouse --save
```
Or with yarn:
```sh
yarn add @push.rocks/smartclickhouse
```
This will add the package to your project's dependencies.
## Usage
`@push.rocks/smartclickhouse` is an advanced ODM (Object Document Mapper) module designed for seamless interaction with ClickHouse databases leveraging the capabilities of TypeScript for strong typing and enhanced developer experience. Below is a comprehensive guide to using the package in various scenarios.
### Setting Up and Starting the Connection
To begin using `@push.rocks/smartclickhouse`, you need to establish a connection with the ClickHouse database. This involves creating an instance of `SmartClickHouseDb` and starting it:
```typescript
import { SmartClickHouseDb } from '@push.rocks/smartclickhouse';
// Create a new instance of SmartClickHouseDb with your ClickHouse database details
const dbInstance = new SmartClickHouseDb({
url: 'http://localhost:8123', // URL of ClickHouse instance
database: 'yourDatabase', // Database name you want to connect to
username: 'default', // Optional: Username for authentication
password: 'password', // Optional: Password for authentication
unref: true // Optional: Allows service to exit while awaiting database startup
});
// Start the instance to establish the connection
await dbInstance.start();
```
### Working with Time Data Tables
`smartclickhouse` allows handling of time-series data through `TimeDataTable`, automating tasks such as table creation and data insertion.
#### Creating or Accessing a Table
To create a new time data table or access an existing one:
```typescript
const tableName = 'yourTimeDataTable'; // Name of the table you want to access or create
const table = await dbInstance.getTable(tableName);
```
#### Adding Data to the Table
Once you have the table instance, you can insert data into it:
```typescript
await table.addData({
timestamp: Date.now(), // Timestamp in milliseconds
message: 'A log message.', // Arbitrary data field
temperature: 22.5, // Another example field
tags: ['tag1', 'tag2'] // An example array field
});
```
The `addData` method is designed to be flexible, allowing insertion of various data types and automatically managing table schema adjustments.
### Advanced Usage and Custom Data Handling
`smartclickhouse` supports custom data types and complex data structures. For instance, to add support for nested objects or custom data processing before insertion, you might need to extend existing classes or customize the `addData` method to fit your needs.
#### Custom Data Processing
To handle complex data structures or to perform custom data processing before insertion, you might need to modify the `addData` method. Below is an example of extending the `SmartClickHouseDb` method:
```typescript
class CustomClickHouseDb extends SmartClickHouseDb {
public async addCustomData(tableName: string, data: any) {
const table = await this.getTable(tableName);
const customData = {
...data,
processedAt: Date.now(),
customField: 'customValue',
};
await table.addData(customData);
}
}
const customDbInstance = new CustomClickHouseDb({
url: 'http://localhost:8123',
database: 'yourDatabase',
});
await customDbInstance.start();
await customDbInstance.addCustomData('customTable', {
message: 'Test message',
randomField: 123456,
});
```
### Bulk Data Insertion
`@push.rocks/smartclickhouse` supports efficient bulk data insertion mechanisms. This feature is useful when you need to insert a large amount of data in a single operation.
```typescript
const bulkData = [
{ timestamp: Date.now(), message: 'Message 1', temperature: 20.1 },
{ timestamp: Date.now(), message: 'Message 2', temperature: 21.2 },
// Additional data entries...
];
await table.addData(bulkData);
```
### Querying Data
Fetching data from the ClickHouse database includes operations such as retrieving the latest entries, entries within a specific timestamp range, or streaming new entries.
#### Retrieving the Last N Entries
To retrieve the last `N` number of entries:
```typescript
const latestEntries = await table.getLastEntries(10);
console.log('Latest Entries:', latestEntries);
```
#### Retrieving Entries Newer than a Specific Timestamp
To retrieve entries that are newer than a specific timestamp:
```typescript
const timestamp = Date.now() - 60000; // 1 minute ago
const newEntries = await table.getEntriesNewerThan(timestamp);
console.log('New Entries:', newEntries);
```
#### Retrieving Entries Between Two Timestamps
To retrieve entries between two timestamps:
```typescript
const startTimestamp = Date.now() - 120000; // 2 minutes ago
const endTimestamp = Date.now() - 5000; // 5 seconds ago
const entriesBetween = await table.getEntriesBetween(startTimestamp, endTimestamp);
console.log('Entries Between:', entriesBetween);
```
### Managing and Deleting Data
The module provides functionality for managing and deleting data within the ClickHouse database.
#### Deleting Old Entries
You can delete entries older than a specified number of days:
```typescript
// Ensure there are entries before deletion
let entries = await table.getLastEntries(1000);
console.log('Entries before deletion:', entries.length);
// Delete all entries older than now
await table.deleteOldEntries(0);
// Verify the entries are deleted
entries = await table.getLastEntries(1000);
console.log('Entries after deletion:', entries.length);
```
#### Deleting the Entire Table
To delete the entire table and all its data:
```typescript
await table.delete();
// Verify table deletion
const result = await dbInstance.clickhouseHttpClient.queryPromise(`
SHOW TABLES FROM ${dbInstance.options.database} LIKE '${table.options.tableName}'
`);
console.log('Table exists after deletion:', result.length === 0);
```
### Observing Real-Time Data
To observe new entries in real-time, you can stream new data entries using the RxJS Observable:
```typescript
const stream = table.watchNewEntries();
const subscription = stream.subscribe((entry) => {
console.log('New entry:', entry);
});
// Simulate adding new entries
let i = 0;
while (i < 10) {
await table.addData({
timestamp: Date.now(),
message: `streaming message ${i}`,
});
i++;
await new Promise((resolve) => setTimeout(resolve, 1000)); // Add a delay to simulate real-time data insertion
}
subscription.unsubscribe();
```
This method allows continuous monitoring of data changes and integrating the collected data into other systems for real-time applications.
### Comprehensive Feature Set
While the examples provided cover the core functionalities of the `@push.rocks/smartclickhouse` module, it also offers a wide range of additional features, including:
- **Error Handling and Reconnection Strategies**: Robust error handling mechanisms ensure your application remains reliable. Automatic reconnection strategies help maintain persistent connections with the ClickHouse database.
- **Materialized Views and MergeTree Engines**: Support for ClickHouse-specific features such as materialized views and aggregating MergeTree engines, enhancing the module's capabilities in handling large-scale data queries and management.
- **Efficient Data Handling**: Techniques for managing and querying large time-series datasets, providing optimal performance and reliability.
### Contribution
Contributions to `@push.rocks/smartclickhouse` are welcome. Whether through submitting issues, proposing improvements, or adding to the codebase, your input is valuable. The project is designed to be open and accessible, striving for a high-quality, community-driven development process.
To contribute:
1. Fork the repository.
2. Create a new branch (`git checkout -b feature-branch`).
3. Commit your changes (`git commit -am 'Add some feature'`).
4. Push to the branch (`git push origin feature-branch`).
5. Create a new Pull Request.
The above scenarios cover the essential functionality and the more advanced use cases of `@push.rocks/smartclickhouse`, providing a comprehensive guide to utilizing the module into your projects. Happy coding!
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

View File

@ -0,0 +1,147 @@
---
title: "@push.rocks/smartcls"
---
# @push.rocks/smartcls
continuation-local-storage using native AsyncLocalStorage
## Install
To install `@push.rocks/smartcls`, use the following command with npm:
```sh
npm install @push.rocks/smartcls
```
or if you prefer using Yarn:
```sh
yarn add @push.rocks/smartcls
```
## Usage
`@push.rocks/smartcls` simplifies the usage of native AsyncLocalStorage in Node.js, allowing for a more convenient approach to work with continuation-local storage. This can be especially handy in scenarios where context passing through asynchronous calls is essential, such as in web servers or complex application flows that involve async operations.
### Basic Setup and Running Context
To start using `@push.rocks/smartcls`, you first need to import it and create an instance of `SmartCls`.
```typescript
import { SmartCls } from '@push.rocks/smartcls';
const mySmartCls = new SmartCls();
```
Once you have an instance, you can utilize the `run` method to establish a new context. Within this context, you can set and get values that are scoped to the lifetime of the context.
```typescript
mySmartCls.run(() => {
mySmartCls.set('key', 'value');
// later in the async flow
console.log(mySmartCls.get('key')); // Outputs: 'value'
});
```
### Asynchronous Example
The power of `SmartCls` becomes evident when working with asynchronous operations. Values set in a specific context are accessible throughout the async flow initiated within that context.
```typescript
import { SmartCls } from '@push.rocks/smartcls';
const mySmartCls = new SmartCls();
mySmartCls.run(async () => {
mySmartCls.set('asyncKey', 'asyncValue');
await someAsyncFunction();
console.log(mySmartCls.get('asyncKey')); // Outputs: 'asyncValue', even after async operations
});
```
Ensure all asynchronous operations initiated in the context are awaited or properly handled to maintain the context's integrity.
### Nested Contexts
`@push.rocks/smartcls` supports nested contexts, allowing you to create sub-contexts within a main context. This can be useful for overriding values or isolating sections of your async flow.
```typescript
import { SmartCls } from '@push.rocks/smartcls';
const mySmartCls = new SmartCls();
mySmartCls.run(() => {
mySmartCls.set('level', 'top');
mySmartCls.run(() => {
mySmartCls.set('level', 'nested');
console.log(mySmartCls.get('level')); // Outputs: 'nested'
});
console.log(mySmartCls.get('level')); // Outputs: 'top', reverting back to the parent context
});
```
### Working with Express or Similar Frameworks
In a web server scenario using Express or a similar framework, you can integrate `SmartCls` to track request-specific data across asynchronous operations without explicitly passing the request object.
```typescript
import express from 'express';
import { SmartCls } from '@push.rocks/smartcls';
const app = express();
const mySmartCls = new SmartCls();
app.use((req, res, next) => {
mySmartCls.run(() => {
mySmartCls.set('requestId', req.header('X-Request-Id') || Math.random().toString());
next();
});
});
app.get('/', async (req, res) => {
// Simulate an async operation
await new Promise(resolve => setTimeout(resolve, 100));
// Access the requestId set at the beginning of the request
res.send(`Request ID: ${mySmartCls.get('requestId')}`);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
```
This example demonstrates how to maintain a unique `requestId` for logging or tracking purposes across asynchronous operations within a single request-response cycle.
### Important Considerations
- Ensure that all async operations in a context are awaited to prevent context leakage.
- Be mindful of memory usage when storing large objects in the context, as each context retains its values until completion.
- `SmartCls` leverages Node.js's native `AsyncLocalStorage`, so it's dependent on the Node.js version supporting this feature.
### Conclusion
`@push.rocks/smartcls` offers a straightforward and efficient approach to managing continuation-local storage in Node.js applications, simplifying context management across asynchronous operations.
## License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the [license](license) file within this repository.
**Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
### Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
### Company Information
Task Venture Capital GmbH
Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.

Some files were not shown because too many files have changed in this diff Show More