@leancodepl/utils 8.3.6 → 8.5.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/package.json CHANGED
@@ -1,24 +1,60 @@
1
1
  {
2
2
  "name": "@leancodepl/utils",
3
- "version": "8.3.6",
3
+ "version": "8.5.0",
4
4
  "license": "Apache-2.0",
5
+ "publishConfig": {
6
+ "access": "public",
7
+ "registry": "https://registry.npmjs.org/"
8
+ },
9
+ "engines": {
10
+ "node": ">=18.0.0"
11
+ },
5
12
  "dependencies": {
6
- "@leancodepl/api-date": "8.3.6",
13
+ "@leancodepl/api-date": "8.5.0",
7
14
  "tiny-invariant": ">=1.3.1"
8
15
  },
9
16
  "peerDependencies": {
10
- "react": ">=17.0.0"
17
+ "react": "*"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/leancodepl/js_corelibrary.git",
22
+ "directory": "packages/utils"
23
+ },
24
+ "homepage": "https://github.com/leancodepl/js_corelibrary",
25
+ "bugs": {
26
+ "url": "https://github.com/leancodepl/js_corelibrary/issues"
27
+ },
28
+ "description": "Common utility functions and React hooks for web applications",
29
+ "keywords": [
30
+ "utilities",
31
+ "react",
32
+ "hooks",
33
+ "helpers",
34
+ "typescript",
35
+ "javascript",
36
+ "leancode"
37
+ ],
38
+ "author": {
39
+ "name": "LeanCode",
40
+ "url": "https://leancode.co"
11
41
  },
42
+ "files": [
43
+ "dist",
44
+ "README.md",
45
+ "CHANGELOG.md"
46
+ ],
47
+ "sideEffects": false,
12
48
  "exports": {
13
49
  "./package.json": "./package.json",
14
50
  ".": {
15
51
  "module": "./index.esm.js",
16
- "types": "./index.esm.d.ts",
52
+ "types": "./index.d.ts",
17
53
  "import": "./index.cjs.mjs",
18
54
  "default": "./index.cjs.js"
19
55
  }
20
56
  },
21
57
  "module": "./index.esm.js",
22
58
  "main": "./index.cjs.js",
23
- "types": "./index.esm.d.ts"
59
+ "types": "./index.d.ts"
24
60
  }
package/index.cjs.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from "./src/index";
@@ -1 +0,0 @@
1
- exports._default = require('./index.cjs.js').default;
package/index.cjs.js DELETED
@@ -1,184 +0,0 @@
1
- 'use strict';
2
-
3
- var invariant = require('tiny-invariant');
4
- var react = require('react');
5
-
6
- function addPrefix(object, prefix) {
7
- return Object.fromEntries(Object.entries(object).map(([key, value])=>[
8
- `${prefix}${key}`,
9
- value
10
- ]));
11
- }
12
-
13
- function transformFirst(value, transformFn) {
14
- if (value.length === 0) {
15
- return "";
16
- }
17
- return transformFn(value[0]) + value.slice(1);
18
- }
19
- function toLowerFirst(value) {
20
- return transformFirst(value, (value)=>value.toLowerCase());
21
- }
22
- function toUpperFirst(value) {
23
- return transformFirst(value, (value)=>value.toUpperCase());
24
- }
25
-
26
- function _extends() {
27
- _extends = Object.assign || function assign(target) {
28
- for(var i = 1; i < arguments.length; i++){
29
- var source = arguments[i];
30
- for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
31
- }
32
- return target;
33
- };
34
- return _extends.apply(this, arguments);
35
- }
36
-
37
- function transformDeep(value, mode) {
38
- if (value === null || value === undefined) {
39
- return undefined;
40
- }
41
- if (Array.isArray(value)) {
42
- return value.map((val)=>transformDeep(val, mode));
43
- }
44
- if (typeof value === "object") {
45
- const transformKey = mode === "capitalize" ? toUpperFirst : toLowerFirst;
46
- return Object.entries(value).reduce((accumulator, [key, value])=>_extends({}, accumulator, {
47
- [transformKey(key)]: transformDeep(value, mode)
48
- }), {});
49
- }
50
- return value;
51
- }
52
- function uncapitalizeDeep(value) {
53
- return transformDeep(value, "uncapitalize");
54
- }
55
- function capitalizeDeep(value) {
56
- return transformDeep(value, "capitalize");
57
- }
58
-
59
- function assertDefined(value, message) {
60
- invariant(value !== undefined, message);
61
- }
62
-
63
- function assertNotNull(value, message) {
64
- invariant(value !== null, message);
65
- }
66
-
67
- function assertNotEmpty(value, message) {
68
- invariant(value !== null && value !== undefined, message);
69
- }
70
-
71
- function ensureDefined(value, message) {
72
- assertDefined(value, message);
73
- return value;
74
- }
75
-
76
- function ensureNotNull(value, message) {
77
- assertNotNull(value, message);
78
- return value;
79
- }
80
-
81
- function ensureNotEmpty(value, message) {
82
- assertNotEmpty(value, message);
83
- return value;
84
- }
85
-
86
- function downloadFile(dataOrUrl, options = {}) {
87
- if (typeof dataOrUrl === "string") {
88
- const { name } = options;
89
- const a = document.createElement("a");
90
- a.href = dataOrUrl;
91
- a.target = "_blank";
92
- if (name) a.download = name;
93
- a.click();
94
- } else {
95
- const url = URL.createObjectURL(dataOrUrl);
96
- downloadFile(url, options);
97
- URL.revokeObjectURL(url);
98
- }
99
- }
100
-
101
- function useRunInTask() {
102
- const [runningTasks, setRunningTasks] = react.useState(0);
103
- const runInTask = react.useCallback(async (task)=>{
104
- setRunningTasks((runningTasks)=>runningTasks + 1);
105
- try {
106
- return await task();
107
- } finally{
108
- setRunningTasks((runningTasks)=>runningTasks - 1);
109
- }
110
- }, []);
111
- return [
112
- runningTasks > 0,
113
- runInTask
114
- ];
115
- }
116
-
117
- function useBoundRunInTask(block) {
118
- const [isRunning, runInTask] = useRunInTask();
119
- const runBlockInTask = react.useMemo(()=>block ? (...args)=>runInTask(()=>block(...args)) : undefined, [
120
- block,
121
- runInTask
122
- ]);
123
- return [
124
- isRunning,
125
- runBlockInTask
126
- ];
127
- }
128
-
129
- function useKeyByRoute(routeMatches) {
130
- const keys = [];
131
- for(const key in routeMatches){
132
- const matches = routeMatches[key];
133
- if (Array.isArray(matches) ? matches.some((match)=>match !== null) : matches !== null) {
134
- keys.push(key);
135
- }
136
- }
137
- return keys;
138
- }
139
-
140
- function useSetUnset(set) {
141
- return [
142
- react.useCallback(()=>set(true), [
143
- set
144
- ]),
145
- react.useCallback(()=>set(false), [
146
- set
147
- ])
148
- ];
149
- }
150
-
151
- function useDialog(onAfterClose) {
152
- const [isDialogOpen, setIsDialogOpen] = react.useState(false);
153
- const [openDialog, closeDialog] = useSetUnset(setIsDialogOpen);
154
- const close = react.useCallback(()=>{
155
- closeDialog();
156
- if (onAfterClose) setTimeout(onAfterClose);
157
- }, [
158
- closeDialog,
159
- onAfterClose
160
- ]);
161
- return {
162
- isDialogOpen,
163
- openDialog,
164
- closeDialog: close
165
- };
166
- }
167
-
168
- exports.addPrefix = addPrefix;
169
- exports.assertDefined = assertDefined;
170
- exports.assertNotEmpty = assertNotEmpty;
171
- exports.assertNotNull = assertNotNull;
172
- exports.capitalizeDeep = capitalizeDeep;
173
- exports.downloadFile = downloadFile;
174
- exports.ensureDefined = ensureDefined;
175
- exports.ensureNotEmpty = ensureNotEmpty;
176
- exports.ensureNotNull = ensureNotNull;
177
- exports.toLowerFirst = toLowerFirst;
178
- exports.toUpperFirst = toUpperFirst;
179
- exports.uncapitalizeDeep = uncapitalizeDeep;
180
- exports.useBoundRunInTask = useBoundRunInTask;
181
- exports.useDialog = useDialog;
182
- exports.useKeyByRoute = useKeyByRoute;
183
- exports.useRunInTask = useRunInTask;
184
- exports.useSetUnset = useSetUnset;
package/index.cjs.mjs DELETED
@@ -1,2 +0,0 @@
1
- export * from './index.cjs.js';
2
- export { _default as default } from './index.cjs.default.js';
package/index.esm.d.ts DELETED
@@ -1 +0,0 @@
1
- export * from "./src/index";
package/index.esm.js DELETED
@@ -1,166 +0,0 @@
1
- import invariant from 'tiny-invariant';
2
- import { useState, useCallback, useMemo } from 'react';
3
-
4
- function addPrefix(object, prefix) {
5
- return Object.fromEntries(Object.entries(object).map(([key, value])=>[
6
- `${prefix}${key}`,
7
- value
8
- ]));
9
- }
10
-
11
- function transformFirst(value, transformFn) {
12
- if (value.length === 0) {
13
- return "";
14
- }
15
- return transformFn(value[0]) + value.slice(1);
16
- }
17
- function toLowerFirst(value) {
18
- return transformFirst(value, (value)=>value.toLowerCase());
19
- }
20
- function toUpperFirst(value) {
21
- return transformFirst(value, (value)=>value.toUpperCase());
22
- }
23
-
24
- function _extends() {
25
- _extends = Object.assign || function assign(target) {
26
- for(var i = 1; i < arguments.length; i++){
27
- var source = arguments[i];
28
- for(var key in source)if (Object.prototype.hasOwnProperty.call(source, key)) target[key] = source[key];
29
- }
30
- return target;
31
- };
32
- return _extends.apply(this, arguments);
33
- }
34
-
35
- function transformDeep(value, mode) {
36
- if (value === null || value === undefined) {
37
- return undefined;
38
- }
39
- if (Array.isArray(value)) {
40
- return value.map((val)=>transformDeep(val, mode));
41
- }
42
- if (typeof value === "object") {
43
- const transformKey = mode === "capitalize" ? toUpperFirst : toLowerFirst;
44
- return Object.entries(value).reduce((accumulator, [key, value])=>_extends({}, accumulator, {
45
- [transformKey(key)]: transformDeep(value, mode)
46
- }), {});
47
- }
48
- return value;
49
- }
50
- function uncapitalizeDeep(value) {
51
- return transformDeep(value, "uncapitalize");
52
- }
53
- function capitalizeDeep(value) {
54
- return transformDeep(value, "capitalize");
55
- }
56
-
57
- function assertDefined(value, message) {
58
- invariant(value !== undefined, message);
59
- }
60
-
61
- function assertNotNull(value, message) {
62
- invariant(value !== null, message);
63
- }
64
-
65
- function assertNotEmpty(value, message) {
66
- invariant(value !== null && value !== undefined, message);
67
- }
68
-
69
- function ensureDefined(value, message) {
70
- assertDefined(value, message);
71
- return value;
72
- }
73
-
74
- function ensureNotNull(value, message) {
75
- assertNotNull(value, message);
76
- return value;
77
- }
78
-
79
- function ensureNotEmpty(value, message) {
80
- assertNotEmpty(value, message);
81
- return value;
82
- }
83
-
84
- function downloadFile(dataOrUrl, options = {}) {
85
- if (typeof dataOrUrl === "string") {
86
- const { name } = options;
87
- const a = document.createElement("a");
88
- a.href = dataOrUrl;
89
- a.target = "_blank";
90
- if (name) a.download = name;
91
- a.click();
92
- } else {
93
- const url = URL.createObjectURL(dataOrUrl);
94
- downloadFile(url, options);
95
- URL.revokeObjectURL(url);
96
- }
97
- }
98
-
99
- function useRunInTask() {
100
- const [runningTasks, setRunningTasks] = useState(0);
101
- const runInTask = useCallback(async (task)=>{
102
- setRunningTasks((runningTasks)=>runningTasks + 1);
103
- try {
104
- return await task();
105
- } finally{
106
- setRunningTasks((runningTasks)=>runningTasks - 1);
107
- }
108
- }, []);
109
- return [
110
- runningTasks > 0,
111
- runInTask
112
- ];
113
- }
114
-
115
- function useBoundRunInTask(block) {
116
- const [isRunning, runInTask] = useRunInTask();
117
- const runBlockInTask = useMemo(()=>block ? (...args)=>runInTask(()=>block(...args)) : undefined, [
118
- block,
119
- runInTask
120
- ]);
121
- return [
122
- isRunning,
123
- runBlockInTask
124
- ];
125
- }
126
-
127
- function useKeyByRoute(routeMatches) {
128
- const keys = [];
129
- for(const key in routeMatches){
130
- const matches = routeMatches[key];
131
- if (Array.isArray(matches) ? matches.some((match)=>match !== null) : matches !== null) {
132
- keys.push(key);
133
- }
134
- }
135
- return keys;
136
- }
137
-
138
- function useSetUnset(set) {
139
- return [
140
- useCallback(()=>set(true), [
141
- set
142
- ]),
143
- useCallback(()=>set(false), [
144
- set
145
- ])
146
- ];
147
- }
148
-
149
- function useDialog(onAfterClose) {
150
- const [isDialogOpen, setIsDialogOpen] = useState(false);
151
- const [openDialog, closeDialog] = useSetUnset(setIsDialogOpen);
152
- const close = useCallback(()=>{
153
- closeDialog();
154
- if (onAfterClose) setTimeout(onAfterClose);
155
- }, [
156
- closeDialog,
157
- onAfterClose
158
- ]);
159
- return {
160
- isDialogOpen,
161
- openDialog,
162
- closeDialog: close
163
- };
164
- }
165
-
166
- export { addPrefix, assertDefined, assertNotEmpty, assertNotNull, capitalizeDeep, downloadFile, ensureDefined, ensureNotEmpty, ensureNotNull, toLowerFirst, toUpperFirst, uncapitalizeDeep, useBoundRunInTask, useDialog, useKeyByRoute, useRunInTask, useSetUnset };
package/src/index.d.ts DELETED
@@ -1,16 +0,0 @@
1
- export * from "./lib/types";
2
- export * from "./lib/addPrefix";
3
- export * from "./lib/transformFirst";
4
- export * from "./lib/transformDeep";
5
- export * from "./lib/assertDefined";
6
- export * from "./lib/assertNotNull";
7
- export * from "./lib/assertNotEmpty";
8
- export * from "./lib/ensureDefined";
9
- export * from "./lib/ensureNotNull";
10
- export * from "./lib/ensureNotEmpty";
11
- export * from "./lib/downloadFile";
12
- export * from "./lib/hooks/useRunInTask";
13
- export * from "./lib/hooks/useBoundRunInTask";
14
- export * from "./lib/hooks/useKeyByRoute";
15
- export * from "./lib/hooks/useSetUnset";
16
- export * from "./lib/hooks/useDialog";
@@ -1,5 +0,0 @@
1
- type PrefixWith<T, TPrefix extends string> = {
2
- [K in keyof T as K extends string ? `${TPrefix}${K}` : never]: T[K];
3
- };
4
- export declare function addPrefix<T extends object, TPrefix extends string>(object: T, prefix: TPrefix): PrefixWith<T, TPrefix>;
5
- export {};
@@ -1 +0,0 @@
1
- export declare function assertDefined<T>(value: T | undefined, message?: string): asserts value is T;
@@ -1 +0,0 @@
1
- export declare function assertNotEmpty<T>(value: T | null | undefined, message?: string): asserts value is T;
@@ -1 +0,0 @@
1
- export declare function assertNotNull<T>(value: T | null, message?: string): asserts value is T;
@@ -1,6 +0,0 @@
1
- type DownloadFileOptions = {
2
- name?: string;
3
- };
4
- export declare function downloadFile(url: string, options?: DownloadFileOptions): void;
5
- export declare function downloadFile(obj: Blob | MediaSource, options?: DownloadFileOptions): void;
6
- export {};
@@ -1 +0,0 @@
1
- export declare function ensureDefined<T>(value: T | undefined, message?: string): T;
@@ -1 +0,0 @@
1
- export declare function ensureNotEmpty<T>(value: T | null | undefined, message?: string): T;
@@ -1 +0,0 @@
1
- export declare function ensureNotNull<T>(value: T | null, message?: string): T;
@@ -1,4 +0,0 @@
1
- type AnyFunction = (...args: any[]) => any;
2
- export declare function useBoundRunInTask<T extends AnyFunction>(block: T): [boolean, T];
3
- export declare function useBoundRunInTask<T extends AnyFunction>(block: T | undefined): [boolean, T | undefined];
4
- export {};
@@ -1,5 +0,0 @@
1
- export declare function useDialog(onAfterClose?: () => void): {
2
- isDialogOpen: boolean;
3
- openDialog: () => void;
4
- closeDialog: () => void;
5
- };
@@ -1 +0,0 @@
1
- export declare function useKeyByRoute<TKey extends string>(routeMatches: Record<TKey, (object | null)[] | never | object | null>): TKey[];
@@ -1 +0,0 @@
1
- export declare function useRunInTask(): readonly [boolean, <T>(task: () => Promise<T> | T) => Promise<T>];
@@ -1,2 +0,0 @@
1
- import { Dispatch, SetStateAction } from "react";
2
- export declare function useSetUnset(set: Dispatch<SetStateAction<boolean>>): readonly [() => void, () => void];
@@ -1,3 +0,0 @@
1
- import { CapitalizeDeep, UncapitalizeDeep } from "./types";
2
- export declare function uncapitalizeDeep<T>(value: T): UncapitalizeDeep<T>;
3
- export declare function capitalizeDeep<T>(value: T): CapitalizeDeep<T>;
@@ -1,2 +0,0 @@
1
- export declare function toLowerFirst(value: string): string;
2
- export declare function toUpperFirst(value: string): string;
@@ -1,2 +0,0 @@
1
- export * from "./transformDeep";
2
- export * from "./unpromisify";
@@ -1,10 +0,0 @@
1
- import type { ApiDateOnly, ApiDateTimeOffset, ApiTimeOnly, ApiTimeSpan } from "@leancodepl/api-date";
2
- export type Mode = "capitalize" | "uncapitalize";
3
- export type TransformDeep<T, TMode extends Mode> = T extends Array<infer TArrayElement> ? Array<TransformDeep<TArrayElement, TMode>> : T extends object ? T extends ApiDateOnly | ApiDateTimeOffset | ApiTimeOnly | ApiTimeSpan ? T : {
4
- [TKey in keyof T as TKey extends string ? TMode extends "uncapitalize" ? Uncapitalize<TKey> : Capitalize<TKey> : TKey]: TransformDeep<T[TKey], TMode>;
5
- } : T extends null ? undefined : T;
6
- export type UncapitalizeDeep<T> = TransformDeep<T, "uncapitalize">;
7
- export type CapitalizeDeep<T> = TransformDeep<T, "capitalize">;
8
- export type MutableDeep<T> = T extends bigint | boolean | Date | number | string | symbol | null | undefined ? T : T extends ReadonlyArray<infer ArrayType> ? Array<MutableDeep<ArrayType>> : {
9
- -readonly [K in keyof T]: MutableDeep<T[K]>;
10
- };
@@ -1 +0,0 @@
1
- export type Unpromisify<T> = T extends Promise<infer TResult> ? TResult : T;