Skip to content

Instantly share code, notes, and snippets.

View johannschopplich's full-sized avatar

Johann Schopplich johannschopplich

View GitHub Profile
@johannschopplich
johannschopplich / password.ts
Last active May 3, 2023 21:40
Password strength meter calculation
const SPECIAL_CHAR_RE = /[^A-Za-z0-9]/g
const LOWERCASE_RE = /[a-z]/g
const UPPERCASE_RE = /[A-Z]/g
const NUMBER_RE = /[0-9]/g
const SCORE_MAP = ['risky', 'guessable', 'weak', 'safe', 'secure'] as const
export function getPasswordStrength(input: string | number) {
const score = typeof input === 'string' ? getPasswordScore(input) : input
return SCORE_MAP[score]
@johannschopplich
johannschopplich / better-scroller.client.ts
Created June 7, 2023 17:19
Nuxt plugin for `vue-router-better-scroller` with with Suspense route resolution
import { createRouterScroller } from 'vue-router-better-scroller'
interface ScrollPositionCoordinates {
behavior?: ScrollOptions['behavior']
left?: number
top?: number
}
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.use(
@johannschopplich
johannschopplich / nginx.conf
Last active June 21, 2023 09:30
Custom nginx caching headers for Ploi.io for Kirby CMS
# assets and media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|heic|webp|svgz?|mp3|m4a|aac|ogg|wav|mp4|mov|webm|mpe?g|avi|ogv|wmv|woff2?)$ {
try_files $uri $uri/ /index.php?$query_string;
add_header Cache-Control "public, max-age=31536000, immutable";
access_log off;
}
@johannschopplich
johannschopplich / README.md
Last active June 23, 2023 15:45
OpenAI audio transcriptions from folder

Create Transcripts from Audio Files

This script uses OpenAI's Whisper ASR (Automatic Speech Recognition) system to generate transcripts from the audio files.

In addition to the Python packages mentioned above, you need to provide an OpenAI API key as an environment variable:

export OPENAI_API_KEY=your-api-key
@johannschopplich
johannschopplich / MasonryGrid.vue
Last active July 4, 2023 12:06
Vue 3 component for masonry grid polyfill
<script setup lang="ts">
const props = withDefaults(
defineProps<{
columnMaxWidth?: string;
}>(),
{
columnMaxWidth: "25rem",
}
);
@johannschopplich
johannschopplich / main.js
Created September 5, 2023 07:20
Check which tables are available for Seven SwansSEVEN SWANS restaurant in Frankfurt am Main
// Function to fetch reservation data from API
async function fetchReservationData(date, capacity = 2, agentId = 2) {
const baseUrl =
'https://9110-api.quandoo.com/merchants/56296/reservation-options'
const url = `${baseUrl}?date=${date}&capacity=${capacity}&agentId=${agentId}`
try {
const response = await fetch(url)
const data = await response.json()
@johannschopplich
johannschopplich / kql.ts
Last active September 20, 2023 07:23
Vue composable to fetch KQL queries
import { $fetch } from "ofetch";
import { hash } from "ohash";
import { toValue } from "@vueuse/core";
import { useQuery } from "vue-unquery";
import { useI18n } from "@byjohann/vue-i18n";
import type { MaybeRefOrGetter } from "@vueuse/core";
import type { TurboVueOptions } from "vue-unquery";
import type { KirbyQueryRequest, KirbyQueryResponse } from "kirby-types";
let responseCache: KirbyQueryResponse | undefined;
@johannschopplich
johannschopplich / auth.server.ts
Last active September 22, 2023 07:51
Nuxt API Party usage with auth store
import { useAuthStore } from '~/stores/auth'
export default defineNuxtPlugin(async () => {
const authStore = useAuthStore()
// Refresh the token once on the server
if (authStore.isLoggedIn && authStore.isTokenExpired()) {
await authStore.refresh()
}
})
@johannschopplich
johannschopplich / storage.ts
Created October 30, 2023 11:05
Capacitor Preferences binding for VueUse `useStorageAsync`
import { Preferences } from "@capacitor/preferences";
import type {
MaybeRefOrGetter,
RemovableRef,
StorageLikeAsync,
UseStorageAsyncOptions,
} from "@vueuse/core";
const capacitorPreferenceStorage: StorageLikeAsync = {
async getItem(key: string): Promise<string | null> {
@johannschopplich
johannschopplich / spreadsheet.ts
Last active February 12, 2024 13:19
Fetch data from Google Sheets API in TypeScript
export interface SpreadsheetValues {
majorDimension: "DIMENSION_UNSPECIFIED" | "ROWS" | "COLUMNS";
range: string;
values: string[][];
}
export async function getSpreadsheetValues(
id: string,
sheet: string
): Promise<Record<string, string>[]> {