@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.
Files changed (102) hide show
  1. package/README.md +7 -0
  2. package/dist/assert.d.ts +5 -0
  3. package/dist/assert.d.ts.map +1 -0
  4. package/dist/assert.js +26 -0
  5. package/dist/assert.js.map +1 -0
  6. package/dist/async/abortable.d.ts +9 -0
  7. package/dist/async/abortable.d.ts.map +1 -0
  8. package/dist/async/abortable.js +45 -0
  9. package/dist/async/abortable.js.map +1 -0
  10. package/dist/async/sleep.d.ts +2 -0
  11. package/dist/async/sleep.d.ts.map +1 -0
  12. package/dist/async/sleep.js +8 -0
  13. package/dist/async/sleep.js.map +1 -0
  14. package/dist/async/useAsyncEffect.d.ts +11 -0
  15. package/dist/async/useAsyncEffect.d.ts.map +1 -0
  16. package/dist/async/useAsyncEffect.js +99 -0
  17. package/dist/async/useAsyncEffect.js.map +1 -0
  18. package/dist/browser/isActiveElementFormField.d.ts +2 -0
  19. package/dist/browser/isActiveElementFormField.d.ts.map +1 -0
  20. package/dist/browser/isActiveElementFormField.js +9 -0
  21. package/dist/browser/isActiveElementFormField.js.map +1 -0
  22. package/dist/browser/openPopup.d.ts +2 -0
  23. package/dist/browser/openPopup.d.ts.map +1 -0
  24. package/dist/browser/openPopup.js +21 -0
  25. package/dist/browser/openPopup.js.map +1 -0
  26. package/dist/constants.d.ts +9 -0
  27. package/dist/constants.d.ts.map +1 -0
  28. package/dist/constants.js +22 -0
  29. package/dist/constants.js.map +1 -0
  30. package/dist/emitter.d.ts +72 -0
  31. package/dist/emitter.d.ts.map +1 -0
  32. package/dist/emitter.js +273 -0
  33. package/dist/emitter.js.map +1 -0
  34. package/dist/error/errors.d.ts +23 -0
  35. package/dist/error/errors.d.ts.map +1 -0
  36. package/dist/error/errors.js +38 -0
  37. package/dist/error/errors.js.map +1 -0
  38. package/dist/global/globalValue.d.ts +23 -0
  39. package/dist/global/globalValue.d.ts.map +1 -0
  40. package/dist/global/globalValue.js +33 -0
  41. package/dist/global/globalValue.js.map +1 -0
  42. package/dist/index.d.ts +3 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +3 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/index.native.d.ts +3 -0
  47. package/dist/index.native.d.ts.map +1 -0
  48. package/dist/index.native.js +3 -0
  49. package/dist/index.native.js.map +1 -0
  50. package/dist/object/isEqualIdentity.d.ts +2 -0
  51. package/dist/object/isEqualIdentity.d.ts.map +1 -0
  52. package/dist/object/isEqualIdentity.js +2 -0
  53. package/dist/object/isEqualIdentity.js.map +1 -0
  54. package/dist/object/isEqualNever.d.ts +2 -0
  55. package/dist/object/isEqualNever.d.ts.map +1 -0
  56. package/dist/object/isEqualNever.js +2 -0
  57. package/dist/object/isEqualNever.js.map +1 -0
  58. package/dist/platform.d.ts +23 -0
  59. package/dist/platform.d.ts.map +1 -0
  60. package/dist/platform.js +60 -0
  61. package/dist/platform.js.map +1 -0
  62. package/dist/platform.native.d.ts +25 -0
  63. package/dist/platform.native.d.ts.map +1 -0
  64. package/dist/platform.native.js +52 -0
  65. package/dist/platform.native.js.map +1 -0
  66. package/dist/react/createGlobalContext.d.ts +3 -0
  67. package/dist/react/createGlobalContext.d.ts.map +1 -0
  68. package/dist/react/createGlobalContext.js +8 -0
  69. package/dist/react/createGlobalContext.js.map +1 -0
  70. package/dist/react/getCurrentComponentStack.d.ts +2 -0
  71. package/dist/react/getCurrentComponentStack.d.ts.map +1 -0
  72. package/dist/react/getCurrentComponentStack.js +46 -0
  73. package/dist/react/getCurrentComponentStack.js.map +1 -0
  74. package/dist/shared.d.ts +17 -0
  75. package/dist/shared.d.ts.map +1 -0
  76. package/dist/shared.js +16 -0
  77. package/dist/shared.js.map +1 -0
  78. package/dist/storage/createStorage.d.ts +58 -0
  79. package/dist/storage/createStorage.d.ts.map +1 -0
  80. package/dist/storage/createStorage.js +110 -0
  81. package/dist/storage/createStorage.js.map +1 -0
  82. package/dist/storage/driver.d.ts +5 -0
  83. package/dist/storage/driver.d.ts.map +1 -0
  84. package/dist/storage/driver.js +21 -0
  85. package/dist/storage/driver.js.map +1 -0
  86. package/dist/storage/types.d.ts +7 -0
  87. package/dist/storage/types.d.ts.map +1 -0
  88. package/dist/storage/types.js +2 -0
  89. package/dist/storage/types.js.map +1 -0
  90. package/dist/string/randomId.d.ts +2 -0
  91. package/dist/string/randomId.d.ts.map +1 -0
  92. package/dist/string/randomId.js +2 -0
  93. package/dist/string/randomId.js.map +1 -0
  94. package/dist/string/slugify.d.ts +2 -0
  95. package/dist/string/slugify.d.ts.map +1 -0
  96. package/dist/string/slugify.js +7 -0
  97. package/dist/string/slugify.js.map +1 -0
  98. package/dist/time/time.d.ts +28 -0
  99. package/dist/time/time.d.ts.map +1 -0
  100. package/dist/time/time.js +21 -0
  101. package/dist/time/time.js.map +1 -0
  102. 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,3 @@
1
+ import { type Context } from 'react';
2
+ export declare function createGlobalContext<T>(key: string, defaultValue: T): Context<T>;
3
+ //# sourceMappingURL=createGlobalContext.d.ts.map
@@ -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,2 @@
1
+ export declare const getCurrentComponentStack: (format?: "short") => string;
2
+ //# sourceMappingURL=getCurrentComponentStack.d.ts.map
@@ -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"}
@@ -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,7 @@
1
+ export interface StorageDriver {
2
+ getItem(key: string): string | null | undefined;
3
+ setItem(key: string, value: string): void;
4
+ removeItem(key: string): void;
5
+ getAllKeys(): string[];
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/storage/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const randomId: () => string;
2
+ //# sourceMappingURL=randomId.d.ts.map
@@ -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,2 @@
1
+ export const randomId = () => Math.random().toString(36).slice(2);
2
+ //# sourceMappingURL=randomId.js.map
@@ -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,2 @@
1
+ export declare const slugify: (input: string) => string;
2
+ //# sourceMappingURL=slugify.d.ts.map
@@ -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.0.0-bootstrap.0",
4
- "description": "Small browser, React, storage, string, and timing helpers used by Orez consumers. (package-name bootstrap only)",
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
  }