@feugene/granularity-code

Code surfaces for @feugene/granularity: view, edit and diff — the viewer and the diff carry no dependencies at all.
1,191 1
Install
npm install @feugene/granularity-code
Latest Version:2.0.2
Vue:3
License:LicenseRef-Granularity-EUC-1.1
Last Updated:Oct 22, 2026
Links: GitHub  ·  npm
Maintainer: efureev

@feugene/granularity-code

Три действия над кодом в интерфейсе — показать, править, сравнить — одним пакетом дизайн-системы @feugene/granularity.

yarn add @feugene/granularity-code

Этого достаточно: GrCodeBlock и GrDiff не тянут ни одной зависимости. CodeMirror нужен только редактору и объявлен опциональным peer'ом.

Что внутри

Компонент Что делает Зависимости
GrCodeBlock показать: лог, ответ API, конфиг в карточке нет
GrDiff сравнить: что изменилось в записи, между ревизиями нет
GrCodeEditor править: JSON и YAML в админке, шаблон письма CodeMirror 6

Данные, а не код, показывает GrJsonViewer ядра: интерактивный обход чужого unknown с раскрытием веток.

Вес гранулярного импорта

Что берут gzip от бареля
весь пакет из корня 18.8 kB 100 %
самый лёгкий компонент — GrCodeBlock 4.6 kB 24 %
медианный компонент — GrCodeEditor 5.0 kB 27 %
3 самых тяжёлых вместе 14.5 kB 77 %

Числа не складываются: общий код посчитан в каждой строке заново, а платится один раз — поэтому набор компонентов и показан объединением, а не суммой. Это верхняя граница: gzip всего, что подпуть тянет из dist, а бандлер приложения трясёт дальше и минифицирует повторно.

Вес каждого компонента — docs/entry-sizes.md.

Подсветка любого языка — контрактом, а не зависимостью

Пакет объявляет потребность, а не поставщика:

type GrCodeTokenizer = (code: string, language: string) => GrCodeLine[] | Promise<GrCodeLine[]>

Поэтому shiki не появляется ни в зависимостях пакета, ни в импортах типов — привязки к его мажору нет, потому что нет самой связи. Подключить можно Shiki, Prism, серверную подсветку или готовые токены из API:

import { createHighlighter } from 'shiki'
import { createShikiTokenizer, GR_CODE_HIGHLIGHTER_KEY } from '@feugene/granularity-code/highlight'

const shiki = await createHighlighter({ langs: ['ts', 'yaml'], themes: [] })

app.provide(GR_CODE_HIGHLIGHTER_KEY, createShikiTokenizer(shiki))

Не подключён никто — работает встроенный разбор: JSON и обычный текст. Это нормальный режим, а не деградация.

Арифметика без компонентов

@feugene/granularity-code/diff отдаёт дифф чистыми функциями: посчитать сравнение для своего рендера или для отчёта можно без Vue.

import { collapseUnchanged, diffLines } from '@feugene/granularity-code/diff'

const { lines, added, removed, degraded } = diffLines(before, after)

Документация

Лицензия

Apache License 2.0 with an Additional Ethical Use Clause © Evgeniy Fureev

Related Packages

vue-cm

CodeMirror component for Vue.js

969 45
@amoayun/monaco-editor-vue3

A Vue3 component based on monaco-editor, supporting code comparison, two-way dat...

2,922 0
@codemirror/lang-vue

Vue template support for the CodeMirror code editor

71,371,417 29
vue-code-diff

代码比对展示(Code comparison display)

144,054 184
@feugene/granularity-chrono

Calendar, date and time components for the @feugene/granularity design system —...

2,790 1

Version History

Version Released Vue License
2.0.2 ^3.5.0 LicenseRef-Granularity-EUC-1.1
2.0.1 ^3.5.0 LicenseRef-Granularity-EUC-1.1
2.0.0 ^3.5.0 LicenseRef-Granularity-EUC-1.1
1.1.0 ^3.5.0 LicenseRef-Granularity-EUC-1.1
1.0.4 ^3.5.0 LicenseRef-Granularity-EUC-1.1