@feugene/granularity 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feugene/granularity",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
6
  "**/*.css"
@@ -15,6 +15,10 @@
15
15
  "types": "./types/src/i18n/index.d.ts",
16
16
  "import": "./i18n.js"
17
17
  },
18
+ "./vue": {
19
+ "types": "./types/src/vue/index.d.ts",
20
+ "import": "./vue.js"
21
+ },
18
22
  "./fileValidation": {
19
23
  "types": "./types/src/fileValidation/index.d.ts",
20
24
  "import": "./fileValidation.js"
@@ -0,0 +1,2 @@
1
+ export { createGranularity, defineInstallable, installGranularity, } from './plugin';
2
+ export type { CreateGranularityOptions, GranularityInstallableComponent, GranularityInstallableDirective, } from './plugin';
@@ -0,0 +1,92 @@
1
+ import type { App, Component, Directive, Plugin } from 'vue';
2
+ /**
3
+ * Лёгкий контейнер, который может быть зарегистрирован в Vue:
4
+ * - SFC-компонент (Vue сам компилирует `__name` из имени файла) — достаточно просто передать сам компонент,
5
+ * - SFC-компонент с опциональным `install` (по аналогии с Element Plus / Naive UI),
6
+ * - объект с собственным `install`,
7
+ * - либо объект `{ name, component }`, если имя нужно задать явно.
8
+ */
9
+ export type GranularityInstallableComponent = (Component & {
10
+ name?: string;
11
+ __name?: string;
12
+ install?: (app: App) => void;
13
+ }) | {
14
+ install: (app: App) => void;
15
+ } | {
16
+ name: string;
17
+ component: Component;
18
+ };
19
+ /**
20
+ * Директива — либо пара `{ name, directive }`, либо объект с `install`.
21
+ */
22
+ export type GranularityInstallableDirective = {
23
+ name: string;
24
+ directive: Directive;
25
+ } | {
26
+ install: (app: App) => void;
27
+ };
28
+ export interface CreateGranularityOptions {
29
+ /**
30
+ * Список компонентов для глобальной регистрации.
31
+ * Пакет сам по себе ничего не импортирует — пользователь передаёт сюда только те компоненты,
32
+ * которые ему действительно нужны. За счёт этого tree-shaking остаётся полным.
33
+ */
34
+ components?: GranularityInstallableComponent[];
35
+ /**
36
+ * Список директив. Передавайте ровно те, что нужны, по аналогии с компонентами.
37
+ */
38
+ directives?: GranularityInstallableDirective[];
39
+ /**
40
+ * Произвольные `provide`-значения. Ключи могут быть `symbol` или строкой.
41
+ * Пакет не навязывает конкретные ключи (например, i18n) — выбор за пользователем.
42
+ */
43
+ provides?: Array<{
44
+ key: string | symbol;
45
+ value: unknown;
46
+ }>;
47
+ /**
48
+ * Произвольные `app.config.globalProperties` — по умолчанию ничего не ставим.
49
+ */
50
+ globalProperties?: Record<string, unknown>;
51
+ }
52
+ /**
53
+ * Вспомогательная обёртка: превращает произвольный компонент в `GranularityInstallableComponent`
54
+ * с явным именем регистрации.
55
+ *
56
+ * ```ts
57
+ * import { DsButton } from '@feugene/granularity/components/DsButton'
58
+ * import { defineInstallable } from '@feugene/granularity/vue'
59
+ *
60
+ * const installable = defineInstallable(DsButton, 'DsButton')
61
+ * ```
62
+ */
63
+ export declare function defineInstallable<T extends Component>(component: T, name: string): GranularityInstallableComponent;
64
+ /**
65
+ * Применяет опции к переданному приложению. Экспортируется отдельно от фабрики —
66
+ * удобно, когда плагин не нужен (например, в тестах).
67
+ */
68
+ export declare function installGranularity(app: App, options?: CreateGranularityOptions): void;
69
+ /**
70
+ * Создаёт Vue-плагин `{ install }`, который при `app.use(...)` зарегистрирует переданные
71
+ * компоненты, директивы и provide-значения. Сам модуль НЕ импортирует ни компонентов,
72
+ * ни директив из пакета — всё приходит снаружи. Это сохраняет гранулярность:
73
+ * бандлер увидит только те символы, которые вы реально передали.
74
+ *
75
+ * ```ts
76
+ * import { createApp } from 'vue'
77
+ * import { createGranularity } from '@feugene/granularity/vue'
78
+ * import { DsButton } from '@feugene/granularity/components/DsButton'
79
+ * import { DsInput } from '@feugene/granularity/components/DsInput'
80
+ * import { vHotkey } from '@feugene/granularity/directives/hotkey'
81
+ *
82
+ * createApp(App)
83
+ * .use(createGranularity({
84
+ * // Достаточно передать сами компоненты — имя будет взято из `__name` (Vue SFC)
85
+ * // или из `name`; можно также указать явно через `{ name, component }`.
86
+ * components: [DsButton, DsInput],
87
+ * directives: [{ name: 'hotkey', directive: vHotkey }],
88
+ * }))
89
+ * .mount('#app')
90
+ * ```
91
+ */
92
+ export declare function createGranularity(options?: CreateGranularityOptions): Plugin;
package/dist/vue.js ADDED
@@ -0,0 +1,43 @@
1
+ //#region src/vue/plugin.ts
2
+ function e(e, t) {
3
+ return { install(n) {
4
+ n.component(t, e);
5
+ } };
6
+ }
7
+ function t(e, t) {
8
+ if (typeof t.install == "function") {
9
+ t.install(e);
10
+ return;
11
+ }
12
+ if (typeof t.name == "string" && t.component && typeof t.component == "object") {
13
+ let { name: n, component: r } = t;
14
+ e.component(n, r);
15
+ return;
16
+ }
17
+ let n = t.name ?? t.__name;
18
+ if (n) {
19
+ e.component(n, t);
20
+ return;
21
+ }
22
+ console.warn("[granularity] component passed to createGranularity has no `install`, `name`, or `__name` — skipped.");
23
+ }
24
+ function n(e, t) {
25
+ if ("install" in t && typeof t.install == "function") {
26
+ t.install(e);
27
+ return;
28
+ }
29
+ "name" in t && "directive" in t && e.directive(t.name, t.directive);
30
+ }
31
+ function r(e, r = {}) {
32
+ for (let n of r.components ?? []) t(e, n);
33
+ for (let t of r.directives ?? []) n(e, t);
34
+ for (let { key: t, value: n } of r.provides ?? []) e.provide(t, n);
35
+ if (r.globalProperties) for (let [t, n] of Object.entries(r.globalProperties)) e.config.globalProperties[t] = n;
36
+ }
37
+ function i(e = {}) {
38
+ return { install(t) {
39
+ r(t, e);
40
+ } };
41
+ }
42
+ //#endregion
43
+ export { i as createGranularity, e as defineInstallable, r as installGranularity };
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@feugene/granularity",
3
3
  "description": "Granularity design system package with Vue 3 components, styles, and UnoCSS preset.",
4
- "version": "0.1.0",
5
- "license": "Apache-2.0",
4
+ "version": "0.2.0",
5
+ "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
7
7
  "name": "Evgeniy Fureev",
8
8
  "url": "https://github.com/efureev"
@@ -57,6 +57,10 @@
57
57
  "types": "./dist/types/src/i18n/index.d.ts",
58
58
  "import": "./dist/i18n.js"
59
59
  },
60
+ "./vue": {
61
+ "types": "./dist/types/src/vue/index.d.ts",
62
+ "import": "./dist/vue.js"
63
+ },
60
64
  "./fileValidation": {
61
65
  "types": "./dist/types/src/fileValidation/index.d.ts",
62
66
  "import": "./dist/fileValidation.js"