@overpunch/vf-clamp 2.3.0 → 2.4.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/README.md +10 -9
- package/dist/index.cjs +410 -141
- package/dist/index.d.ts +28 -1
- package/dist/index.js +527 -363
- package/dist/naming.cjs +1 -0
- package/dist/naming.d.ts +149 -0
- package/dist/naming.js +121 -0
- package/package.json +6 -1
package/dist/naming.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function B(t,s){if(t===s)return t;const e=t.split(" "),r=s.split(" ");let a=0;for(;a<e.length&&a<r.length&&e[a]===r[a];)a++;let i=0;for(;i<e.length-a&&i<r.length-a&&e[e.length-1-i]===r[r.length-1-i];)i++;const g=e.slice(0,a).join(" "),l=e.slice(a,e.length-(i||0)).join(" "),p=r.slice(a,r.length-(i||0)).join(" "),d=i>0?e.slice(e.length-i).join(" "):"",x=l&&p?`${l}-${p}`:l||p;return[g,x,d].filter(Boolean).join(" ")}function E(t,s){const e=s.filter(r=>r.name===t);if(!e.length)throw new Error(`Named instance "${t}" not found in font`);if(e.length>1)throw new Error(`Named instance "${t}" is ambiguous: ${e.length} instances share that name`);return e[0]}const D={wght:"Regular",wdth:"Normal",ital:"Upright",slnt:"Upright"};function y(t){return t.toFixed(6).replace(/0+$/,"").replace(/\.$/,"")}function S(t){return(t||"").split(/\s+/).filter(Boolean)}function F(t,s,e,r={}){if(!t.length)return"";if(t.length===1)return t[0].name;const a=Object.fromEntries(e.map(n=>[n.tag,n.default])),i=e.map(n=>n.tag),g=(n,o)=>n.coordinates[o]??a[o],l=i.filter(n=>new Set(s.map(o=>g(o,n))).size>1),p=new Map,d=n=>{if(!p.has(n)){const o=s.filter(m=>S(m.name).includes(n)),f=o.length?l.filter(m=>new Set(o.map(w=>g(w,m))).size===1):[];p.set(n,f.length===1?f[0]:null)}return p.get(n)},x=(n,o)=>{const f=s.filter(m=>g(m,n)===o);return f.length?S(f[0].name).filter(m=>d(m)===n&&f.every(w=>S(w.name).includes(m))).join(" "):""},c=(n,o)=>{var f;return((f=r[n])==null?void 0:f[y(o)])||D[n]||`${n}${y(o)}`},u=n=>new Set(S(n.name).map(d).filter(o=>o!==null)),h=s.filter(n=>u(n).size>1),b=h.length?h:s,L=n=>{const o=b.flatMap(f=>S(f.name).flatMap((m,w)=>d(m)===n?[w]:[]));return o.length?Math.min(...o):1e4},O=[];i.forEach((n,o)=>{const f=[...new Set(t.map($=>g($,n)))].sort(($,M)=>$-M),m=f[0],w=f[f.length-1];let v;if(m===w){if(v=x(n,m),!v)return}else{const $=x(n,m)||c(n,m),M=x(n,w)||c(n,w);v=$===M?$:`${$}-${M}`}O.push([L(n),o,v])}),O.sort((n,o)=>n[0]-o[0]||n[1]-o[1]);const j=S(t[0].name),k=j.filter(n=>d(n)===null&&t.every(o=>S(o.name).includes(n))),A=j.flatMap((n,o)=>d(n)!==null?[o]:[]),z=A.length?Math.min(...A):j.length,P=k.filter(n=>j.indexOf(n)<z),U=k.filter(n=>j.indexOf(n)>=z);return[...P,...O.map(n=>n[2]),...U].join(" ").trim()||`${t[0].name}-${t[t.length-1].name}`}function I(t,s){const e={};for(const r of s){const a=t.map(i=>i.coordinates[r.tag]??r.default);e[r.tag]={min:Math.min(...a),max:Math.max(...a)}}return e}function N(t,s,e,r){return s.filter(a=>e.has(a)?!1:r.every(i=>{const g=a.coordinates[i.tag]??i.default,l=t[i.tag];return!l||g>=l.min&&g<=l.max}))}function K(t){return t.reduce((s,e)=>!s||e.maximum-e.minimum>s.maximum-s.minimum?e:s,void 0)}function R(t,s,e){const{axes:r,instances:a}=t,i=[...new Set(s)].map(c=>E(c,a));if(!i.length)return[];const g=new Set(i);let l;if(!N(I(i,r),a,g,r).length)l=[i];else{l=i.map(u=>[u]);let c=!0;for(;c;){c=!1;n:for(let u=0;u<l.length;u++)for(let h=u+1;h<l.length;h++){const b=[...l[u],...l[h]];if(!N(I(b,r),a,g,r).length){l[u]=b,l.splice(h,1),c=!0;break n}}}}const p=K(r),d=p?[p,...r.filter(c=>c.tag!==p.tag)]:r,x=(c,u)=>{for(const h of d){const b=(c.coordinates[h.tag]??h.default)-(u.coordinates[h.tag]??h.default);if(b)return b}return 0};return l=l.map(c=>[...c].sort(x)).sort((c,u)=>x(c[0],u[0])),l.map(c=>{const u=F(c,a,r,t.labels??{});return{name:e?`${e} ${u}`:u,instances:c.map(h=>h.name)}})}function T(t,s){const e=s.map(r=>E(r,t.instances));return e.length?N(I(e,t.axes),t.instances,new Set(e),t.axes).map(r=>r.name):[]}exports.compactName=B;exports.findInstance=E;exports.numberKey=y;exports.planOutputs=R;exports.rangeName=F;exports.unboughtInstances=T;
|
package/dist/naming.d.ts
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/** One axis defined in the font's fvar table */
|
|
2
|
+
export declare interface AxisDefinition {
|
|
3
|
+
/** Four-character axis tag, e.g. "wght", "wdth" */
|
|
4
|
+
tag: string;
|
|
5
|
+
/** Human-readable axis name from the font's name table */
|
|
6
|
+
name: string;
|
|
7
|
+
/** Minimum value on the axis */
|
|
8
|
+
minimum: number;
|
|
9
|
+
/** Default value (used when axis is not explicitly set) */
|
|
10
|
+
default: number;
|
|
11
|
+
/** Maximum value on the axis */
|
|
12
|
+
maximum: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Restrict an axis to a sub-range — the axis remains variable but clamped to [min, max] */
|
|
16
|
+
declare interface AxisRange {
|
|
17
|
+
/** Minimum value on the axis */
|
|
18
|
+
min: number;
|
|
19
|
+
/** Maximum value on the axis */
|
|
20
|
+
max: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* What to do with one axis when clamping a variable font:
|
|
25
|
+
* - number: pin to that value (axis locked and removed from output design space)
|
|
26
|
+
* - AxisRange: restrict to [min, max] (axis stays variable within that range)
|
|
27
|
+
* - null: omit this axis from the instancer call — axis keeps its full original range
|
|
28
|
+
*
|
|
29
|
+
* Axes not listed in the config also keep their full original range.
|
|
30
|
+
* Note: JS→Python bridge limitations prevent true axis dropping (fonttools' Python `None` semantic).
|
|
31
|
+
*/
|
|
32
|
+
declare type AxisValue = PinnedAxis | AxisRange | null;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Produce a compact display name from the first and last selected instance names.
|
|
36
|
+
* Strips shared leading prefix and trailing suffix tokens, joins differing parts with a dash.
|
|
37
|
+
*
|
|
38
|
+
* Examples:
|
|
39
|
+
* compactName('Inter Light', 'Inter Bold') → 'Inter Light-Bold'
|
|
40
|
+
* compactName('Condensed Thin', 'Condensed Black') → 'Condensed Thin-Black'
|
|
41
|
+
* compactName('Regular', 'Regular') → 'Regular'
|
|
42
|
+
*
|
|
43
|
+
* Canonical implementation — also duplicated in the Python plugins and VS Code webview
|
|
44
|
+
* (both sandboxed contexts that cannot import this package at runtime).
|
|
45
|
+
*/
|
|
46
|
+
export declare function compactName(first: string, last: string): string;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Finds a named instance by name. Throws if it is missing, or if several instances share the name
|
|
50
|
+
* (e.g. "Bold" at two optical sizes), since a name alone can't say which one was bought.
|
|
51
|
+
*/
|
|
52
|
+
export declare function findInstance(name: string, fontInstances: FontInstance[]): FontInstance;
|
|
53
|
+
|
|
54
|
+
/** One named instance from the font's fvar table */
|
|
55
|
+
export declare interface FontInstance {
|
|
56
|
+
/** Instance name from the font's name table, e.g. "Regular", "Bold Condensed" */
|
|
57
|
+
name: string;
|
|
58
|
+
/** Axis coordinates for this instance, e.g. { wght: 400, wdth: 100 } */
|
|
59
|
+
coordinates: Record<string, number>;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Result of getInstances() — describes the full design space of a variable font */
|
|
63
|
+
export declare interface FontInstancesResult {
|
|
64
|
+
/** All variable axes defined in the font */
|
|
65
|
+
axes: AxisDefinition[];
|
|
66
|
+
/** All named instances defined in the font */
|
|
67
|
+
instances: FontInstance[];
|
|
68
|
+
/** The font's family name (typographic family, nameID 16, else nameID 1); used to name outputs that set no name */
|
|
69
|
+
family?: string;
|
|
70
|
+
/** STAT names by axis tag and value key (numberKey), e.g. { wdth: { '100': 'Normal' } }; used for default names */
|
|
71
|
+
labels?: Record<string, Record<string, string>>;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Stable text key for an axis value, identical to number_key() in Python ('100', '87.5'). */
|
|
75
|
+
export declare function numberKey(value: number): string;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* One output variant to produce from the source variable font.
|
|
79
|
+
* Specify instances, axes, or both — instances set the hull, axes override individual tags.
|
|
80
|
+
*/
|
|
81
|
+
export declare interface OutputConfig {
|
|
82
|
+
/** Name for this output — used in ClampResult.name. Defaults to instance range when omitted. */
|
|
83
|
+
name?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Named instances to include. The axis hull (min/max per axis) is computed automatically
|
|
86
|
+
* across all listed instances — producing one variable font that spans exactly that range.
|
|
87
|
+
* Instance names must match the font's fvar name table exactly.
|
|
88
|
+
*/
|
|
89
|
+
instances?: string[];
|
|
90
|
+
/**
|
|
91
|
+
* Explicit axis constraints, applied after any instance hull.
|
|
92
|
+
* Axes listed here override the hull computed from instances for that tag.
|
|
93
|
+
* Axis tags not listed keep their full original range.
|
|
94
|
+
*/
|
|
95
|
+
axes?: Record<string, AxisValue>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Pin an axis at a single value — the axis is locked and removed from the output font's design space */
|
|
99
|
+
declare type PinnedAxis = number;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Groups a customer's selected named instances into clampFont outputs so that no output's range
|
|
103
|
+
* contains a named instance the customer did not select.
|
|
104
|
+
*
|
|
105
|
+
* Selections merge into one output only when their combined range holds no unselected named
|
|
106
|
+
* instance: Regular + Medium + SemiBold + Bold → one output; Regular + Bold alone → two outputs
|
|
107
|
+
* (each pinned to its own instance). Output names come from rangeName() (one range per axis), optionally prefixed
|
|
108
|
+
* with `family`.
|
|
109
|
+
*
|
|
110
|
+
* @param font - The font's axes and named instances, from getInstances()
|
|
111
|
+
* @param selected - Names of the instances the customer bought (must match exactly)
|
|
112
|
+
* @param family - Optional family name to prefix each output name with, e.g. "Encode Sans"
|
|
113
|
+
* @returns OutputConfig entries ready for clampFont(), sorted along the primary axis
|
|
114
|
+
* @throws If a selected name is not a named instance of the font, or names more than one (ambiguous)
|
|
115
|
+
*/
|
|
116
|
+
export declare function planOutputs(font: FontInstancesResult, selected: string[], family?: string): OutputConfig[];
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Default name for a selection of named instances: one range per axis, in the font's own style words
|
|
120
|
+
* ("SemiCondensed-Normal Thin-Light"). TypeScript twin of range_name() in
|
|
121
|
+
* shared/plugin-views/vfclamp_naming.py; both are checked against shared/naming-cases.json, so change
|
|
122
|
+
* them together.
|
|
123
|
+
*
|
|
124
|
+
* Each word is attributed to the one axis that is constant wherever the word appears and varies across
|
|
125
|
+
* the font. An axis that varies in the selection becomes "low-high"; one that doesn't shows its word
|
|
126
|
+
* once, or nothing when that value has no word. A value with no word takes its STAT label, else a
|
|
127
|
+
* default word, else "<tag><value>". Parts follow the order the font's names use; words shared by every
|
|
128
|
+
* selected name and owned by no axis stay before or after them.
|
|
129
|
+
*
|
|
130
|
+
* @param selected - The selected named instances
|
|
131
|
+
* @param instances - Every named instance of the font
|
|
132
|
+
* @param axes - The font's axes (tag and default)
|
|
133
|
+
* @param labels - STAT names by axis tag and numberKey(value), e.g. { wdth: { '100': 'Normal' } }
|
|
134
|
+
*/
|
|
135
|
+
export declare function rangeName(selected: FontInstance[], instances: FontInstance[], axes: Array<{
|
|
136
|
+
tag: string;
|
|
137
|
+
default: number;
|
|
138
|
+
}>, labels?: Record<string, Record<string, string>>): string;
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Lists the named instances that a single output built from `names` would include without being selected,
|
|
142
|
+
* e.g. ['Medium', 'SemiBold'] for Regular + Bold. An empty array means the output is purchase-safe.
|
|
143
|
+
*
|
|
144
|
+
* @param font - The font's axes and named instances, from getInstances()
|
|
145
|
+
* @param names - The instance names one output would hull
|
|
146
|
+
*/
|
|
147
|
+
export declare function unboughtInstances(font: FontInstancesResult, names: string[]): string[];
|
|
148
|
+
|
|
149
|
+
export { }
|
package/dist/naming.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
function W(t, s) {
|
|
2
|
+
if (t === s) return t;
|
|
3
|
+
const e = t.split(" "), r = s.split(" ");
|
|
4
|
+
let a = 0;
|
|
5
|
+
for (; a < e.length && a < r.length && e[a] === r[a]; )
|
|
6
|
+
a++;
|
|
7
|
+
let i = 0;
|
|
8
|
+
for (; i < e.length - a && i < r.length - a && e[e.length - 1 - i] === r[r.length - 1 - i]; )
|
|
9
|
+
i++;
|
|
10
|
+
const g = e.slice(0, a).join(" "), l = e.slice(a, e.length - (i || 0)).join(" "), p = r.slice(a, r.length - (i || 0)).join(" "), d = i > 0 ? e.slice(e.length - i).join(" ") : "", x = l && p ? `${l}-${p}` : l || p;
|
|
11
|
+
return [g, x, d].filter(Boolean).join(" ");
|
|
12
|
+
}
|
|
13
|
+
function z(t, s) {
|
|
14
|
+
const e = s.filter((r) => r.name === t);
|
|
15
|
+
if (!e.length) throw new Error(`Named instance "${t}" not found in font`);
|
|
16
|
+
if (e.length > 1) throw new Error(`Named instance "${t}" is ambiguous: ${e.length} instances share that name`);
|
|
17
|
+
return e[0];
|
|
18
|
+
}
|
|
19
|
+
const B = { wght: "Regular", wdth: "Normal", ital: "Upright", slnt: "Upright" };
|
|
20
|
+
function A(t) {
|
|
21
|
+
return t.toFixed(6).replace(/0+$/, "").replace(/\.$/, "");
|
|
22
|
+
}
|
|
23
|
+
function j(t) {
|
|
24
|
+
return (t || "").split(/\s+/).filter(Boolean);
|
|
25
|
+
}
|
|
26
|
+
function D(t, s, e, r = {}) {
|
|
27
|
+
if (!t.length) return "";
|
|
28
|
+
if (t.length === 1) return t[0].name;
|
|
29
|
+
const a = Object.fromEntries(e.map((n) => [n.tag, n.default])), i = e.map((n) => n.tag), g = (n, o) => n.coordinates[o] ?? a[o], l = i.filter((n) => new Set(s.map((o) => g(o, n))).size > 1), p = /* @__PURE__ */ new Map(), d = (n) => {
|
|
30
|
+
if (!p.has(n)) {
|
|
31
|
+
const o = s.filter((m) => j(m.name).includes(n)), f = o.length ? l.filter((m) => new Set(o.map((w) => g(w, m))).size === 1) : [];
|
|
32
|
+
p.set(n, f.length === 1 ? f[0] : null);
|
|
33
|
+
}
|
|
34
|
+
return p.get(n);
|
|
35
|
+
}, x = (n, o) => {
|
|
36
|
+
const f = s.filter((m) => g(m, n) === o);
|
|
37
|
+
return f.length ? j(f[0].name).filter((m) => d(m) === n && f.every((w) => j(w.name).includes(m))).join(" ") : "";
|
|
38
|
+
}, c = (n, o) => {
|
|
39
|
+
var f;
|
|
40
|
+
return ((f = r[n]) == null ? void 0 : f[A(o)]) || B[n] || `${n}${A(o)}`;
|
|
41
|
+
}, u = (n) => new Set(j(n.name).map(d).filter((o) => o !== null)), h = s.filter((n) => u(n).size > 1), $ = h.length ? h : s, F = (n) => {
|
|
42
|
+
const o = $.flatMap((f) => j(f.name).flatMap((m, w) => d(m) === n ? [w] : []));
|
|
43
|
+
return o.length ? Math.min(...o) : 1e4;
|
|
44
|
+
}, O = [];
|
|
45
|
+
i.forEach((n, o) => {
|
|
46
|
+
const f = [...new Set(t.map((b) => g(b, n)))].sort((b, M) => b - M), m = f[0], w = f[f.length - 1];
|
|
47
|
+
let v;
|
|
48
|
+
if (m === w) {
|
|
49
|
+
if (v = x(n, m), !v) return;
|
|
50
|
+
} else {
|
|
51
|
+
const b = x(n, m) || c(n, m), M = x(n, w) || c(n, w);
|
|
52
|
+
v = b === M ? b : `${b}-${M}`;
|
|
53
|
+
}
|
|
54
|
+
O.push([F(n), o, v]);
|
|
55
|
+
}), O.sort((n, o) => n[0] - o[0] || n[1] - o[1]);
|
|
56
|
+
const S = j(t[0].name), I = S.filter((n) => d(n) === null && t.every((o) => j(o.name).includes(n))), N = S.flatMap((n, o) => d(n) !== null ? [o] : []), k = N.length ? Math.min(...N) : S.length, L = I.filter((n) => S.indexOf(n) < k), U = I.filter((n) => S.indexOf(n) >= k);
|
|
57
|
+
return [...L, ...O.map((n) => n[2]), ...U].join(" ").trim() || `${t[0].name}-${t[t.length - 1].name}`;
|
|
58
|
+
}
|
|
59
|
+
function y(t, s) {
|
|
60
|
+
const e = {};
|
|
61
|
+
for (const r of s) {
|
|
62
|
+
const a = t.map((i) => i.coordinates[r.tag] ?? r.default);
|
|
63
|
+
e[r.tag] = { min: Math.min(...a), max: Math.max(...a) };
|
|
64
|
+
}
|
|
65
|
+
return e;
|
|
66
|
+
}
|
|
67
|
+
function E(t, s, e, r) {
|
|
68
|
+
return s.filter((a) => e.has(a) ? !1 : r.every((i) => {
|
|
69
|
+
const g = a.coordinates[i.tag] ?? i.default, l = t[i.tag];
|
|
70
|
+
return !l || g >= l.min && g <= l.max;
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
function P(t) {
|
|
74
|
+
return t.reduce((s, e) => !s || e.maximum - e.minimum > s.maximum - s.minimum ? e : s, void 0);
|
|
75
|
+
}
|
|
76
|
+
function _(t, s, e) {
|
|
77
|
+
const { axes: r, instances: a } = t, i = [...new Set(s)].map((c) => z(c, a));
|
|
78
|
+
if (!i.length) return [];
|
|
79
|
+
const g = new Set(i);
|
|
80
|
+
let l;
|
|
81
|
+
if (!E(y(i, r), a, g, r).length)
|
|
82
|
+
l = [i];
|
|
83
|
+
else {
|
|
84
|
+
l = i.map((u) => [u]);
|
|
85
|
+
let c = !0;
|
|
86
|
+
for (; c; ) {
|
|
87
|
+
c = !1;
|
|
88
|
+
n: for (let u = 0; u < l.length; u++)
|
|
89
|
+
for (let h = u + 1; h < l.length; h++) {
|
|
90
|
+
const $ = [...l[u], ...l[h]];
|
|
91
|
+
if (!E(y($, r), a, g, r).length) {
|
|
92
|
+
l[u] = $, l.splice(h, 1), c = !0;
|
|
93
|
+
break n;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const p = P(r), d = p ? [p, ...r.filter((c) => c.tag !== p.tag)] : r, x = (c, u) => {
|
|
99
|
+
for (const h of d) {
|
|
100
|
+
const $ = (c.coordinates[h.tag] ?? h.default) - (u.coordinates[h.tag] ?? h.default);
|
|
101
|
+
if ($) return $;
|
|
102
|
+
}
|
|
103
|
+
return 0;
|
|
104
|
+
};
|
|
105
|
+
return l = l.map((c) => [...c].sort(x)).sort((c, u) => x(c[0], u[0])), l.map((c) => {
|
|
106
|
+
const u = D(c, a, r, t.labels ?? {});
|
|
107
|
+
return { name: e ? `${e} ${u}` : u, instances: c.map((h) => h.name) };
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function C(t, s) {
|
|
111
|
+
const e = s.map((r) => z(r, t.instances));
|
|
112
|
+
return e.length ? E(y(e, t.axes), t.instances, new Set(e), t.axes).map((r) => r.name) : [];
|
|
113
|
+
}
|
|
114
|
+
export {
|
|
115
|
+
W as compactName,
|
|
116
|
+
z as findInstance,
|
|
117
|
+
A as numberKey,
|
|
118
|
+
_ as planOutputs,
|
|
119
|
+
D as rangeName,
|
|
120
|
+
C as unboughtInstances
|
|
121
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@overpunch/vf-clamp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Restrict a variable font's axis ranges to the named styles a customer bought — like CSS clamp() for design space.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
11
|
"import": "./dist/index.js",
|
|
12
12
|
"require": "./dist/index.cjs"
|
|
13
|
+
},
|
|
14
|
+
"./naming": {
|
|
15
|
+
"types": "./dist/naming.d.ts",
|
|
16
|
+
"import": "./dist/naming.js",
|
|
17
|
+
"require": "./dist/naming.cjs"
|
|
13
18
|
}
|
|
14
19
|
},
|
|
15
20
|
"files": [
|