@o/helpers 0.0.0-bootstrap.0 → 0.16.14
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 +7 -0
- package/dist/assert.d.ts +5 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +26 -0
- package/dist/assert.js.map +1 -0
- package/dist/async/abortable.d.ts +9 -0
- package/dist/async/abortable.d.ts.map +1 -0
- package/dist/async/abortable.js +45 -0
- package/dist/async/abortable.js.map +1 -0
- package/dist/async/sleep.d.ts +2 -0
- package/dist/async/sleep.d.ts.map +1 -0
- package/dist/async/sleep.js +8 -0
- package/dist/async/sleep.js.map +1 -0
- package/dist/async/useAsyncEffect.d.ts +11 -0
- package/dist/async/useAsyncEffect.d.ts.map +1 -0
- package/dist/async/useAsyncEffect.js +99 -0
- package/dist/async/useAsyncEffect.js.map +1 -0
- package/dist/browser/isActiveElementFormField.d.ts +2 -0
- package/dist/browser/isActiveElementFormField.d.ts.map +1 -0
- package/dist/browser/isActiveElementFormField.js +9 -0
- package/dist/browser/isActiveElementFormField.js.map +1 -0
- package/dist/browser/openPopup.d.ts +2 -0
- package/dist/browser/openPopup.d.ts.map +1 -0
- package/dist/browser/openPopup.js +21 -0
- package/dist/browser/openPopup.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -0
- package/dist/emitter.d.ts +72 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +273 -0
- package/dist/emitter.js.map +1 -0
- package/dist/error/errors.d.ts +23 -0
- package/dist/error/errors.d.ts.map +1 -0
- package/dist/error/errors.js +38 -0
- package/dist/error/errors.js.map +1 -0
- package/dist/global/globalValue.d.ts +23 -0
- package/dist/global/globalValue.d.ts.map +1 -0
- package/dist/global/globalValue.js +33 -0
- package/dist/global/globalValue.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/index.native.d.ts +3 -0
- package/dist/index.native.d.ts.map +1 -0
- package/dist/index.native.js +3 -0
- package/dist/index.native.js.map +1 -0
- package/dist/object/isEqualIdentity.d.ts +2 -0
- package/dist/object/isEqualIdentity.d.ts.map +1 -0
- package/dist/object/isEqualIdentity.js +2 -0
- package/dist/object/isEqualIdentity.js.map +1 -0
- package/dist/object/isEqualNever.d.ts +2 -0
- package/dist/object/isEqualNever.d.ts.map +1 -0
- package/dist/object/isEqualNever.js +2 -0
- package/dist/object/isEqualNever.js.map +1 -0
- package/dist/platform.d.ts +23 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +60 -0
- package/dist/platform.js.map +1 -0
- package/dist/platform.native.d.ts +25 -0
- package/dist/platform.native.d.ts.map +1 -0
- package/dist/platform.native.js +52 -0
- package/dist/platform.native.js.map +1 -0
- package/dist/react/createGlobalContext.d.ts +3 -0
- package/dist/react/createGlobalContext.d.ts.map +1 -0
- package/dist/react/createGlobalContext.js +8 -0
- package/dist/react/createGlobalContext.js.map +1 -0
- package/dist/react/getCurrentComponentStack.d.ts +2 -0
- package/dist/react/getCurrentComponentStack.d.ts.map +1 -0
- package/dist/react/getCurrentComponentStack.js +46 -0
- package/dist/react/getCurrentComponentStack.js.map +1 -0
- package/dist/shared.d.ts +17 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +16 -0
- package/dist/shared.js.map +1 -0
- package/dist/storage/createStorage.d.ts +58 -0
- package/dist/storage/createStorage.d.ts.map +1 -0
- package/dist/storage/createStorage.js +110 -0
- package/dist/storage/createStorage.js.map +1 -0
- package/dist/storage/driver.d.ts +5 -0
- package/dist/storage/driver.d.ts.map +1 -0
- package/dist/storage/driver.js +21 -0
- package/dist/storage/driver.js.map +1 -0
- package/dist/storage/types.d.ts +7 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/string/randomId.d.ts +2 -0
- package/dist/string/randomId.d.ts.map +1 -0
- package/dist/string/randomId.js +2 -0
- package/dist/string/randomId.js.map +1 -0
- package/dist/string/slugify.d.ts +2 -0
- package/dist/string/slugify.d.ts.map +1 -0
- package/dist/string/slugify.js +7 -0
- package/dist/string/slugify.js.map +1 -0
- package/dist/time/time.d.ts +28 -0
- package/dist/time/time.d.ts.map +1 -0
- package/dist/time/time.js +21 -0
- package/dist/time/time.js.map +1 -0
- package/package.json +39 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// platform booleans, react-native variant.
|
|
2
|
+
// Mirrors @tamagui/constants (native) so @o/helpers carries no @tamagui/* runtime dep.
|
|
3
|
+
// react-native is an optional peer dep and is always present in the native runtime
|
|
4
|
+
// where this file is loaded, so importing it here is safe.
|
|
5
|
+
import { useLayoutEffect } from 'react';
|
|
6
|
+
import { Platform } from 'react-native';
|
|
7
|
+
export const IS_WEB = false;
|
|
8
|
+
export const IS_BROWSER = false;
|
|
9
|
+
export const IS_SERVER = false;
|
|
10
|
+
export const IS_SERVER_RUNTIME = false;
|
|
11
|
+
export const IS_CLIENT = true;
|
|
12
|
+
export const useIsomorphicLayoutEffect = useLayoutEffect;
|
|
13
|
+
export const IS_CHROME = false;
|
|
14
|
+
export const IS_WEB_TOUCHABLE = false;
|
|
15
|
+
export const IS_NATIVE_DESKTOP = Platform?.OS === 'macos' || Platform?.OS === 'windows';
|
|
16
|
+
export const IS_TOUCHABLE = !IS_NATIVE_DESKTOP;
|
|
17
|
+
// optional chain required: babel extractor loads native.cjs in node where Platform is undefined
|
|
18
|
+
// on Android TV: Platform.OS === 'android' per react-native-tvos
|
|
19
|
+
export const IS_ANDROID = Platform?.OS === 'android' ||
|
|
20
|
+
process.env.TEST_NATIVE_PLATFORM === 'android' ||
|
|
21
|
+
process.env.TEST_NATIVE_PLATFORM === 'androidtv';
|
|
22
|
+
// on tvOS: Platform.OS === 'ios' per react-native-tvos
|
|
23
|
+
export const IS_IOS = Platform?.OS === 'ios' ||
|
|
24
|
+
process.env.TEST_NATIVE_PLATFORM === 'ios' ||
|
|
25
|
+
process.env.TEST_NATIVE_PLATFORM === 'tvos';
|
|
26
|
+
export const SUPPORTS_DYNAMIC_COLOR_IOS = IS_IOS || process.env.TAMAGUI_DYNAMIC_COLOR_IOS === '1';
|
|
27
|
+
export const IS_TV = Platform?.isTV ||
|
|
28
|
+
process.env.TEST_NATIVE_PLATFORM === 'androidtv' ||
|
|
29
|
+
process.env.TEST_NATIVE_PLATFORM === 'tvos';
|
|
30
|
+
// Platform.OS includes 'web' in its type (PlatformOSType) but never at native runtime,
|
|
31
|
+
// so the map is partial — any unmapped OS falls through to 'native'.
|
|
32
|
+
const platforms = {
|
|
33
|
+
ios: 'ios',
|
|
34
|
+
android: 'android',
|
|
35
|
+
macos: 'macos',
|
|
36
|
+
windows: 'windows',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Reflects Platform.OS. TV platforms are intentionally NOT separate values:
|
|
40
|
+
* - Android TV has Platform.OS === 'android' (react-native-tvos behavior)
|
|
41
|
+
* - tvOS has Platform.OS === 'ios' (react-native-tvos behavior)
|
|
42
|
+
* Use `IS_TV` combined with `IS_ANDROID`/`IS_IOS` to detect specific TV platforms.
|
|
43
|
+
*/
|
|
44
|
+
export const CURRENT_PLATFORM = (Platform?.OS ? platforms[Platform.OS] : undefined) || 'native';
|
|
45
|
+
// In Metro source mode, TAMAGUI_TARGET may not be set by the build tool.
|
|
46
|
+
// Set it here so all process.env.TAMAGUI_TARGET runtime checks work correctly.
|
|
47
|
+
// In pre-built dist, the build tool inlines TAMAGUI_TARGET as a literal string,
|
|
48
|
+
// making this block dead code (if (!'native') → never executes).
|
|
49
|
+
if (!process.env.TAMAGUI_TARGET) {
|
|
50
|
+
process.env.TAMAGUI_TARGET = 'native';
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=platform.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.native.js","sourceRoot":"","sources":["../src/platform.native.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,uFAAuF;AACvF,mFAAmF;AACnF,2DAA2D;AAE3D,OAAO,EAAE,eAAe,EAAkB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,MAAM,CAAC,MAAM,MAAM,GAAY,KAAK,CAAA;AACpC,MAAM,CAAC,MAAM,UAAU,GAAY,KAAK,CAAA;AACxC,MAAM,CAAC,MAAM,SAAS,GAAY,KAAK,CAAA;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAY,KAAK,CAAA;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAY,IAAI,CAAA;AACtC,MAAM,CAAC,MAAM,yBAAyB,GAAqB,eAAe,CAAA;AAC1E,MAAM,CAAC,MAAM,SAAS,GAAY,KAAK,CAAA;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAY,KAAK,CAAA;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAC5B,QAAQ,EAAE,EAAE,KAAK,OAAO,IAAI,QAAQ,EAAE,EAAE,KAAK,SAAS,CAAA;AACxD,MAAM,CAAC,MAAM,YAAY,GAAY,CAAC,iBAAiB,CAAA;AACvD,gGAAgG;AAChG,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GACrB,QAAQ,EAAE,EAAE,KAAK,SAAS;IAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,SAAS;IAC9C,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,WAAW,CAAA;AAClD,uDAAuD;AACvD,MAAM,CAAC,MAAM,MAAM,GACjB,QAAQ,EAAE,EAAE,KAAK,KAAK;IACtB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,KAAK;IAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAA;AAC7C,MAAM,CAAC,MAAM,0BAA0B,GACrC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,CAAA;AACzD,MAAM,CAAC,MAAM,KAAK,GAChB,QAAQ,EAAE,IAAI;IACd,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,WAAW;IAChD,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,MAAM,CAAA;AAI7C,uFAAuF;AACvF,qEAAqE;AACrE,MAAM,SAAS,GAAyD;IACtE,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;CACnB,CAAA;AACD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAA;AAEjE,yEAAyE;AACzE,+EAA+E;AAC/E,gFAAgF;AAChF,iEAAiE;AACjE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,QAAQ,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGlobalContext.d.ts","sourceRoot":"","sources":["../../src/react/createGlobalContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAiB,MAAM,OAAO,CAAA;AAOnD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE/E"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
import { globalValue } from '../global/globalValue.js';
|
|
3
|
+
// create or retrieve a React context that is stored on `globalThis`.
|
|
4
|
+
// this ensures a stable singleton that survives hot-reloads during development.
|
|
5
|
+
export function createGlobalContext(key, defaultValue) {
|
|
6
|
+
return globalValue(key, () => createContext(defaultValue));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=createGlobalContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createGlobalContext.js","sourceRoot":"","sources":["../../src/react/createGlobalContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,aAAa,EAAE,MAAM,OAAO,CAAA;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,qEAAqE;AACrE,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB,CAAI,GAAW,EAAE,YAAe;IACjE,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,aAAa,CAAI,YAAY,CAAC,CAAC,CAAA;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCurrentComponentStack.d.ts","sourceRoot":"","sources":["../../src/react/getCurrentComponentStack.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,GAAI,SAAS,OAAO,KAAG,MAgB3D,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export const getCurrentComponentStack = (format) => {
|
|
3
|
+
if (process.env.NODE_ENV === 'development') {
|
|
4
|
+
// react 19.1+ exposes captureOwnerStack as a public api
|
|
5
|
+
const captureOwnerStack = React.captureOwnerStack;
|
|
6
|
+
const stack = typeof captureOwnerStack === 'function' ? captureOwnerStack() : null;
|
|
7
|
+
if (!stack)
|
|
8
|
+
return '';
|
|
9
|
+
if (format === 'short') {
|
|
10
|
+
return formatStackToShort(stack);
|
|
11
|
+
}
|
|
12
|
+
return stack;
|
|
13
|
+
}
|
|
14
|
+
return `(prod, no stack)`;
|
|
15
|
+
};
|
|
16
|
+
const formatStackToShort = (stack) => {
|
|
17
|
+
if (process.env.NODE_ENV === 'development') {
|
|
18
|
+
const lines = stack
|
|
19
|
+
// huge stack was causing issues
|
|
20
|
+
.slice(0, 6000)
|
|
21
|
+
.split('\n');
|
|
22
|
+
const componentNames = [];
|
|
23
|
+
for (const line of lines) {
|
|
24
|
+
// Extract component names from patterns like "at ComponentName ("
|
|
25
|
+
// Also handle cases like "at Route((chat))" or "Route() ("
|
|
26
|
+
const match = line.match(/\s*at\s+([A-Z][a-zA-Z0-9_]*)\s*\(/);
|
|
27
|
+
if (match) {
|
|
28
|
+
const componentName = match[1];
|
|
29
|
+
// Filter out framework internals and keep user components
|
|
30
|
+
if (componentName &&
|
|
31
|
+
componentName !== 'Array' &&
|
|
32
|
+
componentName !== 'Root' &&
|
|
33
|
+
componentName !== 'Route') {
|
|
34
|
+
componentNames.push(componentName);
|
|
35
|
+
if (componentNames.length > 10) {
|
|
36
|
+
// avoid too many
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return componentNames.join(' < ');
|
|
43
|
+
}
|
|
44
|
+
return stack;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=getCurrentComponentStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCurrentComponentStack.js","sourceRoot":"","sources":["../../src/react/getCurrentComponentStack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAgB,EAAU,EAAE;IACnE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC3C,wDAAwD;QACxD,MAAM,iBAAiB,GAAI,KAA6B,CAAC,iBAAiB,CAAA;QAC1E,MAAM,KAAK,GAAG,OAAO,iBAAiB,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QAElF,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAA;QAErB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,kBAAkB,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAU,EAAE;IACnD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK;YACjB,gCAAgC;aAC/B,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;aACd,KAAK,CAAC,IAAI,CAAC,CAAA;QAEd,MAAM,cAAc,GAAa,EAAE,CAAA;QAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,kEAAkE;YAClE,2DAA2D;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;YAC7D,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBAC9B,0DAA0D;gBAC1D,IACE,aAAa;oBACb,aAAa,KAAK,OAAO;oBACzB,aAAa,KAAK,MAAM;oBACxB,aAAa,KAAK,OAAO,EACzB,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;oBAClC,IAAI,cAAc,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;wBAC/B,iBAAiB;wBACjB,MAAK;oBACP,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { assertString } from './assert.js';
|
|
2
|
+
export { useAsyncEffect, useAsyncLayoutEffect } from './async/useAsyncEffect.js';
|
|
3
|
+
export { sleep } from './async/sleep.js';
|
|
4
|
+
export { isActiveElementFormField } from './browser/isActiveElementFormField.js';
|
|
5
|
+
export { openCenteredPopup } from './browser/openPopup.js';
|
|
6
|
+
export { EMPTY_OBJECT } from './constants.js';
|
|
7
|
+
export { Emitter, createEmitter, useEmitter, useEmitterSelector, useEmitterValue, } from './emitter.js';
|
|
8
|
+
export { isEqualIdentity } from './object/isEqualIdentity.js';
|
|
9
|
+
export { isEqualNever } from './object/isEqualNever.js';
|
|
10
|
+
export { createGlobalContext } from './react/createGlobalContext.js';
|
|
11
|
+
export { createStorage, createStorageValue } from './storage/createStorage.js';
|
|
12
|
+
export { clearStorageDriver, getStorageDriver, setStorageDriver, } from './storage/driver.js';
|
|
13
|
+
export type { StorageDriver } from './storage/types.js';
|
|
14
|
+
export { randomId } from './string/randomId.js';
|
|
15
|
+
export { slugify } from './string/slugify.js';
|
|
16
|
+
export { time } from './time/time.js';
|
|
17
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EACL,OAAO,EACP,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,eAAe,GAChB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { assertString } from './assert.js';
|
|
2
|
+
export { useAsyncEffect, useAsyncLayoutEffect } from './async/useAsyncEffect.js';
|
|
3
|
+
export { sleep } from './async/sleep.js';
|
|
4
|
+
export { isActiveElementFormField } from './browser/isActiveElementFormField.js';
|
|
5
|
+
export { openCenteredPopup } from './browser/openPopup.js';
|
|
6
|
+
export { EMPTY_OBJECT } from './constants.js';
|
|
7
|
+
export { Emitter, createEmitter, useEmitter, useEmitterSelector, useEmitterValue, } from './emitter.js';
|
|
8
|
+
export { isEqualIdentity } from './object/isEqualIdentity.js';
|
|
9
|
+
export { isEqualNever } from './object/isEqualNever.js';
|
|
10
|
+
export { createGlobalContext } from './react/createGlobalContext.js';
|
|
11
|
+
export { createStorage, createStorageValue } from './storage/createStorage.js';
|
|
12
|
+
export { clearStorageDriver, getStorageDriver, setStorageDriver, } from './storage/driver.js';
|
|
13
|
+
export { randomId } from './string/randomId.js';
|
|
14
|
+
export { slugify } from './string/slugify.js';
|
|
15
|
+
export { time } from './time/time.js';
|
|
16
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChF,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EACL,OAAO,EACP,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,eAAe,GAChB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* namespaced storage interface with JSON serialization
|
|
3
|
+
* @template K - key type (string literal union for type-safe keys)
|
|
4
|
+
* @template V - value type (automatically JSON serialized/deserialized)
|
|
5
|
+
*/
|
|
6
|
+
export interface Storage<K extends string = string, V = unknown> {
|
|
7
|
+
/** get a JSON-parsed value by key */
|
|
8
|
+
get(key: K): V | undefined;
|
|
9
|
+
/** set a value (JSON serialized) */
|
|
10
|
+
set(key: K, value: V): void;
|
|
11
|
+
/** remove a key */
|
|
12
|
+
remove(key: K): void;
|
|
13
|
+
/** check if key exists */
|
|
14
|
+
has(key: K): boolean;
|
|
15
|
+
/** get all keys in this namespace */
|
|
16
|
+
keys(): K[];
|
|
17
|
+
/** remove all keys in this namespace */
|
|
18
|
+
clear(): void;
|
|
19
|
+
/** get raw string value (no JSON parsing) - localStorage compatible */
|
|
20
|
+
getItem(key: K): string | null;
|
|
21
|
+
/** set raw string value (no JSON serialization) - localStorage compatible */
|
|
22
|
+
setItem(key: K, value: string): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* create a namespaced storage instance (hmr-safe, returns existing instance if already created)
|
|
26
|
+
* @param namespace - unique prefix for all keys
|
|
27
|
+
* @returns storage instance with get/set (JSON) and getItem/setItem (raw) methods
|
|
28
|
+
* @example
|
|
29
|
+
* const store = createStorage<'token' | 'user', string>('auth')
|
|
30
|
+
* store.set('token', 'abc123')
|
|
31
|
+
* store.get('token') // 'abc123'
|
|
32
|
+
*/
|
|
33
|
+
export declare function createStorage<K extends string, V>(namespace: string): Storage<K, V>;
|
|
34
|
+
/**
|
|
35
|
+
* single-value storage interface
|
|
36
|
+
* @template T - value type (automatically JSON serialized/deserialized)
|
|
37
|
+
*/
|
|
38
|
+
export interface StorageValue<T> {
|
|
39
|
+
/** get the stored value */
|
|
40
|
+
get(): T | undefined;
|
|
41
|
+
/** set the value */
|
|
42
|
+
set(value: T): void;
|
|
43
|
+
/** remove the value */
|
|
44
|
+
remove(): void;
|
|
45
|
+
/** check if value exists */
|
|
46
|
+
has(): boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* create a single-value storage (wrapper around createStorage)
|
|
50
|
+
* @param key - unique storage key
|
|
51
|
+
* @returns storage value instance
|
|
52
|
+
* @example
|
|
53
|
+
* const token = createStorageValue<string>('auth-token')
|
|
54
|
+
* token.set('abc123')
|
|
55
|
+
* token.get() // 'abc123'
|
|
56
|
+
*/
|
|
57
|
+
export declare function createStorageValue<T>(key: string): StorageValue<T>;
|
|
58
|
+
//# sourceMappingURL=createStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createStorage.d.ts","sourceRoot":"","sources":["../../src/storage/createStorage.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO;IAC7D,qCAAqC;IACrC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;IAC1B,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IAC3B,mBAAmB;IACnB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;IACpB,0BAA0B;IAC1B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAA;IACpB,qCAAqC;IACrC,IAAI,IAAI,CAAC,EAAE,CAAA;IACX,wCAAwC;IACxC,KAAK,IAAI,IAAI,CAAA;IACb,uEAAuE;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,CAAA;IAC9B,6EAA6E;IAC7E,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CA2EnF;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,2BAA2B;IAC3B,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;IACpB,oBAAoB;IACpB,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IACnB,uBAAuB;IACvB,MAAM,IAAI,IAAI,CAAA;IACd,4BAA4B;IAC5B,GAAG,IAAI,OAAO,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAQlE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { getStorageDriver } from './driver.js';
|
|
2
|
+
// hmr-safe: store caches on globalThis so they survive module reloads
|
|
3
|
+
const globalKey = '__takeout_storage__';
|
|
4
|
+
const globalCache = (globalThis[globalKey] ??= {
|
|
5
|
+
namespaces: new Set(),
|
|
6
|
+
instances: new Map(),
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* create a namespaced storage instance (hmr-safe, returns existing instance if already created)
|
|
10
|
+
* @param namespace - unique prefix for all keys
|
|
11
|
+
* @returns storage instance with get/set (JSON) and getItem/setItem (raw) methods
|
|
12
|
+
* @example
|
|
13
|
+
* const store = createStorage<'token' | 'user', string>('auth')
|
|
14
|
+
* store.set('token', 'abc123')
|
|
15
|
+
* store.get('token') // 'abc123'
|
|
16
|
+
*/
|
|
17
|
+
export function createStorage(namespace) {
|
|
18
|
+
// return existing instance for hmr safety
|
|
19
|
+
const existing = globalCache.instances.get(namespace);
|
|
20
|
+
if (existing) {
|
|
21
|
+
return existing;
|
|
22
|
+
}
|
|
23
|
+
globalCache.namespaces.add(namespace);
|
|
24
|
+
const prefix = `${namespace}:`;
|
|
25
|
+
const prefixKey = (key) => `${prefix}${key}`;
|
|
26
|
+
const storage = {
|
|
27
|
+
get(key) {
|
|
28
|
+
const driver = getStorageDriver();
|
|
29
|
+
if (!driver)
|
|
30
|
+
return undefined;
|
|
31
|
+
const raw = driver.getItem(prefixKey(key));
|
|
32
|
+
if (raw == null)
|
|
33
|
+
return undefined;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(raw);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
set(key, value) {
|
|
42
|
+
const driver = getStorageDriver();
|
|
43
|
+
if (!driver)
|
|
44
|
+
return;
|
|
45
|
+
driver.setItem(prefixKey(key), JSON.stringify(value));
|
|
46
|
+
},
|
|
47
|
+
remove(key) {
|
|
48
|
+
const driver = getStorageDriver();
|
|
49
|
+
if (!driver)
|
|
50
|
+
return;
|
|
51
|
+
driver.removeItem(prefixKey(key));
|
|
52
|
+
},
|
|
53
|
+
has(key) {
|
|
54
|
+
const driver = getStorageDriver();
|
|
55
|
+
if (!driver)
|
|
56
|
+
return false;
|
|
57
|
+
return driver.getItem(prefixKey(key)) != null;
|
|
58
|
+
},
|
|
59
|
+
keys() {
|
|
60
|
+
const driver = getStorageDriver();
|
|
61
|
+
if (!driver)
|
|
62
|
+
return [];
|
|
63
|
+
return driver
|
|
64
|
+
.getAllKeys()
|
|
65
|
+
.filter((k) => k.startsWith(prefix))
|
|
66
|
+
.map((k) => k.slice(prefix.length));
|
|
67
|
+
},
|
|
68
|
+
clear() {
|
|
69
|
+
const driver = getStorageDriver();
|
|
70
|
+
if (!driver)
|
|
71
|
+
return;
|
|
72
|
+
for (const key of this.keys()) {
|
|
73
|
+
driver.removeItem(prefixKey(key));
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
getItem(key) {
|
|
77
|
+
const driver = getStorageDriver();
|
|
78
|
+
if (!driver)
|
|
79
|
+
return null;
|
|
80
|
+
return driver.getItem(prefixKey(key)) ?? null;
|
|
81
|
+
},
|
|
82
|
+
setItem(key, value) {
|
|
83
|
+
const driver = getStorageDriver();
|
|
84
|
+
if (!driver)
|
|
85
|
+
return;
|
|
86
|
+
driver.setItem(prefixKey(key), value);
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
globalCache.instances.set(namespace, storage);
|
|
90
|
+
return storage;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* create a single-value storage (wrapper around createStorage)
|
|
94
|
+
* @param key - unique storage key
|
|
95
|
+
* @returns storage value instance
|
|
96
|
+
* @example
|
|
97
|
+
* const token = createStorageValue<string>('auth-token')
|
|
98
|
+
* token.set('abc123')
|
|
99
|
+
* token.get() // 'abc123'
|
|
100
|
+
*/
|
|
101
|
+
export function createStorageValue(key) {
|
|
102
|
+
const storage = createStorage(`_v:${key}`);
|
|
103
|
+
return {
|
|
104
|
+
get: () => storage.get('value'),
|
|
105
|
+
set: (value) => storage.set('value', value),
|
|
106
|
+
remove: () => storage.remove('value'),
|
|
107
|
+
has: () => storage.has('value'),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=createStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createStorage.js","sourceRoot":"","sources":["../../src/storage/createStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { StorageDriver } from './types.js';
|
|
2
|
+
export declare function setStorageDriver(d: StorageDriver): void;
|
|
3
|
+
export declare function clearStorageDriver(): void;
|
|
4
|
+
export declare function getStorageDriver(): StorageDriver | null;
|
|
5
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/storage/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI/C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAEvD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAWvD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
let driver = null;
|
|
2
|
+
export function setStorageDriver(d) {
|
|
3
|
+
driver = d;
|
|
4
|
+
}
|
|
5
|
+
export function clearStorageDriver() {
|
|
6
|
+
driver = null;
|
|
7
|
+
}
|
|
8
|
+
export function getStorageDriver() {
|
|
9
|
+
if (driver)
|
|
10
|
+
return driver;
|
|
11
|
+
if (typeof localStorage !== 'undefined' && typeof localStorage.getItem === 'function') {
|
|
12
|
+
return {
|
|
13
|
+
getItem: (key) => localStorage.getItem(key),
|
|
14
|
+
setItem: (key, value) => localStorage.setItem(key, value),
|
|
15
|
+
removeItem: (key) => localStorage.removeItem(key),
|
|
16
|
+
getAllKeys: () => Object.keys(localStorage),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../src/storage/driver.ts"],"names":[],"mappings":"AAEA,IAAI,MAAM,GAAyB,IAAI,CAAA;AAEvC,MAAM,UAAU,gBAAgB,CAAC,CAAgB;IAC/C,MAAM,GAAG,CAAC,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,IAAI,CAAA;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,IAAI,OAAO,YAAY,KAAK,WAAW,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACtF,OAAO;YACL,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC;YAC3C,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YACzD,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC;YACjD,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;SAC5C,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC/C,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,UAAU,IAAI,MAAM,EAAE,CAAA;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"randomId.d.ts","sourceRoot":"","sources":["../../src/string/randomId.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,QAAO,MAA6C,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"randomId.js","sourceRoot":"","sources":["../../src/string/randomId.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slugify.d.ts","sourceRoot":"","sources":["../../src/string/slugify.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,MAMd,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const slugify = (input) => input
|
|
2
|
+
.toLowerCase()
|
|
3
|
+
.replace(/[\s_]+/g, '-') // convert spaces and underscores to dashes
|
|
4
|
+
.replace(/[^a-z0-9-]/g, '') // remove all non-alphanumeric except dashes
|
|
5
|
+
.replace(/-+/g, '-') // replace multiple dashes with single dash
|
|
6
|
+
.replace(/^-|-$/g, ''); // remove leading/trailing dashes
|
|
7
|
+
//# sourceMappingURL=slugify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slugify.js","sourceRoot":"","sources":["../../src/string/slugify.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CAC/C,KAAK;KACF,WAAW,EAAE;KACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,2CAA2C;KACnE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,4CAA4C;KACvE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,2CAA2C;KAC/D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA,CAAC,iCAAiC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface MsFunction {
|
|
2
|
+
(n: number): number;
|
|
3
|
+
seconds: (n: number) => number;
|
|
4
|
+
minutes: (n: number) => number;
|
|
5
|
+
hours: (n: number) => number;
|
|
6
|
+
days: (n: number) => number;
|
|
7
|
+
weeks: (n: number) => number;
|
|
8
|
+
}
|
|
9
|
+
interface SecondFunction {
|
|
10
|
+
(n: number): number;
|
|
11
|
+
minutes: (n: number) => number;
|
|
12
|
+
hours: (n: number) => number;
|
|
13
|
+
days: (n: number) => number;
|
|
14
|
+
weeks: (n: number) => number;
|
|
15
|
+
}
|
|
16
|
+
interface MinuteFunction {
|
|
17
|
+
(n: number): number;
|
|
18
|
+
hours: (n: number) => number;
|
|
19
|
+
days: (n: number) => number;
|
|
20
|
+
weeks: (n: number) => number;
|
|
21
|
+
}
|
|
22
|
+
export declare const time: {
|
|
23
|
+
ms: MsFunction;
|
|
24
|
+
second: SecondFunction;
|
|
25
|
+
minute: MinuteFunction;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/time/time.ts"],"names":[],"mappings":"AAAA,UAAU,UAAU;IAClB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9B,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAC7B;AAED,UAAU,cAAc;IACtB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAC7B;AAED,UAAU,cAAc;IACtB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC5B,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAC7B;AAoBD,eAAO,MAAM,IAAI,EAAE;IACjB,EAAE,EAAE,UAAU,CAAA;IACd,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,cAAc,CAAA;CAKvB,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const ms = ((n) => n);
|
|
2
|
+
ms.seconds = (n) => n * 1000;
|
|
3
|
+
ms.minutes = (n) => ms.seconds(n * 60);
|
|
4
|
+
ms.hours = (n) => ms.minutes(n * 60);
|
|
5
|
+
ms.days = (n) => ms.hours(n * 24);
|
|
6
|
+
ms.weeks = (n) => ms.days(n * 7);
|
|
7
|
+
const second = ((n) => n);
|
|
8
|
+
second.minutes = (n) => n * 60;
|
|
9
|
+
second.hours = (n) => second.minutes(n * 60);
|
|
10
|
+
second.days = (n) => second.hours(n * 24);
|
|
11
|
+
second.weeks = (n) => second.days(n * 7);
|
|
12
|
+
const minute = ((n) => n * 60);
|
|
13
|
+
minute.hours = (n) => minute(n * 60);
|
|
14
|
+
minute.days = (n) => minute.hours(n * 24);
|
|
15
|
+
minute.weeks = (n) => minute.days(n * 7);
|
|
16
|
+
export const time = {
|
|
17
|
+
ms,
|
|
18
|
+
second,
|
|
19
|
+
minute,
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/time/time.ts"],"names":[],"mappings":"AAwBA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAe,CAAA;AAC3C,EAAE,CAAC,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;AACpC,EAAE,CAAC,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AAC9C,EAAE,CAAC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AAC5C,EAAE,CAAC,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AACzC,EAAE,CAAC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAExC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAmB,CAAA;AACnD,MAAM,CAAC,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;AACtC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AACpD,MAAM,CAAC,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AACjD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAEhD,MAAM,MAAM,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAmB,CAAA;AACxD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AAC5C,MAAM,CAAC,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;AACjD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAEhD,MAAM,CAAC,MAAM,IAAI,GAIb;IACF,EAAE;IACF,MAAM;IACN,MAAM;CACP,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@o/helpers",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Small browser, React, storage, string, and timing helpers used by Orez consumers.
|
|
3
|
+
"version": "0.16.14",
|
|
4
|
+
"description": "Small browser, React, storage, string, and timing helpers used by Orez consumers.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -10,6 +10,34 @@
|
|
|
10
10
|
},
|
|
11
11
|
"type": "module",
|
|
12
12
|
"sideEffects": false,
|
|
13
|
+
"main": "dist/index.js",
|
|
14
|
+
"module": "dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
"./package.json": "./package.json",
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"react-native": "./dist/index.native.js",
|
|
21
|
+
"import": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"LICENSE",
|
|
28
|
+
"README.md"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
32
|
+
"format": "oxfmt",
|
|
33
|
+
"format:check": "oxfmt --check",
|
|
34
|
+
"lint": "oxlint src",
|
|
35
|
+
"test": "bun test src",
|
|
36
|
+
"typecheck": "tsc --noEmit -p tsconfig.json"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"dequal": "^2.0.3"
|
|
40
|
+
},
|
|
13
41
|
"peerDependencies": {
|
|
14
42
|
"react": "*",
|
|
15
43
|
"react-native": "*"
|
|
@@ -22,6 +50,15 @@
|
|
|
22
50
|
"optional": true
|
|
23
51
|
}
|
|
24
52
|
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/bun": "1.3.14",
|
|
55
|
+
"@types/react": "^19.0.0",
|
|
56
|
+
"oxfmt": "0.28.0",
|
|
57
|
+
"oxlint": "1.43.0",
|
|
58
|
+
"react": "^19.0.0",
|
|
59
|
+
"react-native": "*",
|
|
60
|
+
"typescript": "5.9.3"
|
|
61
|
+
},
|
|
25
62
|
"publishConfig": {
|
|
26
63
|
"access": "public"
|
|
27
64
|
}
|