@lucaismyname/l1-utils
v0.1.10
Published
Reusable, unopinionated utilities for the L1 Stack ecosystem.
Readme
@lucaismyname/l1-utils
Reusable, unopinionated utilities for the L1 Stack ecosystem.
- Node 18+
- ESM
Install
npm install @lucaismyname/l1-utilsCMS / Data connectors
Strapi
import { createStrapiClient } from '@lucaismyname/l1-utils'
const strapi = createStrapiClient({
baseUrl: process.env.STRAPI_URL!,
apiToken: process.env.STRAPI_TOKEN,
})
const res = await strapi.get('/api/articles')Sanity (GROQ)
import { createSanityClient } from '@lucaismyname/l1-utils'
const sanity = createSanityClient({
projectId: process.env.SANITY_PROJECT_ID!,
dataset: process.env.SANITY_DATASET!,
apiVersion: '2024-01-01',
token: process.env.SANITY_TOKEN,
useCdn: true,
})
const data = await sanity.fetch('*[_type == "post"][0..9]')Contentful
import { createContentfulClient } from '@lucaismyname/l1-utils'
const contentful = createContentfulClient({
spaceId: process.env.CONTENTFUL_SPACE_ID!,
environment: 'master',
accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!,
})
const entries = await contentful.getEntries({ content_type: 'post', limit: 10 })Notion
import { createNotionClient } from '@lucaismyname/l1-utils'
const notion = await createNotionClient({ token: process.env.NOTION_TOKEN! })
const rows = await notion.queryDatabase(process.env.NOTION_DATABASE_ID!)Generic REST
import { createRestClient } from '@lucaismyname/l1-utils'
const api = createRestClient({ baseUrl: 'https://api.example.com' })
const me = await api.get('/me')MySQL (backend-only)
import { createMySqlPool } from '@lucaismyname/l1-utils'
const pool = await createMySqlPool({
host: process.env.MYSQL_HOST!,
user: process.env.MYSQL_USER!,
password: process.env.MYSQL_PASSWORD!,
database: process.env.MYSQL_DATABASE!,
})
const rows = await pool.query('SELECT 1 as ok')
await pool.end()String utilities
import { toCamelCase, toKebabCase, toPascalCase, toSnakeCase, truncate } from '@lucaismyname/l1-utils'
toCamelCase('hello world')
toKebabCase('HelloWorld')
truncate('hello world', 5)Validators / type guards
import {
isEmail,
isIban,
isBic,
isCreditCardNumber,
isUuid,
isUrl,
isSlug,
isHexColor,
isPhoneNumberE164,
isPostalCode,
isIsoDateString,
isIsoDateTimeString,
} from '@lucaismyname/l1-utils'
isEmail('[email protected]')
isUuid('550e8400-e29b-41d4-a716-446655440000')
isPostalCode('10115', 'DE')Object / JSON utilities
import { safeJsonParse, deepMerge, pick, omit, compactObject } from '@lucaismyname/l1-utils'
const parsed = safeJsonParse('{"a":1}')
if (parsed.ok) {
parsed.value
}
const merged = deepMerge({ a: { b: 1 } }, { a: { c: 2 } })
const only = pick({ a: 1, b: 2 }, ['a'])
const without = omit({ a: 1, b: 2 }, ['b'])
compactObject({ a: 1, b: undefined, c: { d: undefined, e: 2 } })
compactObject({ a: null, b: 1 }, { removeNull: true })