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

@spark-view/spark-utils

v0.4.0

Published

SPARK 工具层 - 常量、符号、Logger 等基础设施

Readme

@spark-view/spark-utils

SPARK 核心工具库 - 提供能力系统、日志、权限和 HTTP 客户端

TypeScript

特性

  • 🔌 能力系统 - 供需解耦的组件通信机制
  • 📝 日志系统 - 多传输器、多级别日志
  • 🔐 权限系统 - 统一的权限检查和过滤
  • 🌐 统一请求层 - 基于拦截器的现代化请求系统
  • 📡 文件加载器 - 基于时间戳的智能缓存
  • 🎯 事件系统 - 类型安全的事件发布订阅

安装

pnpm add @spark-view/spark-utils

快速开始

1. 能力系统

import { defineCapability, provide, lookup } from '@spark-view/spark-utils'
import { useSparkComponent } from '@spark-view/spark-component'

// 定义类型安全的能力键
const USER_SERVICE = defineCapability<{ getUser(id: string): { id: string; name: string } }>('app:user-service')

// 提供能力(在父组件 setup 中)
const { provide: provideCapability } = useSparkComponent({ type: 'provider' })
provideCapability(USER_SERVICE, {
  getUser: (id) => ({ id, name: 'User' })
})

// 消费能力(任意深度子组件 setup 中)
const { consume } = useSparkComponent({ type: 'consumer' })
const service = consume(USER_SERVICE)  // 类型自动推断,null 表示未找到
service?.getUser('1')

特性:

  • ✅ 能力树:通过 parent 链构建层级
  • ✅ 就近查找:沿 parent 链向上查找
  • ✅ 解耦设计:供需互不依赖
  • ✅ 类型安全:完整 TypeScript 支持

2. 日志系统

import { Logger } from '@spark-view/spark-utils'

// 方式 1:简单字符串标签(用于简单脚本或独立模块)
const logger = Logger('MyModule')
logger.info('应用启动')
logger.error('错误', { code: 500 })

// 方式 2:从组件上下文获取应用层提供的 logger(推荐)
const { logger } = useSparkComponent({ type: 'my-comp' })
logger.info('组件初始化')  // 自动使用应用层配置的 logger

// 应用层提供 logger(在 main.ts 或 App.vue 中)
import { createLogger } from '@spark-view/spark-app'
const appLogger = createLogger('App', {
  level: 'info',
  enableRemote: true,  // 生产环境远程上报
  remoteEndpoint: '/api/logs'
})

// 在组件 setup 中通过 SPARK 能力系统提供
import { LOGGER, APP_SERVICES } from '@spark-view/spark-utils'
const { provide: provideCapability } = useSparkComponent({ type: 'app-root' })
// 方式 1:直接覆盖 logger
provideCapability(LOGGER, appLogger)
// 方式 2:通过 APP_SERVICES 提供(推荐,同时提供 router 等)
provideCapability(APP_SERVICES, { logger: appLogger, router: /* 路由实例 */ undefined })

特性:

  • ✅ 多级别:debug、info、warn、error
  • ✅ 应用层统一配置:全局日志级别、传输器、格式
  • ✅ 继承支持:子组件自动继承应用层 logger
  • ✅ 多种传输器:console、HTTP(远程上报)、custom
  • ✅ 生产环境支持:远程日志上报、错误追踪

推荐架构

  1. 应用层(main.ts)创建全局 logger 并配置传输器
  2. 通过 APP_SERVICES 或直接 provide('logger') 提供
  3. 组件通过 useSparkComponent 获取 logger
  4. 所有日志统一格式、统一管理

3. 权限系统

import { 
  createPermissionChecker, 
  createPermissionFilter,
  createFieldRenderHelper
} from '@spark-view/spark-utils'

// 权限检查
const checker = createPermissionChecker()
const canDelete = checker.canDelete(row)
const canEdit = checker.canEdit(row)

// 权限过滤
const filter = createPermissionFilter()
const deletableRows = filter.filterDeletableRows(rows)

// 字段渲染
const helper = createFieldRenderHelper()
const states = helper.computeFieldStates(fields, row)

4. 统一请求层

import { 
  createRequest,
  createAuthInterceptor,
  createStandardApiInterceptor
} from '@spark-view/spark-utils'

// 创建请求实例
const request = createRequest({
  baseURL: '/api',
  timeout: 10000
})

// 配置拦截器
request.interceptors.request.use(
  createAuthInterceptor(() => localStorage.getItem('token'))
)
request.interceptors.response.use(
  createStandardApiInterceptor()
)

// 发起请求
const users = await request.get('/users')
const newUser = await request.post<User>('/users', { name: 'John' })

特性:

  • ✅ 拦截器系统:请求/响应双向拦截
  • ✅ 自动重试:支持配置重试次数和延迟
  • ✅ 内置缓存:GET 请求自动缓存
  • ✅ 超时控制:基于 AbortController
  • ✅ 9 个预设拦截a器:认证、租户、日志、错误处理等
  • ✅ TypeScript 类型安全

完整指南: REQUEST_GUIDE.md

5. 文件加载器

import { createFileLoader } from '@spark-view/spark-utils'

// 创建文件加载器
const loader = createFileLoader({
  baseURL: '/config',
  storage: 'localStorage'
})

// 加载文件(带时间戳缓存)
const config = await loader.load('app.json', { timestamp: 123456 })

// 批量加载
const [rule, pageData] = await loader.loadMultiple([
  { url: 'rule.json', options: { timestamp: 123456 } },
  { url: 'pagedata.json', options: { timestamp: 789012 } }
])

特性:

  • ✅ 时间戳缓存:前端带 timestamp,后端判断变化
  • ✅ 自动降级:网络失败自动使用缓存
  • ✅ 三种存储策略:localStorage/sessionStorage/memory
  • ✅ 批量加载:Promise.all 并行加载
  • ✅ 缓存统计:查看缓存命中率

6. 事件系统

import { createEventEmitter } from '@spark-view/spark-utils'

type MyEventMap = {
  'user:login': [user: { id: number; name: string }]
  'user:logout': []
}

const emitter = createEventEmitter<MyEventMap>()
emitter.on('user:login', (user) => console.log(user))
emitter.emit('user:login', { id: 1, name: 'Alice' })

核心模块

| 模块 | 说明 | |------|------| | Capability | 能力系统(Provider/Consumer) | | Logger | 日志系统(多级别、多传输器) | | Permission | 权限系统(检查器、过滤器、渲染助手) | | Request | 统一请求层(拦截a器、重试、缓存) | | FileLoader | 文件加载器(时间戳缓存、自动降级) | | EventEmitter | 事件发射器(类型安全) | | Data Types | 基础数据类型和权限接口 |

数据类型

// 基础数据行
type DataRow<T = unknown> = Record<string, T>

// 组件数据行(带权限)
type ComponentDataRow<T = unknown> = WithInstancePermission<DataRow<T>>

// 实例级权限
interface IInstancePermission {
  allowDelete?: boolean
  editableFields?: string[]
  hiddenFields?: string[]
  maskedFields?: string[]
}

// 模型级权限
interface IModelPermission {
  allowCreate?: boolean
  allowImport?: boolean
  allowExport?: boolean
}

依赖

无外部依赖(纯 TypeScript 实现)

开发命令

pnpm run typecheck   # 类型检查
pnpm run build       # 构建包

License

MIT