silosdk 0.0.9 → 0.0.10

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 (52) hide show
  1. package/README.md +16 -5
  2. package/dist/internal/indexed-db.cjs +44 -0
  3. package/dist/internal/indexed-db.mjs +41 -0
  4. package/dist/media/shared.cjs +99 -0
  5. package/dist/media/shared.d.cts +26 -0
  6. package/dist/media/shared.d.mts +26 -0
  7. package/dist/media/shared.mjs +93 -0
  8. package/dist/media/storage.native.cjs +102 -0
  9. package/dist/media/storage.native.mjs +101 -0
  10. package/dist/media/storage.web.cjs +79 -0
  11. package/dist/media/storage.web.mjs +78 -0
  12. package/dist/media.cjs +5 -163
  13. package/dist/media.d.cts +7 -27
  14. package/dist/media.d.mts +7 -27
  15. package/dist/media.mjs +4 -161
  16. package/dist/media.web.cjs +9 -0
  17. package/dist/media.web.d.cts +12 -0
  18. package/dist/media.web.d.mts +12 -0
  19. package/dist/media.web.mjs +8 -0
  20. package/dist/settings/shared.cjs +63 -0
  21. package/dist/settings/shared.d.cts +19 -0
  22. package/dist/settings/shared.d.mts +19 -0
  23. package/dist/settings/shared.mjs +59 -0
  24. package/dist/settings/storage.native.cjs +24 -0
  25. package/dist/settings/storage.native.mjs +22 -0
  26. package/dist/settings/storage.web.cjs +34 -0
  27. package/dist/settings/storage.web.mjs +34 -0
  28. package/dist/settings.cjs +4 -66
  29. package/dist/settings.d.cts +4 -18
  30. package/dist/settings.d.mts +4 -18
  31. package/dist/settings.mjs +4 -64
  32. package/dist/settings.web.cjs +8 -0
  33. package/dist/settings.web.d.cts +6 -0
  34. package/dist/settings.web.d.mts +6 -0
  35. package/dist/settings.web.mjs +8 -0
  36. package/dist/store/shared.cjs +338 -0
  37. package/dist/store/shared.d.cts +58 -0
  38. package/dist/store/shared.d.mts +58 -0
  39. package/dist/store/shared.mjs +333 -0
  40. package/dist/store/storage.native.cjs +133 -0
  41. package/dist/store/storage.native.mjs +132 -0
  42. package/dist/store/storage.web.cjs +142 -0
  43. package/dist/store/storage.web.mjs +142 -0
  44. package/dist/store.cjs +4 -421
  45. package/dist/store.d.cts +4 -58
  46. package/dist/store.d.mts +4 -58
  47. package/dist/store.mjs +4 -421
  48. package/dist/store.web.cjs +15 -0
  49. package/dist/store.web.d.cts +7 -0
  50. package/dist/store.web.d.mts +7 -0
  51. package/dist/store.web.mjs +12 -0
  52. package/package.json +31 -1
@@ -0,0 +1,59 @@
1
+ import { mutationOptions, queryOptions } from "@tanstack/react-query";
2
+
3
+ //#region src/settings/shared.ts
4
+ const settingNames = /* @__PURE__ */ new Set();
5
+ const settingNamePattern = /^[A-Za-z][A-Za-z0-9_.:-]*$/;
6
+ function createSettingApi(storage) {
7
+ function setting(name, defaultValue) {
8
+ assertSettingName(name);
9
+ assertSettingValue(resolveDefault(defaultValue));
10
+ if (settingNames.has(name)) throw new Error(`Setting "${name}" is already registered. Define each setting once and import the existing setting instead.`);
11
+ settingNames.add(name);
12
+ const queryKey = [
13
+ "silo",
14
+ "setting",
15
+ name
16
+ ];
17
+ return {
18
+ name,
19
+ defaultValue,
20
+ queryKey,
21
+ queryOptions() {
22
+ return queryOptions({
23
+ queryKey,
24
+ queryFn: () => storage.read(name, defaultValue)
25
+ });
26
+ },
27
+ mutationOptions(options = {}) {
28
+ return mutationOptions({
29
+ mutationKey: queryKey,
30
+ mutationFn: async (valueOrUpdater) => {
31
+ const current = await storage.read(name, defaultValue);
32
+ const next = typeof valueOrUpdater === "function" ? valueOrUpdater(current) : valueOrUpdater;
33
+ await storage.write(name, next);
34
+ return next;
35
+ },
36
+ onSuccess(value) {
37
+ options.queryClient?.setQueryData(queryKey, value);
38
+ }
39
+ });
40
+ }
41
+ };
42
+ }
43
+ return { setting };
44
+ }
45
+ function storageKey(name) {
46
+ return `silo:setting:${name}`;
47
+ }
48
+ function resolveDefault(defaultValue) {
49
+ return typeof defaultValue === "function" ? defaultValue() : defaultValue;
50
+ }
51
+ function assertSettingValue(value) {
52
+ if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean" && value !== null) throw new Error("Settings must be strings, numbers, booleans, or null.");
53
+ }
54
+ function assertSettingName(name) {
55
+ if (!settingNamePattern.test(name)) throw new Error(`Setting names must start with a letter and contain only letters, numbers, underscores, dots, colons, or hyphens. Received "${name}".`);
56
+ }
57
+
58
+ //#endregion
59
+ export { assertSettingValue, createSettingApi, resolveDefault, storageKey };
@@ -0,0 +1,24 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_shared = require('./shared.cjs');
3
+ let expo_sqlite_kv_store = require("expo-sqlite/kv-store");
4
+ expo_sqlite_kv_store = require_rolldown_runtime.__toESM(expo_sqlite_kv_store);
5
+
6
+ //#region src/settings/storage.native.ts
7
+ const settingsStorage = {
8
+ read,
9
+ write
10
+ };
11
+ function read(name, defaultValue) {
12
+ const stored = expo_sqlite_kv_store.default.getItemSync(require_shared.storageKey(name));
13
+ if (stored === null) return require_shared.resolveDefault(defaultValue);
14
+ const value = JSON.parse(stored);
15
+ require_shared.assertSettingValue(value);
16
+ return value;
17
+ }
18
+ function write(name, value) {
19
+ require_shared.assertSettingValue(value);
20
+ expo_sqlite_kv_store.default.setItemSync(require_shared.storageKey(name), JSON.stringify(value));
21
+ }
22
+
23
+ //#endregion
24
+ exports.settingsStorage = settingsStorage;
@@ -0,0 +1,22 @@
1
+ import { assertSettingValue, resolveDefault, storageKey } from "./shared.mjs";
2
+ import Storage from "expo-sqlite/kv-store";
3
+
4
+ //#region src/settings/storage.native.ts
5
+ const settingsStorage = {
6
+ read,
7
+ write
8
+ };
9
+ function read(name, defaultValue) {
10
+ const stored = Storage.getItemSync(storageKey(name));
11
+ if (stored === null) return resolveDefault(defaultValue);
12
+ const value = JSON.parse(stored);
13
+ assertSettingValue(value);
14
+ return value;
15
+ }
16
+ function write(name, value) {
17
+ assertSettingValue(value);
18
+ Storage.setItemSync(storageKey(name), JSON.stringify(value));
19
+ }
20
+
21
+ //#endregion
22
+ export { settingsStorage };
@@ -0,0 +1,34 @@
1
+ const require_indexed_db = require('../internal/indexed-db.cjs');
2
+ const require_shared = require('./shared.cjs');
3
+
4
+ //#region src/settings/storage.web.ts
5
+ const settingsStorage = {
6
+ read,
7
+ write
8
+ };
9
+ const openSiloSettingsIndexedDb = require_indexed_db.createIndexedDbOpener("silo-settings", 1, (db) => {
10
+ if (!db.objectStoreNames.contains("settings")) db.createObjectStore("settings", { keyPath: "key" });
11
+ });
12
+ async function read(name, defaultValue) {
13
+ const transaction = (await openSiloSettingsIndexedDb()).transaction("settings", "readonly");
14
+ const done = require_indexed_db.transactionDone(transaction);
15
+ const row = await require_indexed_db.requestResult(transaction.objectStore("settings").get(require_shared.storageKey(name)));
16
+ await done;
17
+ if (!row) return require_shared.resolveDefault(defaultValue);
18
+ const value = JSON.parse(row.value);
19
+ require_shared.assertSettingValue(value);
20
+ return value;
21
+ }
22
+ async function write(name, value) {
23
+ require_shared.assertSettingValue(value);
24
+ const transaction = (await openSiloSettingsIndexedDb()).transaction("settings", "readwrite");
25
+ transaction.objectStore("settings").put({
26
+ key: require_shared.storageKey(name),
27
+ value: JSON.stringify(value),
28
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
29
+ });
30
+ await require_indexed_db.transactionDone(transaction);
31
+ }
32
+
33
+ //#endregion
34
+ exports.settingsStorage = settingsStorage;
@@ -0,0 +1,34 @@
1
+ import { createIndexedDbOpener, requestResult, transactionDone } from "../internal/indexed-db.mjs";
2
+ import { assertSettingValue, resolveDefault, storageKey } from "./shared.mjs";
3
+
4
+ //#region src/settings/storage.web.ts
5
+ const settingsStorage = {
6
+ read,
7
+ write
8
+ };
9
+ const openSiloSettingsIndexedDb = createIndexedDbOpener("silo-settings", 1, (db) => {
10
+ if (!db.objectStoreNames.contains("settings")) db.createObjectStore("settings", { keyPath: "key" });
11
+ });
12
+ async function read(name, defaultValue) {
13
+ const transaction = (await openSiloSettingsIndexedDb()).transaction("settings", "readonly");
14
+ const done = transactionDone(transaction);
15
+ const row = await requestResult(transaction.objectStore("settings").get(storageKey(name)));
16
+ await done;
17
+ if (!row) return resolveDefault(defaultValue);
18
+ const value = JSON.parse(row.value);
19
+ assertSettingValue(value);
20
+ return value;
21
+ }
22
+ async function write(name, value) {
23
+ assertSettingValue(value);
24
+ const transaction = (await openSiloSettingsIndexedDb()).transaction("settings", "readwrite");
25
+ transaction.objectStore("settings").put({
26
+ key: storageKey(name),
27
+ value: JSON.stringify(value),
28
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
29
+ });
30
+ await transactionDone(transaction);
31
+ }
32
+
33
+ //#endregion
34
+ export { settingsStorage };
package/dist/settings.cjs CHANGED
@@ -1,70 +1,8 @@
1
- const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs');
2
- let __tanstack_react_query = require("@tanstack/react-query");
3
- let expo_sqlite_kv_store = require("expo-sqlite/kv-store");
4
- expo_sqlite_kv_store = require_rolldown_runtime.__toESM(expo_sqlite_kv_store);
1
+ const require_shared = require('./settings/shared.cjs');
2
+ const require_storage_native = require('./settings/storage.native.cjs');
5
3
 
6
- //#region src/settings/index.ts
7
- const settingNames = /* @__PURE__ */ new Set();
8
- const settingNamePattern = /^[A-Za-z][A-Za-z0-9_.:-]*$/;
9
- function setting(name, defaultValue) {
10
- assertSettingName(name);
11
- assertSettingValue(resolveDefault(defaultValue));
12
- if (settingNames.has(name)) throw new Error(`Setting "${name}" is already registered. Define each setting once and import the existing setting instead.`);
13
- settingNames.add(name);
14
- const queryKey = [
15
- "silo",
16
- "setting",
17
- name
18
- ];
19
- return {
20
- name,
21
- defaultValue,
22
- queryKey,
23
- queryOptions() {
24
- return (0, __tanstack_react_query.queryOptions)({
25
- queryKey,
26
- queryFn: () => readSetting(name, defaultValue)
27
- });
28
- },
29
- mutationOptions(options = {}) {
30
- return (0, __tanstack_react_query.mutationOptions)({
31
- mutationKey: queryKey,
32
- mutationFn: async (valueOrUpdater) => {
33
- const current = readSetting(name, defaultValue);
34
- const next = typeof valueOrUpdater === "function" ? valueOrUpdater(current) : valueOrUpdater;
35
- writeSetting(name, next);
36
- return next;
37
- },
38
- onSuccess(value) {
39
- options.queryClient?.setQueryData(queryKey, value);
40
- }
41
- });
42
- }
43
- };
44
- }
45
- function readSetting(name, defaultValue) {
46
- const stored = expo_sqlite_kv_store.default.getItemSync(storageKey(name));
47
- if (stored === null) return resolveDefault(defaultValue);
48
- const value = JSON.parse(stored);
49
- assertSettingValue(value);
50
- return value;
51
- }
52
- function writeSetting(name, value) {
53
- assertSettingValue(value);
54
- expo_sqlite_kv_store.default.setItemSync(storageKey(name), JSON.stringify(value));
55
- }
56
- function storageKey(name) {
57
- return `silo:setting:${name}`;
58
- }
59
- function resolveDefault(defaultValue) {
60
- return typeof defaultValue === "function" ? defaultValue() : defaultValue;
61
- }
62
- function assertSettingName(name) {
63
- if (!settingNamePattern.test(name)) throw new Error(`Setting names must start with a letter and contain only letters, numbers, underscores, dots, colons, or hyphens. Received "${name}".`);
64
- }
65
- function assertSettingValue(value) {
66
- if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean" && value !== null) throw new Error("Settings must be strings, numbers, booleans, or null.");
67
- }
4
+ //#region src/settings/index.native.ts
5
+ const { setting } = require_shared.createSettingApi(require_storage_native.settingsStorage);
68
6
 
69
7
  //#endregion
70
8
  exports.setting = setting;
@@ -1,20 +1,6 @@
1
- import { QueryClient, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
1
+ import { Setting, SettingDefault, SettingMutation, SettingMutationOptions, SettingQueryKey, SettingValue } from "./settings/shared.cjs";
2
2
 
3
- //#region src/settings/index.d.ts
4
- type SettingValue = string | number | boolean | null;
5
- type SettingDefault<T extends SettingValue> = T | (() => T);
6
- type SettingMutation<T extends SettingValue> = T | ((current: T) => T);
7
- type SettingQueryKey = readonly ['silo', 'setting', string];
8
- type SettingMutationOptions = {
9
- queryClient?: QueryClient;
10
- };
11
- type Setting<T extends SettingValue> = {
12
- readonly name: string;
13
- readonly defaultValue: SettingDefault<T>;
14
- readonly queryKey: SettingQueryKey;
15
- queryOptions(): UseQueryOptions<T, Error, T, SettingQueryKey>;
16
- mutationOptions(options?: SettingMutationOptions): UseMutationOptions<T, Error, SettingMutation<T>>;
17
- };
18
- declare function setting<T extends SettingValue>(name: string, defaultValue: SettingDefault<T>): Setting<T>;
3
+ //#region src/settings/index.native.d.ts
4
+ declare const setting: <T extends SettingValue>(name: string, defaultValue: SettingDefault<T>) => Setting<T>;
19
5
  //#endregion
20
- export { Setting, SettingDefault, SettingMutation, SettingMutationOptions, SettingQueryKey, SettingValue, setting };
6
+ export { type Setting, type SettingDefault, type SettingMutation, type SettingMutationOptions, type SettingQueryKey, type SettingValue, setting };
@@ -1,20 +1,6 @@
1
- import { QueryClient, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
1
+ import { Setting, SettingDefault, SettingMutation, SettingMutationOptions, SettingQueryKey, SettingValue } from "./settings/shared.mjs";
2
2
 
3
- //#region src/settings/index.d.ts
4
- type SettingValue = string | number | boolean | null;
5
- type SettingDefault<T extends SettingValue> = T | (() => T);
6
- type SettingMutation<T extends SettingValue> = T | ((current: T) => T);
7
- type SettingQueryKey = readonly ['silo', 'setting', string];
8
- type SettingMutationOptions = {
9
- queryClient?: QueryClient;
10
- };
11
- type Setting<T extends SettingValue> = {
12
- readonly name: string;
13
- readonly defaultValue: SettingDefault<T>;
14
- readonly queryKey: SettingQueryKey;
15
- queryOptions(): UseQueryOptions<T, Error, T, SettingQueryKey>;
16
- mutationOptions(options?: SettingMutationOptions): UseMutationOptions<T, Error, SettingMutation<T>>;
17
- };
18
- declare function setting<T extends SettingValue>(name: string, defaultValue: SettingDefault<T>): Setting<T>;
3
+ //#region src/settings/index.native.d.ts
4
+ declare const setting: <T extends SettingValue>(name: string, defaultValue: SettingDefault<T>) => Setting<T>;
19
5
  //#endregion
20
- export { Setting, SettingDefault, SettingMutation, SettingMutationOptions, SettingQueryKey, SettingValue, setting };
6
+ export { type Setting, type SettingDefault, type SettingMutation, type SettingMutationOptions, type SettingQueryKey, type SettingValue, setting };
package/dist/settings.mjs CHANGED
@@ -1,68 +1,8 @@
1
- import { mutationOptions, queryOptions } from "@tanstack/react-query";
2
- import Storage from "expo-sqlite/kv-store";
1
+ import { createSettingApi } from "./settings/shared.mjs";
2
+ import { settingsStorage } from "./settings/storage.native.mjs";
3
3
 
4
- //#region src/settings/index.ts
5
- const settingNames = /* @__PURE__ */ new Set();
6
- const settingNamePattern = /^[A-Za-z][A-Za-z0-9_.:-]*$/;
7
- function setting(name, defaultValue) {
8
- assertSettingName(name);
9
- assertSettingValue(resolveDefault(defaultValue));
10
- if (settingNames.has(name)) throw new Error(`Setting "${name}" is already registered. Define each setting once and import the existing setting instead.`);
11
- settingNames.add(name);
12
- const queryKey = [
13
- "silo",
14
- "setting",
15
- name
16
- ];
17
- return {
18
- name,
19
- defaultValue,
20
- queryKey,
21
- queryOptions() {
22
- return queryOptions({
23
- queryKey,
24
- queryFn: () => readSetting(name, defaultValue)
25
- });
26
- },
27
- mutationOptions(options = {}) {
28
- return mutationOptions({
29
- mutationKey: queryKey,
30
- mutationFn: async (valueOrUpdater) => {
31
- const current = readSetting(name, defaultValue);
32
- const next = typeof valueOrUpdater === "function" ? valueOrUpdater(current) : valueOrUpdater;
33
- writeSetting(name, next);
34
- return next;
35
- },
36
- onSuccess(value) {
37
- options.queryClient?.setQueryData(queryKey, value);
38
- }
39
- });
40
- }
41
- };
42
- }
43
- function readSetting(name, defaultValue) {
44
- const stored = Storage.getItemSync(storageKey(name));
45
- if (stored === null) return resolveDefault(defaultValue);
46
- const value = JSON.parse(stored);
47
- assertSettingValue(value);
48
- return value;
49
- }
50
- function writeSetting(name, value) {
51
- assertSettingValue(value);
52
- Storage.setItemSync(storageKey(name), JSON.stringify(value));
53
- }
54
- function storageKey(name) {
55
- return `silo:setting:${name}`;
56
- }
57
- function resolveDefault(defaultValue) {
58
- return typeof defaultValue === "function" ? defaultValue() : defaultValue;
59
- }
60
- function assertSettingName(name) {
61
- if (!settingNamePattern.test(name)) throw new Error(`Setting names must start with a letter and contain only letters, numbers, underscores, dots, colons, or hyphens. Received "${name}".`);
62
- }
63
- function assertSettingValue(value) {
64
- if (typeof value !== "string" && typeof value !== "number" && typeof value !== "boolean" && value !== null) throw new Error("Settings must be strings, numbers, booleans, or null.");
65
- }
4
+ //#region src/settings/index.native.ts
5
+ const { setting } = createSettingApi(settingsStorage);
66
6
 
67
7
  //#endregion
68
8
  export { setting };
@@ -0,0 +1,8 @@
1
+ const require_shared = require('./settings/shared.cjs');
2
+ const require_storage_web = require('./settings/storage.web.cjs');
3
+
4
+ //#region src/settings/index.web.ts
5
+ const { setting } = require_shared.createSettingApi(require_storage_web.settingsStorage);
6
+
7
+ //#endregion
8
+ exports.setting = setting;
@@ -0,0 +1,6 @@
1
+ import { Setting, SettingDefault, SettingMutation, SettingMutationOptions, SettingQueryKey, SettingValue } from "./settings/shared.cjs";
2
+
3
+ //#region src/settings/index.web.d.ts
4
+ declare const setting: <T extends SettingValue>(name: string, defaultValue: SettingDefault<T>) => Setting<T>;
5
+ //#endregion
6
+ export { type Setting, type SettingDefault, type SettingMutation, type SettingMutationOptions, type SettingQueryKey, type SettingValue, setting };
@@ -0,0 +1,6 @@
1
+ import { Setting, SettingDefault, SettingMutation, SettingMutationOptions, SettingQueryKey, SettingValue } from "./settings/shared.mjs";
2
+
3
+ //#region src/settings/index.web.d.ts
4
+ declare const setting: <T extends SettingValue>(name: string, defaultValue: SettingDefault<T>) => Setting<T>;
5
+ //#endregion
6
+ export { type Setting, type SettingDefault, type SettingMutation, type SettingMutationOptions, type SettingQueryKey, type SettingValue, setting };
@@ -0,0 +1,8 @@
1
+ import { createSettingApi } from "./settings/shared.mjs";
2
+ import { settingsStorage } from "./settings/storage.web.mjs";
3
+
4
+ //#region src/settings/index.web.ts
5
+ const { setting } = createSettingApi(settingsStorage);
6
+
7
+ //#endregion
8
+ export { setting };