npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@molecule/app-solid

v1.0.1

Published

Solid.js framework bindings for molecule.dev

Downloads

156

Readme

@molecule/app-solid

Auto-generated, AI-first package reference for the molecule.dev ecosystem. It is written to be read by coding agents as much as by people, and is generated from this package's source — edit src/index.ts JSDoc, not this file.

Solid.js framework bindings for molecule.dev.

Provides Solid-specific implementations of molecule.dev core interfaces using Solid's reactive primitives (signals, effects, resources): wrap the app in MoleculeProvider with a config of providers, then consume them through createAuth, createTheme, createRouter, createI18n, and the other primitives.

Quick Start

import { MoleculeProvider, createAuth, createTheme } from '@molecule/app-solid'
import { Show } from 'solid-js'
import { provider as stateProvider } from '@molecule/app-state-zustand'
import { provider as themeProvider } from '@molecule/app-theme-css-variables'
import { createJWTAuthClient } from '@molecule/app-auth'

const authClient = createJWTAuthClient({ baseURL: '/api' })

function UserProfile() {
  const { user, isAuthenticated, logout } = createAuth<{ name?: string }>()
  const { theme, toggleTheme } = createTheme()

  return (
    <Show when={isAuthenticated()} fallback={<a href="/login">Log in</a>}>
      <div style={{ background: theme().colors.background }}>
        <h1>Welcome, {user()?.name}</h1>
        <button onClick={toggleTheme}>Toggle Theme</button>
        <button onClick={() => logout()}>Logout</button>
      </div>
    </Show>
  )
}

function App() {
  return (
    <MoleculeProvider config={{ state: stateProvider, auth: authClient, theme: themeProvider }}>
      <UserProfile />
    </MoleculeProvider>
  )
}

Type

framework

Installation

npm install @molecule/app-solid @molecule/app-auth @molecule/app-device @molecule/app-forms @molecule/app-http @molecule/app-i18n @molecule/app-logger @molecule/app-platform @molecule/app-push @molecule/app-routing @molecule/app-state @molecule/app-storage @molecule/app-theme @molecule/app-ui @molecule/app-utilities @molecule/app-version solid-js

API

Interfaces

AuthClient

Auth client interface that all auth bond packages must implement. Provides login/logout/register flows, token management, profile updates, and auth state subscription.

interface AuthClient<T = UserProfile> {
  /**
   * Returns the current authentication state snapshot.
   */
  getState(): AuthState<T>
  /**
   * Returns whether the user is currently authenticated.
   */
  isAuthenticated(): boolean
  /**
   * Gets the current user.
   */
  getUser(): T | null
  /**
   * Updates the cached user object (state + persistent storage) without
   * hitting the network. Intended for local refreshes after a per-app
   * mutation (e.g., the user just PATCHed their own profile and the
   * server returned the canonical row). Does NOT change tokens.
   */
  setUser(user: T | null): void
  /**
   * Gets the current access token.
   */
  getAccessToken(): string | null
  /**
   * Stores the access token in the configured token storage adapter (in-memory
   * by default). Use this to seed the token after an out-of-band exchange (e.g.
   * the OAuth code→token redirect) instead of writing to `localStorage` directly,
   * which would violate the in-memory-default storage contract and make the bearer
   * token JS-readable (XSS-exfiltratable). Pass `null` to clear it.
   */
  setAccessToken(token: string | null): void
  /**
   * Gets the refresh token.
   */
  getRefreshToken(): string | null
  /**
   * Logs in with credentials.
   */
  login(credentials: LoginCredentials): Promise<AuthResult<T>>
  /**
   * Logs out the current user.
   */
  logout(): Promise<void>
  /**
   * Registers a new user.
   */
  register(data: RegisterData): Promise<AuthResult<T>>
  /**
   * Refreshes the access token.
   */
  refresh(): Promise<AuthResult<T>>
  /**
   * Requests a password reset.
   */
  requestPasswordReset(data: PasswordResetRequest): Promise<void>
  /**
   * Confirms a password reset.
   */
  confirmPasswordReset(data: PasswordResetConfirm): Promise<void>
  /**
   * Updates the current user's profile.
   */
  updateProfile(data: Partial<T>): Promise<T>
  /**
   * Changes the current user's password.
   */
  changePassword(oldPassword: string, newPassword: string): Promise<void>
  /**
   * Initializes auth state (e.g., from stored tokens).
   */
  initialize(): Promise<void>
  /**
   * Subscribes to auth state changes.
   */
  subscribe(callback: (state: AuthState<T>) => void): () => void
  /**
   * Subscribes to auth state changes (alias for subscribe).
   */
  onAuthChange(callback: (state: AuthState<T>) => void): () => void
  /**
   * Gets the current access token (alias for getAccessToken).
   */
  getToken?(): string | null
  /**
   * Adds an auth event listener.
   */
  addEventListener(listener: AuthEventListener): () => void
  /**
   * Destroys the auth client.
   */
  destroy(): void
}

AuthPrimitives

Auth primitives return type.

interface AuthPrimitives<T = unknown> {
  state: Accessor<AuthState<T>>
  user: Accessor<T | null>
  isAuthenticated: Accessor<boolean>
  isLoading: Accessor<boolean>
  login: AuthClient<T>['login']
  logout: AuthClient<T>['logout']
  register: AuthClient<T>['register']
  refresh: AuthClient<T>['refresh']
}

AuthState

Reactive authentication state snapshot (initialized, authenticated, user, loading, and error).

interface AuthState<T = UserProfile> {
  /**
   * Whether auth state has been initialized.
   */
  initialized: boolean
  /**
   * Whether the user is authenticated.
   */
  authenticated: boolean
  /**
   * Current user (if authenticated).
   */
  user: T | null
  /**
   * Whether an auth operation is in progress.
   */
  loading: boolean
  /**
   * Last auth error (if any).
   */
  error: string | null
}

CapacitorAppPrimitives

Capacitor app primitives return type.

interface CapacitorAppPrimitives {
  state: Accessor<CapacitorAppState>
  ready: Accessor<boolean>
  initialize: () => Promise<void>
}

CreateAsyncStateReturn

Return type for createAsyncState.

interface CreateAsyncStateReturn<T> {
  state: () => T
  setState: (value: T | ((prev: T) => T) | Promise<T | ((prev: T) => T)>) => void
  extendState: (
    partial:
      Partial<T> | ((prev: T) => Partial<T>) | Promise<Partial<T> | ((prev: T) => Partial<T>)>,
  ) => void
}

CreateChangePasswordReturn

Return type for createChangePassword primitive.

interface CreateChangePasswordReturn {
  state: Accessor<PromiseState<void>>
  changePassword: (oldPassword: string, newPassword: string) => Promise<void>
  reset: () => void
}

CreateFormResult

Result of createForm primitive.

interface CreateFormResult<T extends Record<string, unknown>> {
  /** Reactive form state accessor. */
  formState: Accessor<FormState<T>>

  /** Whether the form is currently valid. */
  isValid: Accessor<boolean>

  /** Whether any field has been modified. */
  isDirty: Accessor<boolean>

  /** Whether the form is currently submitting. */
  isSubmitting: Accessor<boolean>

  /** Current field errors. */
  errors: Accessor<Partial<Record<keyof T, string>>>

  /** Register a field for form management. */
  register: (name: keyof T, options?: RegisterOptions) => FieldRegistration

  /** Get the current value of a field. */
  getValue: <K extends keyof T>(name: K) => T[K]

  /** Set the value of a field. */
  setValue: <K extends keyof T>(name: K, value: T[K]) => void

  /** Get the error message for a field. */
  getError: (name: keyof T) => string | undefined

  /** Set an error message for a field. */
  setError: (name: keyof T, error: string | undefined) => void

  /** Clear all field errors. */
  clearErrors: () => void

  /** Create a submit handler function. */
  handleSubmit: (
    onSubmit: (values: T) => void | Promise<void>,
  ) => (event?: { preventDefault?: () => void }) => Promise<void>

  /** Reset the form to initial or provided values. */
  reset: (values?: Partial<T>) => void

  /** Validate all fields. */
  validate: () => Promise<boolean>

  /** The raw FormController instance for advanced use. */
  controller: FormController<T>
}

CreateLoginReturn

Return type for createLogin primitive.

interface CreateLoginReturn<T = unknown> {
  state: Accessor<PromiseState<AuthResult<T>>>
  login: (credentials: LoginCredentials) => Promise<AuthResult<T>>
  reset: () => void
}

CreateOAuthOptions

OAuth configuration options.

interface CreateOAuthOptions {
  /** Base URL for the API server (e.g. `https://api.example.com`). */
  baseURL?: string
  /** List of supported OAuth provider names (e.g. `['github', 'google']`). */
  oauthProviders?: string[]
  /** Path prefix for OAuth initiation routes. Defaults to `/oauth`. */
  oauthEndpoint?: string
  /** Path for the OAuth login POST endpoint. Defaults to `/users/log-in/oauth`. */
  loginEndpoint?: string
  /** Called after a successful OAuth login (session established). */
  onSuccess?: () => void
  /** Called with a failure message when the OAuth login fails. */
  onError?: (error: string) => void
  /**
   * Auth client used to establish the session after the code exchange.
   * Overrides context resolution — when omitted, the client is resolved from
   * the surrounding `MoleculeProvider` (tolerated when absent; see the
   * cookie-session fallback documented on
   * {@link CreateOAuthReturn.handleCallback}).
   */
  authClient?: AuthClient<unknown>
}

CreateOAuthReturn

Return type for createOAuth primitive.

interface CreateOAuthReturn {
  /** Accessor for the configured OAuth provider names. */
  providers: Accessor<string[]>
  /** Builds the OAuth initiation URL for a provider. */
  getOAuthUrl: (provider: string) => string
  /** Starts the full-page redirect flow for a provider. */
  redirect: (provider: string) => void
  /**
   * Handles the OAuth callback: exchanges the `code` URL parameter for a
   * session. Invoked automatically at creation (see {@link createOAuth});
   * exposed for callers that need to re-run it manually. No-ops unless
   * running in a browser with a `code` URL parameter and a stashed provider.
   *
   * When an auth client is available (explicit option or context), the
   * session is established locally (`setAccessToken` + `setUser` +
   * `initialize`). When no client is available, the server has already
   * established the httpOnly-cookie session during the exchange, so a
   * user-carrying response still counts as success.
   */
  handleCallback: () => Promise<void>
}

CreatePasswordResetReturn

Return type for createPasswordReset primitive.

interface CreatePasswordResetReturn {
  requestState: Accessor<PromiseState<void>>
  confirmState: Accessor<PromiseState<void>>
  requestReset: (data: PasswordResetRequest) => Promise<void>
  confirmReset: (data: PasswordResetConfirm) => Promise<void>
  reset: () => void
}

CreatePromiseReturn

Promise state accessor with actions.

interface CreatePromiseReturn<T> {
  state: () => PromiseState<T>
  call: (...args: any[]) => Promise<T>
  cancel: (message?: string) => void
  reset: () => void
}

CreateSignupReturn

Return type for createSignup primitive.

interface CreateSignupReturn<T = unknown> {
  state: Accessor<PromiseState<AuthResult<T>>>
  signup: (data: RegisterData) => Promise<AuthResult<T>>
  reset: () => void
}

DevicePrimitives

Device primitives return type.

interface DevicePrimitives {
  deviceInfo: DeviceInfo
  screenInfo: ScreenInfo
  hardwareInfo: HardwareInfo
  featureSupport: FeatureSupport
  supports: (feature: keyof FeatureSupport) => boolean
  isOnline: () => boolean
  isStandalone: () => boolean
  language: string
  languages: string[]
}

FormController

Form controller interface.

All form providers must implement this interface.

interface FormController<T extends Record<string, unknown> = Record<string, unknown>> {
  /**
   * Gets the current form state.
   */
  getState(): FormState<T>
  /**
   * Gets the value of a specific field.
   */
  getValue(name: string): unknown
  getValue<K extends keyof T>(name: K): T[K]
  /**
   * Gets all form values.
   */
  getValues(): T
  /**
   * Sets the value of a specific field.
   */
  setValue(
    name: string,
    value: unknown,
    options?: {
      shouldValidate?: boolean
      shouldDirty?: boolean
      shouldTouch?: boolean
    },
  ): void
  /**
   * Sets multiple values at once.
   */
  setValues(
    values: Partial<T>,
    options?: {
      shouldValidate?: boolean
    },
  ): void
  /**
   * Gets the error for a specific field.
   */
  getError(name: string): string | undefined
  /**
   * Sets the error for a specific field.
   */
  setError(name: string, error: string | undefined): void
  /**
   * Clears the error for a specific field.
   */
  clearError<K extends keyof T>(name: K): void
  /**
   * Clears all errors.
   */
  clearErrors(): void
  /**
   * Gets the field state for a specific field.
   */
  getFieldState<K extends keyof T>(name: K): FieldState<T[K]>
  /**
   * Registers a field for form management.
   */
  register(nameOrOptions: string | RegisterOptions, options?: RegisterOptions): FieldRegistration
  /**
   * Unregisters a field.
   */
  unregister(name: string): void
  /**
   * Validates a specific field.
   */
  validateField<K extends keyof T>(name: K): Promise<boolean>
  /**
   * Validates all fields.
   */
  validate(): Promise<boolean>
  /**
   * Resets the form to initial values.
   */
  reset(values?: Partial<T>): void
  /**
   * Handles form submission.
   */
  handleSubmit(
    onSubmit: (values: T) => void | Promise<void>,
    onError?: (errors: Partial<Record<keyof T, string>>) => void,
  ): (event?: { preventDefault?: () => void }) => Promise<void>
  /**
   * Sets focus to a field.
   */
  setFocus(name: keyof T): void
  /**
   * Subscribes to form state changes.
   */
  subscribe(callback: (state: FormState<T>) => void): () => void
  /**
   * Destroys the form controller.
   */
  destroy(): void
}

FormOptions

Form creation options.

interface FormOptions<T extends Record<string, unknown>> {
  /**
   * Default values.
   */
  defaultValues?: Partial<T>
  /**
   * Validation mode.
   */
  mode?: 'onSubmit' | 'onChange' | 'onBlur' | 'all'
  /**
   * Revalidation mode.
   */
  reValidateMode?: 'onChange' | 'onBlur' | 'onSubmit'
  /**
   * Whether to focus the first error field on submit.
   */
  shouldFocusError?: boolean
  /**
   * Form-level validation function.
   */
  validate?: (
    values: T,
  ) => Partial<Record<keyof T, string>> | Promise<Partial<Record<keyof T, string>>>
}

HttpClient

HTTP client interface.

All HTTP providers must implement this interface.

interface HttpClient {
  /**
   * Base URL for all requests.
   */
  baseURL: string
  /**
   * Default headers for all requests.
   */
  defaultHeaders: Record<string, string>
  /**
   * Makes a generic HTTP request.
   */
  request<T = unknown>(config: FullRequestConfig): Promise<HttpResponse<T>>
  /**
   * Makes a GET request.
   */
  get<T = unknown>(url: string, config?: RequestConfig): Promise<HttpResponse<T>>
  /**
   * Makes a POST request.
   */
  post<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<HttpResponse<T>>
  /**
   * Makes a PUT request.
   */
  put<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<HttpResponse<T>>
  /**
   * Makes a PATCH request.
   */
  patch<T = unknown>(url: string, data?: unknown, config?: RequestConfig): Promise<HttpResponse<T>>
  /**
   * Makes a DELETE request.
   */
  delete<T = unknown>(url: string, config?: RequestConfig): Promise<HttpResponse<T>>
  /**
   * Adds a request interceptor.
   * Returns a function to remove the interceptor.
   */
  addRequestInterceptor(interceptor: RequestInterceptor): () => void
  /**
   * Adds a response interceptor.
   * Returns a function to remove the interceptor.
   */
  addResponseInterceptor(interceptor: ResponseInterceptor): () => void
  /**
   * Adds an error interceptor.
   * Returns a function to remove the interceptor.
   */
  addErrorInterceptor(interceptor: ErrorInterceptor): () => void
  /**
   * Sets the authorization token.
   */
  setAuthToken(token: string | null): void
  /**
   * Returns the current authorization token, or `null` if not set.
   */
  getAuthToken(): string | null
  /**
   * Registers a handler for authentication errors (401).
   *
   * @returns An unsubscribe function.
   */
  onAuthError(handler: () => void): () => void
}

HttpState

State for async HTTP operations.

interface HttpState<T> {
  data: T | null
  loading: boolean
  error: Error | null
}

I18nProvider

i18n provider interface.

All i18n providers must implement this interface.

interface I18nProvider {
  /**
   * Gets the current locale.
   */
  getLocale(): string
  /**
   * Sets the current locale.
   *
   * **Fleet contract:** every conformant provider (the core simple provider,
   * `@molecule/api-i18n-simple`, `@molecule/app-i18n-i18next`, and
   * `@molecule/app-i18n-react-i18next`) MUST throw `Error('Locale "<code>"
   * not found')` when `locale` is not registered — via the constructor's
   * `initialLocales`/`locales` config, `addLocale()`, or `addTranslations()`
   * (all three register a locale). It must NOT silently degrade to
   * fallback-locale text while `getLocale()` reports the unregistered code —
   * that divergence makes a misconfigured locale switch indistinguishable
   * from a working one until a user notices the wrong language on screen.
   */
  setLocale(locale: string): Promise<void>
  /**
   * Gets all available locales.
   */
  getLocales(): LocaleConfig[]
  /**
   * Adds a locale.
   */
  addLocale(config: LocaleConfig): void
  /**
   * Removes a locale by code, notifying subscribers so language pickers
   * built on `onLocaleChange` re-render their list. If the removed locale
   * is currently active, the caller is responsible for switching to a
   * fallback (e.g. `'en'`) BEFORE calling this — the provider will not
   * auto-fall-back on its own.
   *
   * Returns `true` if the locale was registered and removed, `false`
   * otherwise.
   */
  removeLocale(code: string): boolean
  /**
   * Adds translations to a locale. Auto-creates the locale if it doesn't exist.
   *
   * **Fleet contract:** merges are DEEP, not a shallow spread — registering
   * two calls (e.g. two modules) that share a top-level namespace key merges
   * their subtrees instead of the second call clobbering the first's nested
   * translations wholesale. `@molecule/api-i18n-simple` implements the same
   * contract on the API side.
   */
  addTranslations(locale: string, translations: Translations, namespace?: string): void
  /**
   * Translates a key with optional interpolation values and pluralization.
   *
   * **Fleet plural contract (matches i18next's own key resolution order):**
   * when `options.count` is provided, the plural-suffixed key
   * (`` `${key}_${pluralForm}` ``, e.g. `item_one`/`item_few`/…, falling back
   * to `` `${key}_other` ``) is looked up FIRST and wins over the base `key`
   * if BOTH are registered. Only when no plural-suffixed key exists at all
   * does resolution fall back to the base key. A catalog that ships both
   * `item` and `item_one`/`item_other` therefore pluralizes identically
   * whichever provider is bonded.
   *
   * @returns The translated string, or the default value / key if not found.
   */
  t(
    key: string,
    values?: InterpolationValues,
    options?: {
      defaultValue?: string
      count?: number
    },
  ): string
  /**
   * Checks if a translation key exists.
   *
   * **Fleet contract:** follows the SAME locale-resolution chain as `t()` —
   * the active locale, then the English fallback — so `exists(key) === true`
   * whenever `t(key)` would render real translated text (not the raw key or
   * an inline `defaultValue`). Do not narrow this to "only the active
   * locale's own catalog"; that made `exists()` return `false` for keys `t()`
   * happily rendered via the English fallback, and the answer differed by
   * provider.
   *
   * @returns `true` if the key has a translation.
   */
  exists(key: string): boolean
  /**
   * Formats a number according to the current locale.
   *
   * @returns The locale-formatted number string.
   */
  formatNumber(value: number, options?: NumberFormatOptions): string
  /**
   * Formats a date according to the current locale.
   *
   * @returns The locale-formatted date string.
   */
  formatDate(value: Date | number | string, options?: DateFormatOptions): string
  /**
   * Formats a relative time (e.g. "2 hours ago").
   *
   * @returns The locale-formatted relative time string.
   */
  formatRelativeTime(
    value: Date | number,
    options?: {
      unit?: Intl.RelativeTimeFormatUnit
    },
  ): string
  /**
   * Formats a list (e.g. "A, B, and C").
   *
   * @returns The locale-formatted list string.
   */
  formatList(
    values: string[],
    options?: {
      type?: 'conjunction' | 'disjunction' | 'unit'
    },
  ): string
  /**
   * Subscribes to locale changes.
   *
   * @returns An unsubscribe function.
   */
  onLocaleChange(listener: (locale: string) => void): () => void
  /**
   * Gets the text direction for the current locale.
   *
   * @returns `'ltr'` or `'rtl'`.
   */
  getDirection(): 'ltr' | 'rtl'
  /**
   * Checks if a translation key exists (alias for exists).
   */
  hasKey?(key: string): boolean
  /**
   * Checks if the provider is ready.
   */
  isReady?(): boolean
  /**
   * Registers a callback for when the provider is ready.
   */
  onReady?(callback: () => void): () => void
  /**
   * Registers a lazily-loaded content module for automatic reload on locale changes.
   * All registered content is reloaded during `setLocale()` before listeners fire,
   * ensuring content is available on the first re-render with no flash.
   *
   * Idempotent: registering the same module name twice is a no-op.
   */
  registerContent?(module: string, loader: (locale: string) => Promise<void>): void
}

Logger

Logger instance with leveled logging methods, child logger creation, and transport management.

interface Logger {
  /**
   * Logs a trace message.
   */
  trace(message: string, ...args: unknown[]): void
  /**
   * Logs a debug message.
   */
  debug(message: string, ...args: unknown[]): void
  /**
   * Logs an info message.
   */
  info(message: string, ...args: unknown[]): void
  /**
   * Logs a warning message.
   */
  warn(message: string, ...args: unknown[]): void
  /**
   * Logs an error message.
   */
  error(message: string | Error, ...args: unknown[]): void
  /**
   * Sets the log level.
   */
  setLevel(level: LogLevel): void
  /**
   * Gets the current log level.
   */
  getLevel(): LogLevel
  /**
   * Creates a child logger with a namespace.
   */
  child(name: string, context?: Record<string, unknown>): Logger
  /**
   * Adds additional context to the logger.
   */
  withContext(context: Record<string, unknown>): Logger
  /**
   * Adds a transport.
   */
  addTransport(transport: LogTransport): () => void
  /**
   * Removes a transport.
   */
  removeTransport(transport: LogTransport): void
}

LoggerProvider

Logger provider interface that all logger bond packages must implement. Creates and manages logger instances and global log configuration.

interface LoggerProvider {
  /**
   * Gets a logger by name, or the root logger if no name given.
   */
  getLogger(name?: string): Logger
  /**
   * Creates a named logger.
   */
  createLogger(nameOrConfig: string | LoggerConfig, config?: LoggerConfig): Logger
  /**
   * Sets the global log level.
   */
  setLevel(level: LogLevel): void
  /**
   * Gets the global log level.
   */
  getLevel(): LogLevel
  /**
   * Adds a global transport.
   */
  addTransport(transport: LogTransport): () => void
  /**
   * Enables logging.
   */
  enable(): void
  /**
   * Disables logging.
   */
  disable(): void
  /**
   * Checks if logging is enabled.
   *
   * @returns `true` if logging is currently enabled.
   */
  isEnabled(): boolean
}

MoleculeConfig

Configuration for molecule Solid context.

interface MoleculeConfig {
  state?: StateProvider
  auth?: AuthClient<unknown>
  theme?: ThemeProvider
  router?: Router
  i18n?: I18nProvider
  http?: HttpClient
  storage?: StorageProvider
  logger?: LoggerProvider
}

MoleculeStore

Reactive state container with getState, setState, subscribe, and destroy.

All state management providers must implement this interface.

interface Store<T> {
  /**
   * Gets the current state.
   */
  getState(): T
  /**
   * Sets the state (partial or via updater function).
   */
  setState(partial: Partial<T> | ((state: T) => Partial<T>)): void
  /**
   * Subscribes to state changes.
   * Returns an unsubscribe function.
   */
  subscribe(listener: StateListener<T>): () => void
  /**
   * Destroys the store and cleans up subscriptions.
   */
  destroy(): void
}

PlatformPrimitives

Platform primitives return type.

interface PlatformPrimitives {
  platform: Platform
  isNative: boolean
  isMobile: boolean
  isDesktop: boolean
  isWeb: boolean
  isDevelopment: boolean
  isProduction: boolean
  isPlatform: (...platforms: Platform[]) => boolean
}

PushPrimitives

Push primitives return type.

interface PushPrimitives {
  permission: Accessor<PermissionStatus | null>
  token: Accessor<PushToken | null>
  checkPermission: () => Promise<PermissionStatus>
  requestPermission: () => Promise<PermissionStatus>
  register: (options?: PushRegisterOptions) => Promise<PushToken>
  unregister: () => Promise<void>
  onNotificationReceived: (listener: NotificationReceivedListener) => () => void
  onNotificationAction: (listener: NotificationActionListener) => () => void
  onTokenChange: (listener: TokenChangeListener) => () => void
  setBadge: (count: number) => Promise<void>
  clearBadge: () => Promise<void>
}

RouteLocation

Current URL decomposed into pathname, search string, hash, navigation state, and unique key.

interface RouteLocation {
  /**
   * Current pathname.
   */
  pathname: string
  /**
   * Query string (including leading ?).
   */
  search: string
  /**
   * Hash (including leading #).
   */
  hash: string
  /**
   * State data passed with navigation.
   */
  state?: unknown
  /**
   * Unique key for this location.
   */
  key?: string
}

Router

Client-side router providing navigation, guards, route matching, and history control.

All routing providers must implement this interface.

interface Router {
  /**
   * Returns the current route location (pathname, search, hash, state).
   */
  getLocation(): RouteLocation
  /**
   * Gets the current route params.
   */
  getParams<T extends RouteParams = RouteParams>(): T
  /**
   * Gets the current query params.
   */
  getQuery(): QueryParams
  /**
   * Gets a specific query parameter.
   */
  getQueryParam(key: string): string | undefined
  /**
   * Gets the current hash.
   */
  getHash(): string
  /**
   * Navigates to a path.
   */
  navigate(path: string, options?: NavigateOptions): void
  /**
   * Navigates to a named route.
   */
  navigateTo(
    name: string,
    params?: RouteParams,
    query?: QueryParams,
    options?: NavigateOptions,
  ): void
  /**
   * Goes back in history.
   */
  back(): void
  /**
   * Goes forward in history.
   */
  forward(): void
  /**
   * Goes to a specific point in history.
   */
  go(delta: number): void
  /**
   * Updates the current query params.
   */
  setQuery(params: QueryParams, options?: NavigateOptions): void
  /**
   * Updates a specific query parameter.
   */
  setQueryParam(key: string, value: string | undefined, options?: NavigateOptions): void
  /**
   * Updates the current hash.
   */
  setHash(hash: string, options?: NavigateOptions): void
  /**
   * Checks if a path matches the current location.
   *
   * @returns `true` if the path matches the current route.
   */
  isActive(path: string, exact?: boolean): boolean
  /**
   * Matches a path pattern against a pathname.
   */
  matchPath<Params extends RouteParams = RouteParams>(
    pattern: string,
    pathname: string,
  ): RouteMatch<Params> | null
  /**
   * Generates a URL from a named route.
   */
  generatePath(name: string, params?: RouteParams, query?: QueryParams): string
  /**
   * Subscribes to route changes.
   */
  subscribe(listener: RouteChangeListener): () => void
  /**
   * Adds a navigation guard.
   */
  addGuard(guard: NavigationGuard): () => void
  /**
   * Registers route definitions.
   */
  registerRoutes(routes: RouteDefinition[]): void
  /**
   * Gets all registered routes.
   */
  getRoutes(): RouteDefinition[]
  /**
   * Destroys the router.
   */
  destroy(): void
}

RouterPrimitives

Router primitives return type.

interface RouterPrimitives {
  location: Accessor<RouteLocation>
  params: Accessor<RouteParams>
  query: Accessor<QueryParams>
  navigate: Router['navigate']
  navigateTo: Router['navigateTo']
  back: Router['back']
  forward: Router['forward']
  isActive: Router['isActive']
}

StateProvider

State provider interface that all state management bond packages must implement. Provides the store creation factory.

interface StateProvider {
  /**
   * Creates a new store.
   */
  createStore<T>(config: StoreConfig<T>): Store<T>
}

StorageProvider

Storage provider interface.

All storage providers must implement this interface.

interface StorageProvider {
  /**
   * Gets a value from storage.
   */
  get<T = unknown>(key: string): Promise<T | null>
  /**
   * Sets a value in storage.
   */
  set<T = unknown>(key: string, value: T): Promise<void>
  /**
   * Removes a value from storage.
   */
  remove(key: string): Promise<void>
  /**
   * Clears all values from storage.
   */
  clear(): Promise<void>
  /**
   * Gets all keys in storage.
   */
  keys(): Promise<string[]>
  /**
   * Gets multiple values from storage.
   */
  getMany?<T = unknown>(keys: string[]): Promise<Map<string, T | null>>
  /**
   * Sets multiple values in storage.
   */
  setMany?<T = unknown>(entries: Array<[string, T]>): Promise<void>
  /**
   * Removes multiple values from storage.
   */
  removeMany?(keys: string[]): Promise<void>
}

StorageValueState

State for async storage values.

interface StorageValueState<T> {
  value: T | undefined
  loading: boolean
  error: Error | null
}

StoreConfig

Configuration for creating a store (initial state, optional name, and middleware chain).

interface StoreConfig<T> {
  /**
   * Initial state value.
   */
  initialState: T
  /**
   * Optional name for debugging.
   */
  name?: string
  /**
   * Optional middleware functions.
   */
  middleware?: StoreMiddleware<T>[]
}

Theme

Complete theme definition.

interface Theme {
  name: string
  mode: 'light' | 'dark'
  colors: ThemeColors
  breakpoints: ThemeBreakpoints
  spacing: ThemeSpacing
  typography: ThemeTypography
  borderRadius: ThemeBorderRadius
  shadows: ThemeShadows
  transitions: ThemeTransitions
  zIndex: ThemeZIndex
}

ThemePrimitives

Theme primitives return type.

interface ThemePrimitives {
  theme: Accessor<Theme>
  themeName: Accessor<string>
  mode: Accessor<'light' | 'dark'>
  setTheme: (name: string) => void
  toggleTheme: () => void
}

ThemeProvider

Manages theme state including the active theme, mode toggling, and change subscriptions.

interface ThemeProvider {
  /**
   * Returns the currently active theme.
   */
  getTheme(): Theme
  /**
   * Sets the active theme by reference or by name.
   *
   * @param theme - A `Theme` object or a theme name string to activate.
   */
  setTheme(theme: Theme | string): void
  /**
   * Toggles between light and dark mode for the active theme.
   */
  toggleMode(): void
  /**
   * Subscribes to theme changes. The callback fires whenever
   * `setTheme()` or `toggleMode()` is called.
   *
   * @param callback - Invoked with the new theme after each change.
   * @returns An unsubscribe function.
   */
  subscribe(callback: (theme: Theme) => void): () => void
  /**
   * Returns all registered themes. Optional — not all providers
   * support multiple themes.
   */
  getThemes?(): Theme[]
}

VersionPrimitives

Version primitives return type.

interface VersionPrimitives {
  state: Accessor<VersionState>
  isUpdateAvailable: Accessor<boolean>
  isChecking: Accessor<boolean>
  isServiceWorkerWaiting: Accessor<boolean>
  newVersion: Accessor<string | undefined>
  checkForUpdates: () => Promise<boolean>
  applyUpdate: (options?: { force?: boolean }) => void
  dismissUpdate: () => void
  startPeriodicChecks: (options?: UpdateCheckOptions) => void
  stopPeriodicChecks: () => void
}

Types

Accessor

type Accessor<T> = () => T

QueryParams

URL query string parameter map (single values or arrays for repeated keys).

type QueryParams = Record<string, string | string[] | undefined>

RouteParams

URL path parameter key-value map extracted from dynamic route segments (e.g. { id: '123' }).

type RouteParams = Record<string, string>

Setter

type Setter<in out T> = {
  <U extends T>(
    ...args: undefined extends T ? [] : [value: Exclude<U, Function> | ((prev: T) => U)]
  ): undefined extends T ? undefined : U
  <U extends T>(value: (prev: T) => U): U
  <U extends T>(value: Exclude<U, Function>): U
  <U extends T>(value: Exclude<U, Function> | ((prev: T) => U)): U
}

Functions

applyThemeToDocument()

Apply theme CSS variables to document.

function applyThemeToDocument(): void

createAsyncState(initialState)

Primitive like createSignal but accepts Promises and supports partial state extension.

function createAsyncState(initialState: T): CreateAsyncStateReturn<T>
  • initialState — Initial state value

Returns: The created instance.

createAuth()

Create auth primitives for authentication state and actions.

function createAuth(): AuthPrimitives<T>

Returns: Auth primitives object

createAuthFromClient(client)

Create auth primitives from a specific client.

function createAuthFromClient(client: AuthClient<T>): AuthPrimitives<T>
  • client — Auth client

Returns: Auth primitives

createAuthGuard(redirectTo)

Create a guard primitive that redirects unauthenticated users.

function createAuthGuard(redirectTo: string): Accessor<boolean>
  • redirectTo — Path to redirect to

Returns: Accessor indicating if user is allowed

createAuthHelpers()

Creates a auth helpers.

function createAuthHelpers(): {
  login: (credentials: LoginCredentials) => Promise<AuthResult<T>>
  logout: () => Promise<void>
  register: (data: RegisterData) => Promise<AuthResult<T>>
  refresh: () => Promise<AuthResult<T>>
  getUser: () => T | null
  getToken: () => string | null
  isAuthenticated: () => boolean
}

Returns: The created result.

createCapacitorApp(options)

Create Capacitor app primitives for native app initialization.

Wraps the core createCapacitorApp coordinator with Solid signals, automatically initializing and cleaning up on disposal.

function createCapacitorApp(options?: CapacitorAppOptions): CapacitorAppPrimitives
  • options — Capacitor app configuration options.

Returns: Capacitor app primitives object

createChangePassword()

Creates a change password primitive with async state tracking.

function createChangePassword(): CreateChangePasswordReturn

Returns: Change password state and action

createDevice()

Create device primitives for accessing device information.

This is a static primitive (no reactive signals) since device info does not change during the lifecycle of the app.

function createDevice(): DevicePrimitives

Returns: Device primitives object

createFieldSignal(controller, name)

Create a reactive accessor for a single field's state.

function createFieldSignal(
  controller: FormController<T>,
  name: keyof T,
): Accessor<FieldState<T[keyof T]>>
  • controller — Form controller
  • name — Field name to track

Returns: Accessor for the field state

createForm(provider, options)

Create form primitives for form state management and validation.

function createForm(provider: FormProvider, options: FormOptions<T>): CreateFormResult<T>
  • provider — Form provider that creates controllers
  • options — Form configuration options

Returns: Form primitives object

createFormFromController(controller)

Create form primitives from an existing controller.

Useful when you have a controller created externally and want to wrap it with Solid reactivity.

function createFormFromController(controller: FormController<T>): CreateFormResult<T>
  • controller — An existing FormController

Returns: Form primitives object

createFormHelpers(provider)

Creates a form helpers.

function createFormHelpers(provider: FormProvider): {
  createForm: <T extends Record<string, unknown>>(options: FormOptions<T>) => CreateFormResult<T>
}
  • provider — The provider implementation.

Returns: The created result.

createHttp()

Creates a http.

function createHttp(): {
  get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>
  post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>
  request: <T>(config: FullRequestConfig) => Promise<HttpResponse<T>>
}

Returns: The created result.

createHttpFromClient(client)

Creates a http from client.

function createHttpFromClient(client: HttpClient): {
  get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>
  post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>
  request: <T>(config: FullRequestConfig) => Promise<HttpResponse<T>>
}
  • client — The client instance.

Returns: The created result.

createHttpHelpers()

Creates a http helpers.

function createHttpHelpers(): {
  get: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>
  post: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  put: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  patch: <T>(url: string, data?: unknown, config?: RequestConfig) => Promise<HttpResponse<T>>
  delete: <T>(url: string, config?: RequestConfig) => Promise<HttpResponse<T>>
  setAuthToken: (token: string | null) => void
  getAuthToken: () => string | null
}

Returns: The created result.

createI18n()

Creates a i18n.

function createI18n(): {
  t: TranslateFunction
  locale: Accessor<string>
  setLocale: (newLocale: string) => Promise<void>
  isReady: Accessor<boolean>
  getLocales: () => LocaleConfig[]
  hasKey: (key: string) => boolean
}

Returns: The created result.

createI18nFromProvider(provider)

Creates a i18n from provider.

function createI18nFromProvider(provider: I18nProvider): {
  t: TranslateFunction
  locale: Accessor<string>
  setLocale: (newLocale: string) => Promise<void>
  isReady: Accessor<boolean>
  getLocales: () => LocaleConfig[]
  hasKey: (key: string) => boolean
}
  • provider — The provider implementation.

Returns: The created result.

createI18nHelpers()

Creates a i18n helpers.

function createI18nHelpers(): {
  t: TranslateFunction
  getLocale: () => string
  setLocale: (locale: string) => Promise<void>
  getLocales: () => LocaleConfig[]
  hasKey: (key: string) => boolean
  isReady: () => boolean
}

Returns: The created result.

createIsActive(path, exact)

Create a reactive boolean accessor that tracks whether a given path is active.

Unlike useMatch which only accepts a static pattern, this factory returns a signal that re-evaluates on every route change and supports the exact parameter from the router's isActive method.

function createIsActive(path: string, exact?: boolean): Accessor<boolean>
  • path — Path to check against the current location
  • exact — Whether to require an exact match (default: false)

Returns: Accessor that is true when the path is active

createLogger(config)

Create a logger with custom configuration.

function createLogger(config: LoggerConfig): Logger
  • config — Logger configuration

Returns: Logger instance

createLoggerFromProvider(provider, name)

Create logger from a specific provider.

function createLoggerFromProvider(provider: LoggerProvider, name?: string): Logger
  • provider — Logger provider
  • name — Logger name

Returns: Logger instance

createLoggerHelpers()

Creates a logger helpers.

function createLoggerHelpers(): {
  getLogger: (name?: string) => Logger
  createLogger: (config: LoggerConfig) => Logger
  setLevel: (level: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent') => void
  getLevel: () => string
  enable: () => void
  disable: () => void
  isEnabled: () => boolean
}

Returns: The created result.

createLoggerHelpersFromProvider(provider)

Creates a logger helpers from provider.

function createLoggerHelpersFromProvider(provider: LoggerProvider): {
  getLogger: (name?: string) => Logger
  createLogger: (config: LoggerConfig) => Logger
  setLevel: (level: 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'silent') => void
  getLevel: () => string
  enable: () => void
  disable: () => void
  isEnabled: () => boolean
}
  • provider — The provider implementation.

Returns: The created result.

createLogin()

Creates a login primitive with async state tracking.

function createLogin(): CreateLoginReturn<T>

Returns: Login state and action

createOAuth(options)

Creates OAuth helpers.

Automatically handles OAuth callbacks by detecting code and state URL parameters and exchanging them for a session:

  • Inside a Solid owner (component setup / createRoot), the callback handling is deferred to onMount so it runs client-side after mount.
  • Outside an owner (a plain function call, e.g. bootstrap code), it runs immediately at creation, browser-guarded.
function createOAuth(options?: CreateOAuthOptions): CreateOAuthReturn
  • options — OAuth configuration

Returns: The created instance.

createPasswordReset()

Creates a password reset primitive with async state tracking.

function createPasswordReset(): CreatePasswordResetReturn

Returns: Password reset state and actions

createPersistedStore(key, initial, storage)

Create a persisted signal store.

function createPersistedStore(
  key: string,
  initial: T,
  storage: StorageAdapter,
): [Accessor<T>, (value: T | ((prev: T) => T)) => void]
  • key — Storage key
  • initial — Initial value
  • storage — Storage adapter (required - use localStorage, sessionStorage, or @molecule/app-storage)

Returns: Tuple of accessor and setter

createPlatform()

Create platform primitives for detecting the current platform.

This is a static primitive (no reactive signals) since the platform does not change during the lifecycle of the app.

function createPlatform(): PlatformPrimitives

Returns: Platform primitives object

createPromise(asyncFn)

Primitive that wraps an async function with reactive state tracking.

function createPromise(asyncFn: T): CreatePromiseReturn<Awaited<ReturnType<T>>>
  • asyncFn — The async function to wrap

Returns: Object with state accessor, call, cancel, and reset functions

createPush()

Create push notification primitives.

function createPush(): PushPrimitives

Returns: Push primitives object

createRouter()

Create router primitives for navigation state and actions.

function createRouter(): RouterPrimitives

Returns: Router primitives object

createRouterFromInstance(router)

Create router primitives from a specific router.

function createRouterFromInstance(router: Router): RouterPrimitives
  • router — Router instance

Returns: Router primitives

createRouterHelpers()

Creates a router helpers.

function createRouterHelpers(): {
  navigate: (path: string, options?: NavigateOptions) => void
  navigateTo: (
    name: string,
    params?: RouteParams,
    query?: QueryParams,
    options?: NavigateOptions,
  ) => void
  back: () => void
  forward: () => void
  getLocation: () => RouteLocation
  getParams: () => RouteParams
  getQuery: () => QueryParams
  isActive: (path: string) => boolean
}

Returns: The created result.

createSignalStore(initial)

Create a simple signal-based store without provider.

function createSignalStore(initial: T): [Accessor<T>, (value: T | ((prev: T) => T)) => void]
  • initial — Initial state

Returns: The created instance.

createSignup()

Creates a signup primitive with async state tracking.

function createSignup(): CreateSignupReturn<T>

Returns: Signup state and action

createStateHelpers()

Creates a state helpers.

function createStateHelpers(): {
  createStore: <T extends object>(config: StoreConfig<T>) => Store<T>
}

Returns: The created result.

createStateHelpersFromProvider(provider)

Creates a state helpers from provider.

function createStateHelpersFromProvider(provider: StateProvider): {
  createStore: <T extends object>(config: StoreConfig<T>) => Store<T>
}
  • provider — The provider implementation.

Returns: The created result.

createStorage()

Create storage primitives.

function createStorage(): {
  get: <T>(key: string) => Promise<T | null>
  set: <T>(key: string, value: T) => Promise<void>
  remove: (key: string) => Promise<void>
  clear: () => Promise<void>
  keys: () => Promise<string[]>
}

Returns: Storage methods

createStorageFromProvider(storage)

Create storage primitives from a specific provider.

function createStorageFromProvider(storage: StorageProvider): {
  get: <T>(key: string) => Promise<T | null>
  set: <T>(key: string, value: T) => Promise<void>
  remove: (key: string) => Promise<void>
  clear: () => Promise<void>
  keys: () => Promise<string[]>
}
  • storage — Storage provider

Returns: Storage methods

createStorageHelpers()

Create storage helpers from context.

function createStorageHelpers(): {
  get: <T>(key: string) => Promise<T | null>
  set: <T>(key: string, value: T) => Promise<void>
  remove: (key: string) => Promise<void>
  clear: () => Promise<void>
  keys: () => Promise<string[]>
}

Returns: Storage helper functions

createStorageValue(key, defaultValue)

Create a storage value primitive.

function createStorageValue(
  key: string,
  defaultValue?: T,
): {
  value: () => T | undefined
  loading: () => boolean
  error: () => Error | null
  set: (value: T) => Promise<void>
  remove: () => Promise<void>
  refresh: () => Promise<T | undefined>
}
  • key — Storage key
  • defaultValue — Default value if not found

Returns: Storage value accessor and actions

createStorageValueFromProvider(storage, key, defaultValue)

Create storage value primitive from a specific provider.

function createStorageValueFromProvider(
  storage: StorageProvider,
  key: string,
  defaultValue?: T,
): {
  value: () => T | undefined
  loading: () => boolean
  error: () => Error | null
  set: (value: T) => Promise<void>
  remove: () => Promise<void>
}
  • storage — Storage provider
  • key — Storage key
  • defaultValue — Default value

Returns: Storage value accessor and actions

createStore(config)

Create a reactive store using Solid signals.

function createStore(config: StoreConfig<T>): Store<T>
  • config — Store configuration

Returns: Store instance

createTheme()

Create theme primitives for theme state and actions.

function createTheme(): ThemePrimitives

Returns: The created instance.

createThemeColors(theme)

Create a colors accessor derived from a theme accessor.

function createThemeColors(theme: Accessor<Theme>): Accessor<ThemeColors>
  • theme — Theme accessor (e.g. from createTheme().theme)

Returns: Accessor for the current theme colors

createThemeFromProvider(provider)

Create theme primitives from a specific provider.

function createThemeFromProvider(provider: ThemeProvider): ThemePrimitives
  • provider — Theme provider

Returns: Theme primitives

createThemeHelpers()

Creates a theme helpers.

function createThemeHelpers(): {
  getTheme: () => Theme
  setTheme: (name: string) => void
  getMode: () => 'light' | 'dark'
  toggleMode: () => void
  getAvailableThemes: () => Theme[]
}

Returns: The created result.

createVersion()

Create version primitives for tracking app updates.

function createVersion(): VersionPrimitives

Returns: Version primitives object

createWatchSignal(controller, name)

Create a reactive accessor that tracks a single field's value.

function createWatchSignal(controller: FormController<T>, name: K): Accessor<T[K]>
  • controller — Form controller
  • name — Field name to watch

Returns: Accessor for the field value

getAuthClient()

Get the auth client from context.

function getAuthClient(): AuthClient<T>

Returns: The auth client instance.

getChildLogger(name, context)

Create a child logger with additional context.

function getChildLogger(name: string, context: Record<string, unknown>): Logger
  • name — Parent logger name
  • context — Additional context

Returns: Child logger instance

getHttpClient()

Get the HTTP client from context.

function getHttpClient(): HttpClient

Returns: The HTTP client instance.

getI18nProvider()

Get the i18n provider from context.

function getI18nProvider(): I18nProvider

Returns: The i18n provider instance.

getLogger(name)

Get a logger instance.

function getLogger(name?: string): Logger
  • name — Logger name

Returns: Logger instance

getLoggerProvider()

Get the logger provider from context.

function getLoggerProvider(): LoggerProvider

Returns: The logger provider instance.

getRootLogger()

Get the root logger.

function getRootLogger(): Logger

Returns: Root logger instance

getRouter()

Get the router from context.

function getRouter(): Router

Returns: The router instance.

getStateProvider()

Get the state provider from context.

function getStateProvider(): StateProvider

Returns: The state provider instance.

getStorageProvider()

Get the storage provider from context.

function getStorageProvider(): StorageProvider

Returns: The storage provider instance.

getThemeProvider()

Get the theme provider from context.

function getThemeProvider(): ThemeProvider

Returns: The theme provider instance.

MoleculeProvider(props)

MoleculeProvider component that provides all molecule services to the component tree.

function MoleculeProvider(props: ParentProps<{ config: MoleculeConfig }>): JSX.Element
  • props — Component props containing the molecule config.

Returns: The nested provider tree wrapping children.

useComponentLogger(componentName)

Create a component logger that includes component name in context.

function useComponentLogger(componentName: string): Logger
  • componentName — Name of the component

Returns: Logger configured for the component

useFetch(url, config)

Create a resource for fetching data.

function useFetch(url: string | Accessor<string>, config?: RequestConfig): Resource<T | undefined>
  • url — URL string or accessor returning a URL string.
  • config — Optional request configuration.

Returns: Solid resource

useLazyQuery()

Hook for lazy query.

function useLazyQuery(): {
  execute: (url: string, config?: RequestConfig) => Promise<T>
  data: () => T | null
  isLoading: () => boolean
  error: () => Error | null
  reset: () => void
}

Returns: The result.

useLocale()

Get current locale as accessor.

function useLocale(): Accessor<string>

Returns: Accessor for current locale

useLocation()

Get current route location as accessor.

function useLocation(): Accessor<RouteLocation>

Returns: Accessor for current location

useMatch(pattern)

Create a match accessor for a path pattern.

function useMatch(pattern: string): Accessor<boolean>
  • pattern — Path pattern to match

Returns: Accessor indicating if current path matches

useMode()

Create a mode accessor.

function useMode(): Accessor<'light' | 'dark'>

Returns: Accessor for current mode

useMutation()

Hook for mutation.

function useMutation(): {
  mutate: (
    url: string,
    payload?: unknown,
    method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE',
  ) => Promise<T>
  isLoading: Accessor<boolean>
  error: Accessor<Error | null>
  data: Accessor<T | null>
  reset: () => void
}

Returns: The result.

useNavigate()

Get navigate function.

function useNavigate(): (path: string, options?: NavigateOptions) => void

Returns: Navigate function

useParams()

Get current route params as accessor.

function useParams(): Accessor<RouteParams>

Returns: Accessor for route params

usePersistedSignal(key, defaultValue)

Create a persisted signal that syncs with storage.

function usePersistedSignal(
  key: string,
  defaultValue: T,
): [Accessor<T | undefined>, (value: T | ((prev: T | undefined) => T)) => void]
  • key — Storage key
  • defaultValue — Default value

Returns: Tuple of accessor and setter

usePlural(key, count, values)

Create a reactive plural translation.

function usePlural(
  key: string,
  count: Accessor<number>,
  values?: InterpolationValues,
): Accessor<string>
  • key — Translation key
  • count — Count accessor for pluralization
  • values — Interpolation values for the translation.

Returns: Accessor for translated string

useQuery()

Get current query params as accessor.

function useQuery(): Accessor<QueryParams>

Returns: Accessor for query params

useStore(store, selector)

Use a store with optional selector, returning an accessor.

function useStore(store: Store<T>, selector?: (state: T) => S): Accessor<S>
  • store — Store to subscribe to
  • selector — Optional selector function

Returns: Accessor for selected state

useThemeName()

Create a theme name accessor.

function useThemeName(): Accessor<string>

Returns: Accessor for current theme name

useTranslate()

Get translate function.

function useTranslate(): TranslateFunction

Returns: Translate function

useTranslation(key, values, options)

Create a reactive translation.

function useTranslation(
  key: string,
  values?: InterpolationValues,
  options?: TranslateOptions,
): Accessor<string>
  • key — Translation key
  • values — Interpolation values for the translation.
  • options — Translation options

Returns: Accessor for translated string

Constants

AuthContext

const AuthContext: Context<AuthClient<unknown> | undefined>

HttpContext

const HttpContext: Context<HttpClient | undefined>

I18nContext

const I18nContext: Context<I18nProvider | undefined>

LoggerContext

const LoggerContext: Context<LoggerProvider | undefined>

RouterContext

const RouterContext: Context<Router | undefined>

StateContext

Internal contexts for molecule providers.

const StateContext: Context<StateProvider | undefined>

StorageContext

const StorageContext: Context<StorageProvider | undefined>

ThemeContext

const ThemeContext: Context<ThemeProvider | undefined>

Injection Notes

Requirements

Peer dependencies:

  • @molecule/app-auth ^1.0.1
  • @molecule/app-device ^1.0.1
  • @molecule/app-forms ^1.0.1
  • @molecule/app-http ^1.0.1
  • @molecule/app-i18n ^1.0.1
  • @molecule/app-logger ^1.0.1
  • @molecule/app-platform ^1.0.1
  • @molecule/app-push ^1.0.1
  • @molecule/app-routing ^1.0.1
  • @molecule/app-state ^1.0.1
  • @molecule/app-storage ^1.0.1
  • @molecule/app-theme ^1.0.1
  • @molecule/app-ui ^1.0.1
  • @molecule/app-utilities ^1.0.1
  • @molecule/app-version ^1.0.1
  • solid-js ^1.8.0

Runtime Dependencies

  • @molecule/app-auth

  • @molecule/app-device

  • @molecule/app-forms

  • @molecule/app-http

  • @molecule/app-i18n

  • @molecule/app-logger

  • @molecule/app-platform

  • @molecule/app-push

  • @molecule/app-routing

  • @molecule/app-state

  • @molecule/app-storage

  • @molecule/app-theme

  • @molecule/app-ui

  • @molecule/app-utilities

  • @molecule/app-version

  • solid-js

  • Primitives throw outside MoleculeProvider — and per missing service. config wires ONLY the services you pass; calling createAuth() in a tree whose config lacks auth throws "getAuthClient must be used within a MoleculeProvider with auth configured". Fix the config, don't catch the error.

  • Primitive results are Solid accessors — call them (isAuthenticated(), theme(), user()), never read them bare; a bare theme.colors is a type error, and a bare isAuthenticated is always truthy.

  • Call primitives at component setup (top level of the component function), not inside JSX callbacks, so subscriptions are established once.

Translations

Translation strings are provided by @molecule/app-locales-solid.