@gumbee/utils 1.0.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026-present Mugeeb Hassan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # @gumbee/utils
2
+
3
+ <div align="left">
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@gumbee/utils.svg)](https://www.npmjs.com/package/@gumbee/utils)
6
+ [![License](https://img.shields.io/npm/l/@gumbee/utils.svg)](package.json)
7
+
8
+ </div>
9
+
10
+ @gumbee/utils is a collection of shared utilities designed primarily for the [Gumbee](https://github.com/Gumbee/gumbee) ecosystem. It provides essential helpers for logging, math operations, and other common tasks used across Gumbee packages.
11
+
12
+ While this package is intended for internal use within the Gumbee codebase, it is published publicly and can be used in other projects if found useful.
13
+
14
+ The canonical source tree and bug trackers are available on [GitHub](https://github.com/Gumbee/gumbee).
15
+ For license information, see [LICENSE](LICENSE) (MIT).
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ bun add @gumbee/utils
21
+ # npm install @gumbee/utils
22
+ # pnpm add @gumbee/utils
23
+ # yarn add @gumbee/utils
24
+ ```
25
+
26
+ ## Documentation
27
+
28
+ - [Logging](docs/LOGGING.md) - Styled console logging with colored owner labels and environment-aware filtering.
29
+ - [Math](docs/MATH.md) - Numeric utilities for common calculations.
30
+
31
+ ## Configuration
32
+
33
+ The logging utility supports environment-aware filtering using the `LOG_WHITELIST` environment variable (or framework-specific equivalents like `NEXT_PUBLIC_LOG_WHITELIST` or `VITE_LOG_WHITELIST`). See [Logging](docs/LOGGING.md#configuration) for details.
34
+
35
+ ## Development
36
+
37
+ For build information, check the `package.json` scripts.
38
+ This package is part of the Gumbee ecosystem of packages used by myself to build various personal projects and ideas.
39
+
40
+ To report bugs or submit patches please use [GitHub issues](https://github.com/gumbee/utils/issues).
41
+
42
+ ## Releasing
43
+
44
+ This package uses [changesets](https://github.com/changesets/changesets) for version management and GitHub Actions for automated publishing.
45
+
46
+ ### Creating a Changeset
47
+
48
+ When you make changes that should be released, create a changeset:
49
+
50
+ ```bash
51
+ bun changeset
52
+ ```
53
+
54
+ This will prompt you to:
55
+
56
+ 1. Select the type of change (patch, minor, major)
57
+ 2. Write a summary of the changes
58
+
59
+ Commit the generated changeset file (in `.changeset/`) with your changes.
60
+
61
+ ### Publishing a Release
62
+
63
+ When ready to release:
64
+
65
+ ```bash
66
+ # 1. Apply changesets to bump version and update CHANGELOG
67
+ bun run version
68
+
69
+ # 2. Commit the version bump
70
+ git add .
71
+ git commit -m "chore: release v1.x.x"
72
+
73
+ # 3. Create and push the tag
74
+ git tag v1.x.x
75
+ git push origin main --tags
76
+ ```
77
+
78
+ The GitHub Actions workflow will automatically build, test, and publish to npm when the tag is pushed.
package/dist/index.cjs ADDED
@@ -0,0 +1,173 @@
1
+ var import_node_module = require("node:module");
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __moduleCache = /* @__PURE__ */ new WeakMap;
7
+ var __toCommonJS = (from) => {
8
+ var entry = __moduleCache.get(from), desc;
9
+ if (entry)
10
+ return entry;
11
+ entry = __defProp({}, "__esModule", { value: true });
12
+ if (from && typeof from === "object" || typeof from === "function")
13
+ __getOwnPropNames(from).map((key) => !__hasOwnProp.call(entry, key) && __defProp(entry, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ }));
17
+ __moduleCache.set(from, entry);
18
+ return entry;
19
+ };
20
+ var __export = (target, all) => {
21
+ for (var name in all)
22
+ __defProp(target, name, {
23
+ get: all[name],
24
+ enumerable: true,
25
+ configurable: true,
26
+ set: (newValue) => all[name] = () => newValue
27
+ });
28
+ };
29
+
30
+ // src/index.ts
31
+ var exports_src = {};
32
+ __export(exports_src, {
33
+ logWarn: () => logWarn,
34
+ logError: () => logError,
35
+ log: () => log,
36
+ clamp: () => clamp,
37
+ Emitter: () => Emitter
38
+ });
39
+ module.exports = __toCommonJS(exports_src);
40
+
41
+ // src/math.ts
42
+ var clamp = (value, min, max) => {
43
+ return Math.min(Math.max(value, min), max);
44
+ };
45
+ // src/log.ts
46
+ var colors = [
47
+ { primary: "#003f5c", text: "white" },
48
+ { primary: "#2f4b7c", text: "white" },
49
+ { primary: "#665191", text: "white" },
50
+ { primary: "#a05195", text: "white" },
51
+ { primary: "#d45087", text: "white" },
52
+ { primary: "#f95d6a", text: "white" },
53
+ { primary: "#ff7c43", text: "black" },
54
+ { primary: "#ffa600", text: "black" },
55
+ { primary: "#ffc600", text: "black" }
56
+ ];
57
+ var hash = (str) => {
58
+ let hash2 = 0;
59
+ for (let i = 0;i < str.length; i++) {
60
+ const char = str.charCodeAt(i);
61
+ hash2 = (hash2 << 5) - hash2 + char;
62
+ hash2 = hash2 & hash2;
63
+ }
64
+ return Math.abs(hash2);
65
+ };
66
+ var getColor = (str) => {
67
+ const colorIndex = hash(str) % colors.length;
68
+ return colors[colorIndex];
69
+ };
70
+ var getLogWhitelist = () => {
71
+ const whitelist = process.env.NEXT_PUBLIC_LOG_WHITELIST || process.env.VITE_LOG_WHITELIST || process.env.LOG_WHITELIST;
72
+ return whitelist?.split(",").map((s) => s.trim().toLowerCase()) || [];
73
+ };
74
+ var isProduction = () => {
75
+ return false;
76
+ };
77
+ var matchesPattern = (owner, pattern) => {
78
+ const ownerSegments = owner.toLowerCase().split(".");
79
+ const patternSegments = pattern.split(".");
80
+ if (patternSegments.length > ownerSegments.length) {
81
+ return false;
82
+ }
83
+ for (let i = 0;i < patternSegments.length; i++) {
84
+ const patternSegment = patternSegments[i];
85
+ const ownerSegment = ownerSegments[i];
86
+ if (patternSegment === "*") {
87
+ continue;
88
+ }
89
+ if (patternSegment !== ownerSegment) {
90
+ return false;
91
+ }
92
+ }
93
+ return true;
94
+ };
95
+ var shouldLog = (owners) => {
96
+ if (!isProduction()) {
97
+ return true;
98
+ }
99
+ const whitelist = getLogWhitelist();
100
+ if (whitelist.length === 0) {
101
+ return false;
102
+ }
103
+ const ownerPath = owners.join(".");
104
+ return whitelist.some((pattern) => matchesPattern(ownerPath, pattern));
105
+ };
106
+ var buildOwnerLabels = (owners) => {
107
+ const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
108
+ if (isBrowser) {
109
+ const labels2 = [];
110
+ const styles = [];
111
+ for (const ownerName of owners) {
112
+ const color = getColor(ownerName);
113
+ labels2.push(`%c ${ownerName.toUpperCase()} `);
114
+ styles.push(`background: ${color.primary}; color: ${color.text}; padding: 2px 0px; border-radius: 4px; font-weight: semibold; font-size: 0.8em; margin-right: 4px;`);
115
+ }
116
+ return [labels2.join(""), ...styles];
117
+ }
118
+ const labels = [];
119
+ for (const ownerName of owners) {
120
+ labels.push(`\x1B[36m[${ownerName.toUpperCase()}]\x1B[0m`);
121
+ }
122
+ return [labels.join(" ")];
123
+ };
124
+ function log(owner, ...messages) {
125
+ const owners = Array.isArray(owner) ? owner : [owner];
126
+ if (!shouldLog(owners)) {
127
+ return;
128
+ }
129
+ const [label, ...styles] = buildOwnerLabels(owners);
130
+ console.log(label, ...styles, ...messages);
131
+ }
132
+ function logError(owner, ...messages) {
133
+ const owners = Array.isArray(owner) ? owner : [owner];
134
+ const [label, ...styles] = buildOwnerLabels(owners);
135
+ console.error(label, ...styles, ...messages);
136
+ }
137
+ function logWarn(owner, ...messages) {
138
+ const owners = Array.isArray(owner) ? owner : [owner];
139
+ const [label, ...styles] = buildOwnerLabels(owners);
140
+ console.warn(label, ...styles, ...messages);
141
+ }
142
+ // src/events.ts
143
+ class Emitter {
144
+ #events = {};
145
+ on(event, listener) {
146
+ if (!this.#events[event])
147
+ this.#events[event] = [];
148
+ this.#events[event].push(listener);
149
+ return () => this.off(event, listener);
150
+ }
151
+ once(event, listener) {
152
+ const wrappedListener = (args) => {
153
+ listener(args);
154
+ this.off(event, wrappedListener);
155
+ };
156
+ this.on(event, wrappedListener);
157
+ }
158
+ off(event, listener) {
159
+ if (!this.#events[event])
160
+ return;
161
+ if (listener) {
162
+ this.#events[event] = this.#events[event].filter((l) => l !== listener);
163
+ } else {
164
+ this.#events[event] = [];
165
+ }
166
+ }
167
+ emit(event, args) {
168
+ this.#events[event]?.forEach((listener) => listener(args));
169
+ }
170
+ destroy() {
171
+ this.#events = {};
172
+ }
173
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Clamps a value between a minimum and maximum value.
3
+ *
4
+ * @param value - The value to clamp
5
+ * @param min - The minimum allowed value
6
+ * @param max - The maximum allowed value
7
+ * @returns The clamped value
8
+ */
9
+ declare const clamp: (value: number, min: number, max: number) => number;
10
+ /**
11
+ * Log a message to the console. Will display a colored label with the owner(s) name.
12
+ * Automatically skips logging in production unless the owner path matches a whitelist pattern.
13
+ *
14
+ * Owner can be specified as a dot-separated string (e.g., `api.auth.login`) or as an array
15
+ * of segments (e.g., `["api", "auth", "login"]`) which will be joined with dots.
16
+ *
17
+ * See {@link shouldLog} for whitelist pattern details.
18
+ *
19
+ * @param owner - The owner path (e.g., `api.auth` or `["api", "auth"]`).
20
+ * @param messages - The messages to log
21
+ */
22
+ declare function log(owner: string | string[], ...messages: unknown[]): void;
23
+ /**
24
+ * Log an error message to the console. Will display a colored label with the owner(s) name.
25
+ * Always logs regardless of environment (not subject to whitelisting).
26
+ *
27
+ * Owner can be specified as a dot-separated string (e.g., `api.auth.login`) or as an array
28
+ * of segments (e.g., `["api", "auth", "login"]`) which will be joined with dots.
29
+ *
30
+ * @param owner - The owner path (e.g., `api.auth` or `["api", "auth"]`).
31
+ * @param messages - The messages to log
32
+ */
33
+ declare function logError(owner: string | string[], ...messages: unknown[]): void;
34
+ /**
35
+ * Log a warning message to the console. Will display a colored label with the owner(s) name.
36
+ * Always logs regardless of environment (not subject to whitelisting).
37
+ *
38
+ * Owner can be specified as a dot-separated string (e.g., `api.auth.login`) or as an array
39
+ * of segments (e.g., `["api", "auth", "login"]`) which will be joined with dots.
40
+ *
41
+ * @param owner - The owner path (e.g., `api.auth` or `["api", "auth"]`).
42
+ * @param messages - The messages to log
43
+ */
44
+ declare function logWarn(owner: string | string[], ...messages: unknown[]): void;
45
+ type KeysWithVoidPayload<Events extends Record<string, any>> = { [K in keyof Events] : Events[K] extends void ? K : never }[keyof Events];
46
+ declare class Emitter<Events extends Record<string, any>> {
47
+ private;
48
+ on<K extends keyof Events>(event: K, listener: (args: Events[K]) => void): () => void;
49
+ once<K extends keyof Events>(event: K, listener: (args: Events[K]) => void): void;
50
+ off<K extends keyof Events>(event: K, listener?: (args: Events[K]) => void): void;
51
+ emit<K extends KeysWithVoidPayload<Events>>(event: K): void;
52
+ emit<K extends Exclude<keyof Events, KeysWithVoidPayload<Events>>>(event: K, args: Events[K]): void;
53
+ destroy(): void;
54
+ }
55
+ export { logWarn, logError, log, clamp, Emitter };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Clamps a value between a minimum and maximum value.
3
+ *
4
+ * @param value - The value to clamp
5
+ * @param min - The minimum allowed value
6
+ * @param max - The maximum allowed value
7
+ * @returns The clamped value
8
+ */
9
+ declare const clamp: (value: number, min: number, max: number) => number;
10
+ /**
11
+ * Log a message to the console. Will display a colored label with the owner(s) name.
12
+ * Automatically skips logging in production unless the owner path matches a whitelist pattern.
13
+ *
14
+ * Owner can be specified as a dot-separated string (e.g., `api.auth.login`) or as an array
15
+ * of segments (e.g., `["api", "auth", "login"]`) which will be joined with dots.
16
+ *
17
+ * See {@link shouldLog} for whitelist pattern details.
18
+ *
19
+ * @param owner - The owner path (e.g., `api.auth` or `["api", "auth"]`).
20
+ * @param messages - The messages to log
21
+ */
22
+ declare function log(owner: string | string[], ...messages: unknown[]): void;
23
+ /**
24
+ * Log an error message to the console. Will display a colored label with the owner(s) name.
25
+ * Always logs regardless of environment (not subject to whitelisting).
26
+ *
27
+ * Owner can be specified as a dot-separated string (e.g., `api.auth.login`) or as an array
28
+ * of segments (e.g., `["api", "auth", "login"]`) which will be joined with dots.
29
+ *
30
+ * @param owner - The owner path (e.g., `api.auth` or `["api", "auth"]`).
31
+ * @param messages - The messages to log
32
+ */
33
+ declare function logError(owner: string | string[], ...messages: unknown[]): void;
34
+ /**
35
+ * Log a warning message to the console. Will display a colored label with the owner(s) name.
36
+ * Always logs regardless of environment (not subject to whitelisting).
37
+ *
38
+ * Owner can be specified as a dot-separated string (e.g., `api.auth.login`) or as an array
39
+ * of segments (e.g., `["api", "auth", "login"]`) which will be joined with dots.
40
+ *
41
+ * @param owner - The owner path (e.g., `api.auth` or `["api", "auth"]`).
42
+ * @param messages - The messages to log
43
+ */
44
+ declare function logWarn(owner: string | string[], ...messages: unknown[]): void;
45
+ type KeysWithVoidPayload<Events extends Record<string, any>> = { [K in keyof Events] : Events[K] extends void ? K : never }[keyof Events];
46
+ declare class Emitter<Events extends Record<string, any>> {
47
+ private;
48
+ on<K extends keyof Events>(event: K, listener: (args: Events[K]) => void): () => void;
49
+ once<K extends keyof Events>(event: K, listener: (args: Events[K]) => void): void;
50
+ off<K extends keyof Events>(event: K, listener?: (args: Events[K]) => void): void;
51
+ emit<K extends KeysWithVoidPayload<Events>>(event: K): void;
52
+ emit<K extends Exclude<keyof Events, KeysWithVoidPayload<Events>>>(event: K, args: Events[K]): void;
53
+ destroy(): void;
54
+ }
55
+ export { logWarn, logError, log, clamp, Emitter };
package/dist/index.js ADDED
@@ -0,0 +1,140 @@
1
+ // src/math.ts
2
+ var clamp = (value, min, max) => {
3
+ return Math.min(Math.max(value, min), max);
4
+ };
5
+ // src/log.ts
6
+ var colors = [
7
+ { primary: "#003f5c", text: "white" },
8
+ { primary: "#2f4b7c", text: "white" },
9
+ { primary: "#665191", text: "white" },
10
+ { primary: "#a05195", text: "white" },
11
+ { primary: "#d45087", text: "white" },
12
+ { primary: "#f95d6a", text: "white" },
13
+ { primary: "#ff7c43", text: "black" },
14
+ { primary: "#ffa600", text: "black" },
15
+ { primary: "#ffc600", text: "black" }
16
+ ];
17
+ var hash = (str) => {
18
+ let hash2 = 0;
19
+ for (let i = 0;i < str.length; i++) {
20
+ const char = str.charCodeAt(i);
21
+ hash2 = (hash2 << 5) - hash2 + char;
22
+ hash2 = hash2 & hash2;
23
+ }
24
+ return Math.abs(hash2);
25
+ };
26
+ var getColor = (str) => {
27
+ const colorIndex = hash(str) % colors.length;
28
+ return colors[colorIndex];
29
+ };
30
+ var getLogWhitelist = () => {
31
+ const whitelist = process.env.NEXT_PUBLIC_LOG_WHITELIST || process.env.VITE_LOG_WHITELIST || process.env.LOG_WHITELIST;
32
+ return whitelist?.split(",").map((s) => s.trim().toLowerCase()) || [];
33
+ };
34
+ var isProduction = () => {
35
+ return false;
36
+ };
37
+ var matchesPattern = (owner, pattern) => {
38
+ const ownerSegments = owner.toLowerCase().split(".");
39
+ const patternSegments = pattern.split(".");
40
+ if (patternSegments.length > ownerSegments.length) {
41
+ return false;
42
+ }
43
+ for (let i = 0;i < patternSegments.length; i++) {
44
+ const patternSegment = patternSegments[i];
45
+ const ownerSegment = ownerSegments[i];
46
+ if (patternSegment === "*") {
47
+ continue;
48
+ }
49
+ if (patternSegment !== ownerSegment) {
50
+ return false;
51
+ }
52
+ }
53
+ return true;
54
+ };
55
+ var shouldLog = (owners) => {
56
+ if (!isProduction()) {
57
+ return true;
58
+ }
59
+ const whitelist = getLogWhitelist();
60
+ if (whitelist.length === 0) {
61
+ return false;
62
+ }
63
+ const ownerPath = owners.join(".");
64
+ return whitelist.some((pattern) => matchesPattern(ownerPath, pattern));
65
+ };
66
+ var buildOwnerLabels = (owners) => {
67
+ const isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
68
+ if (isBrowser) {
69
+ const labels2 = [];
70
+ const styles = [];
71
+ for (const ownerName of owners) {
72
+ const color = getColor(ownerName);
73
+ labels2.push(`%c ${ownerName.toUpperCase()} `);
74
+ styles.push(`background: ${color.primary}; color: ${color.text}; padding: 2px 0px; border-radius: 4px; font-weight: semibold; font-size: 0.8em; margin-right: 4px;`);
75
+ }
76
+ return [labels2.join(""), ...styles];
77
+ }
78
+ const labels = [];
79
+ for (const ownerName of owners) {
80
+ labels.push(`\x1B[36m[${ownerName.toUpperCase()}]\x1B[0m`);
81
+ }
82
+ return [labels.join(" ")];
83
+ };
84
+ function log(owner, ...messages) {
85
+ const owners = Array.isArray(owner) ? owner : [owner];
86
+ if (!shouldLog(owners)) {
87
+ return;
88
+ }
89
+ const [label, ...styles] = buildOwnerLabels(owners);
90
+ console.log(label, ...styles, ...messages);
91
+ }
92
+ function logError(owner, ...messages) {
93
+ const owners = Array.isArray(owner) ? owner : [owner];
94
+ const [label, ...styles] = buildOwnerLabels(owners);
95
+ console.error(label, ...styles, ...messages);
96
+ }
97
+ function logWarn(owner, ...messages) {
98
+ const owners = Array.isArray(owner) ? owner : [owner];
99
+ const [label, ...styles] = buildOwnerLabels(owners);
100
+ console.warn(label, ...styles, ...messages);
101
+ }
102
+ // src/events.ts
103
+ class Emitter {
104
+ #events = {};
105
+ on(event, listener) {
106
+ if (!this.#events[event])
107
+ this.#events[event] = [];
108
+ this.#events[event].push(listener);
109
+ return () => this.off(event, listener);
110
+ }
111
+ once(event, listener) {
112
+ const wrappedListener = (args) => {
113
+ listener(args);
114
+ this.off(event, wrappedListener);
115
+ };
116
+ this.on(event, wrappedListener);
117
+ }
118
+ off(event, listener) {
119
+ if (!this.#events[event])
120
+ return;
121
+ if (listener) {
122
+ this.#events[event] = this.#events[event].filter((l) => l !== listener);
123
+ } else {
124
+ this.#events[event] = [];
125
+ }
126
+ }
127
+ emit(event, args) {
128
+ this.#events[event]?.forEach((listener) => listener(args));
129
+ }
130
+ destroy() {
131
+ this.#events = {};
132
+ }
133
+ }
134
+ export {
135
+ logWarn,
136
+ logError,
137
+ log,
138
+ clamp,
139
+ Emitter
140
+ };
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@gumbee/utils",
3
+ "version": "1.0.0",
4
+ "author": "Gumbee <mugeeb.hassan@gmail.com>",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/gumbee/utils.git"
8
+ },
9
+ "main": "./dist/index.cjs",
10
+ "module": "./dist/index.js",
11
+ "devDependencies": {
12
+ "@changesets/cli": "^2.29.8",
13
+ "@eslint/js": "^9.39.1",
14
+ "@types/bun": "^1.3.4",
15
+ "bunup": "^0.16.10",
16
+ "eslint": "^9.17.0",
17
+ "eslint-config-prettier": "^10.0.1",
18
+ "globals": "^15.15.0",
19
+ "typescript": "^5.9.3",
20
+ "typescript-eslint": "^8.47.0"
21
+ },
22
+ "peerDependencies": {
23
+ "typescript": ">=4.5.0"
24
+ },
25
+ "exports": {
26
+ ".": {
27
+ "import": {
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
+ },
31
+ "require": {
32
+ "types": "./dist/index.d.cts",
33
+ "default": "./dist/index.cjs"
34
+ }
35
+ },
36
+ "./package.json": "./package.json"
37
+ },
38
+ "bugs": {
39
+ "url": "https://github.com/gumbee/utils/issues"
40
+ },
41
+ "description": "Shared utilities for the Gumbee codebase",
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "files": [
46
+ "dist",
47
+ "README.md",
48
+ "LICENSE"
49
+ ],
50
+ "homepage": "https://github.com/gumbee/utils#readme",
51
+ "keywords": [
52
+ "gumbee",
53
+ "utils",
54
+ "utilities",
55
+ "typescript"
56
+ ],
57
+ "license": "MIT",
58
+ "peerDependenciesMeta": {
59
+ "typescript": {
60
+ "optional": true
61
+ }
62
+ },
63
+ "scripts": {
64
+ "build": "bunup --dts",
65
+ "dev": "bunup --watch --dts",
66
+ "type-check": "tsc --noEmit",
67
+ "lint": "eslint src/",
68
+ "lint:fix": "eslint --fix src/",
69
+ "changeset": "changeset",
70
+ "version": "changeset version"
71
+ },
72
+ "sideEffects": false,
73
+ "type": "module",
74
+ "types": "./dist/index.d.ts"
75
+ }