0.3.7 • Published 6 months ago

@leexi/shared v0.3.7

Weekly downloads
-
License
UNLICENSED
Repository
-
Last release
6 months ago

@leexi/shared is a collection of config files and utility functions for JavaScript or TypeScript based repositories as well as composables and components for Vue based repositores of the Leexi-ai organisation.

Installation

yarn add -D @leexi/shared

Usage

esLint

There are 2 available esLint configs.

  • base: for JavaScript/TypeScript based repositories
  • vue: for Vue based repositories
// eslint.config.js
import base from '@leexi/shared/eslint/base';

export default [
  ...base,
  {
    // add custom config here
  }
];

Utils

import { deepDup, isSame, set } from '@leexi/shared/utils';

const foo = { foo: 'bar' };
const dup = deepDup(foo);
if (isSame(foo, dup)) {
  set(foo, ['foo'], 'fiz');
}

Composables

<script setup>
  import { useLocalStorage } from '@leexi/shared/composables'

  const mode = useLocalStorage('mode', 'dark')
</script>

Nuxt

This package provides a module for Nuxt to auto import every component, composable and util in a Nuxt based repository

// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@leexi/shared'
  ],

  leexi: {
    composables: true, // whether composables should be auto-imported. Defaults to true
    utils: true, // whether utils should be auto-imported. Defaults to true
  }
})

API

Composables

useLocalStorage

A composable that provides a reactive reference to a value stored in localStorage. It handles JSON parsing/stringifying and migration from kebab-case/snake_case keys to camelCase.

  • Type
const useLocalStorage: <T>(key: string, defaultValue?: T) => Ref<undefined | T>;
  • Example
const userSetting = useLocalStorage('userSetting', { theme: 'light' });
console.log(userSetting.value); // Output: { theme: 'light' }
console.log(localStorage.userSetting); // Output: '{"theme":"light"}'

const sameUserSetting = useLocalStorage('userSetting');
console.log(sameUserSetting.value); // Output: { theme: 'light' }

userSetting.value = { theme: 'dark', notifications: true };
console.log(sameUserSetting.value); // Output: { theme: 'dark', notifications: true }
console.log(localStorage.userSetting); // Output: '{"theme":"dark","notifications":true}'

Utils

Records

set

Sets a value within a nested object structure based on a provided path. It mutates the original object and creates nested objects if they don't exist along the path.

  • Type
const set: <T extends Record<string, unknown>, const P extends string[], V>(record: T, path: P, value: V) => SetRecord<T, P, V>;
  • Example
const myObject = { a: { b: { c: 1 } } };
set(myObject, ['a', 'b', 'd'], 2);

console.log(myObject); // Output: { a: { b: { c: 1, d: 2 } } }

omit

Creates a new object by omitting the specified keys from the input record.

  • Type
const omit: <T extends Record<string, unknown>, K extends (keyof T)[]>(record: T, keys: K) => Omit<T, K[number]>;
  • Example
const myObject = { a: 1, b: 2, c: 3, d: 4 };
const omittedObject = omit(myObject, ['b', 'd']);

console.log(omittedObject); // Output: { a: 1, c: 3 }

pick

Creates a new object by picking only the specified keys from the input record.

  • Type
const pick: <T extends Record<string, unknown>, K extends (keyof T)[]>(record: T, keys: K) => Pick<T, K[number]>;
  • Example
const myObject = { a: 1, b: 2, c: 3, d: 4 };
const pickedObject = pick(myObject, ['a', 'c']);

console.log(pickedObject); // Output: { a: 1, c: 3 }

Strings

camelcase

Converts a string from snake_case or kebab-case to camelCase.

  • Type
const camelcase: (string: string) => string;
  • Example
console.log(camelcase('my_variable_name')); // Output: myVariableName
console.log(camelcase('my-variable-name')); // Output: myVariableName
console.log(camelcase('myVariable')); // Output: myVariable

capitalize

Capitalizes the first letter of a string.

  • Type
const capitalize: (string: string) => string;
  • Example
console.log(capitalize('hello world')); // Output: Hello world
console.log(capitalize('')); // Output: ''

kebabcase

Converts a string from camelCase or snake_case to kebab-case.

  • Type
const kebabcase: (string: string) => string;
  • Example
console.log(kebabcase('myVariableName')); // Output: my-variable-name
console.log(kebabcase('my_variable_name')); // Output: my-variable-name
console.log(kebabcase('my-variable-name')); // Output: my-variable-name

snakecase

Converts a string from camelCase or kebab-case to snake_case.

  • Type
const snakecase: (string: string) => string;
  • Example
console.log(snakecase('myVariableName')); // Output: my_variable_name
console.log(snakecase('my-variable-name')); // Output: my_variable_name
console.log(snakecase('my_variable_name')); // Output: my_variable_name

Objects

deepDup

Creates a deep duplicate of an object, array, or Set. It handles nested objects, arrays, and Sets but does not handle functions, Dates, or circular references.

  • Type
const deepDup: <T extends object>(object: T) => T;
  • Example
const originalObject = { a: 1, b: { c: 2, d: [3, 4] }, e: new Set([5, 6]) };
const duplicatedObject = deepDup(originalObject);

console.log(duplicatedObject); // Output: { a: 1, b: { c: 2, d: [3, 4] }, e: Set { 5, 6 } }
console.log(originalObject === duplicatedObject); // Output: false
console.log(originalObject.b === duplicatedObject.b); // Output: false
console.log(originalObject.b.d === duplicatedObject.b.d); // Output: false
console.log(originalObject.e === duplicatedObject.e); // Output: false

isSame

Checks if two objects are the same by comparing their JSON stringified representations. Note: This method has limitations and may not accurately compare objects with different key orders, non-primitive values like functions or Dates, or circular references.

  • Type
const isSame: (a: object, b: object) => boolean;
  • Example
const obj1 = { a: 1, b: 2 };
const obj2 = { a: 1, b: 2 };
const obj3 = { b: 2, a: 1 };

console.log(isSame(obj1, obj2)); // Output: true
console.log(isSame(obj1, obj3)); // Output: false (due to key order difference in JSON stringification)
0.3.7

6 months ago

0.3.6

7 months ago

0.3.5

8 months ago

0.3.4

8 months ago

0.3.3

8 months ago

0.3.2

8 months ago

0.3.1

8 months ago

0.3.0

8 months ago

0.2.1

8 months ago

0.2.0

8 months ago

0.1.1

8 months ago

0.1.0

8 months ago

0.0.6

8 months ago

0.0.5

8 months ago

0.0.4

9 months ago

0.0.3

9 months ago

0.0.2

9 months ago

0.0.1

10 months ago