@stimulus-library/mixins 1.0.0-alpha.4 → 1.0.0-alpha.8

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.
@@ -72,7 +72,6 @@ function getElementLoadValue(element) {
72
72
  let options = Array.from(element.options);
73
73
  options.forEach((option) => {
74
74
  if (option.defaultSelected) {
75
- element.value = option.value;
76
75
  return option.value;
77
76
  }
78
77
  });
@@ -12,9 +12,10 @@ export interface LocalStorageProxy<T> {
12
12
  clear(): void;
13
13
  isEmpty(): boolean;
14
14
  }
15
- export declare const StorageSerializers: Record<'boolean' | 'object' | 'number' | 'any' | 'string' | 'map' | 'set', Serializer<any>> & {
15
+ export declare const StorageSerializers: Record<"boolean" | "object" | "number" | "any" | "string" | "map" | "set", Serializer<any>> & {
16
16
  [idx: string]: Serializer<any>;
17
17
  };
18
- export declare function useLocalStorage<T>(controller: Controller, key: string, defaultValue: T, opts?: {
19
- writeDefaults: boolean;
18
+ export declare function useLocalStorage<T>(controller: Controller, key: string, defaultValue?: any, opts?: {
19
+ onChange?: ((newValue: any, oldValue: any) => void) | null;
20
+ writeDefaults?: boolean;
20
21
  }): LocalStorageProxy<T>;
@@ -1,39 +1,39 @@
1
1
  import { reactive } from "@stimulus-library/utilities";
2
2
  export const StorageSerializers = {
3
3
  boolean: {
4
- deserialize: (v) => v === 'true',
4
+ deserialize: (v) => v === "true",
5
5
  serialize: (v) => String(v),
6
- isEmpty: (v) => v === '' || v === null,
6
+ isEmpty: (v) => v === "" || v === null,
7
7
  },
8
8
  object: {
9
9
  deserialize: (v) => JSON.parse(v),
10
10
  serialize: (v) => JSON.stringify(v),
11
11
  isEmpty: (v) => {
12
12
  const values = Object.values(JSON.parse(v));
13
- return values.length === 0 || values.every(v => v === '' || v === null);
13
+ return values.length === 0 || values.every(v => v === "" || v === null);
14
14
  },
15
15
  },
16
16
  number: {
17
17
  deserialize: (v) => Number.parseFloat(v),
18
18
  serialize: (v) => String(v),
19
- isEmpty: (v) => v === '' || v === null,
19
+ isEmpty: (v) => v === "" || v === null,
20
20
  },
21
21
  any: {
22
22
  deserialize: (v) => v,
23
23
  serialize: (v) => String(v),
24
- isEmpty: (v) => v === '' || v === null,
24
+ isEmpty: (v) => v === "" || v === null,
25
25
  },
26
26
  string: {
27
27
  deserialize: (v) => v,
28
28
  serialize: (v) => String(v),
29
- isEmpty: (v) => v === '' || v === null,
29
+ isEmpty: (v) => v === "" || v === null,
30
30
  },
31
31
  map: {
32
32
  deserialize: (v) => new Map(JSON.parse(v)),
33
33
  serialize: (v) => JSON.stringify(Array.from(v.entries())),
34
34
  isEmpty: (v) => {
35
35
  const values = Array.from(v.values());
36
- return values.length === 0 || values.every(v => v === '' || v === null);
36
+ return values.length === 0 || values.every(v => v === "" || v === null);
37
37
  },
38
38
  },
39
39
  set: {
@@ -41,40 +41,46 @@ export const StorageSerializers = {
41
41
  serialize: (v) => JSON.stringify(Array.from(v.entries())),
42
42
  isEmpty: (v) => {
43
43
  const values = Array.from(v.values());
44
- return values.length === 0 || values.every(v => v === '' || v === null);
44
+ return values.length === 0 || values.every(v => v === "" || v === null);
45
45
  },
46
46
  },
47
47
  };
48
- export function useLocalStorage(controller, key, defaultValue, opts = { writeDefaults: true }) {
48
+ export function useLocalStorage(controller, key, defaultValue, opts) {
49
49
  let type;
50
- let { writeDefaults } = opts;
51
- if (defaultValue == null) {
52
- type = 'any';
50
+ let optsMergedWithDefaults = {
51
+ onChange: null,
52
+ writeDefaults: true,
53
+ ...opts,
54
+ };
55
+ let { writeDefaults } = optsMergedWithDefaults;
56
+ if (defaultValue === null || defaultValue === undefined) {
57
+ type = "any";
53
58
  }
54
59
  else if (defaultValue instanceof Set) {
55
- type = 'set';
60
+ type = "set";
56
61
  }
57
62
  else if (defaultValue instanceof Map) {
58
- type = 'map';
63
+ type = "map";
59
64
  }
60
- else if (typeof defaultValue === 'boolean') {
61
- type = 'boolean';
65
+ else if (typeof defaultValue === "boolean") {
66
+ type = "boolean";
62
67
  }
63
- else if (typeof defaultValue === 'string') {
64
- type = 'string';
68
+ else if (typeof defaultValue === "string") {
69
+ type = "string";
65
70
  }
66
- else if (typeof defaultValue === 'object') {
67
- type = 'object';
71
+ else if (typeof defaultValue === "object") {
72
+ type = "object";
68
73
  }
69
74
  else if (Array.isArray(defaultValue)) {
70
- type = 'object';
75
+ type = "object";
71
76
  }
72
77
  else if (!Number.isNaN(defaultValue)) {
73
- type = 'number';
78
+ type = "number";
74
79
  }
75
80
  else {
76
- type = 'any';
81
+ type = "any";
77
82
  }
83
+ let onChange = optsMergedWithDefaults.onChange?.bind(controller);
78
84
  let data = reactive({
79
85
  value: defaultValue,
80
86
  });
@@ -95,6 +101,9 @@ export function useLocalStorage(controller, key, defaultValue, opts = { writeDef
95
101
  };
96
102
  const write = (value) => {
97
103
  storage.setItem(key, serializer.serialize(value));
104
+ if (onChange) {
105
+ onChange(value, data.value);
106
+ }
98
107
  data.value = value;
99
108
  };
100
109
  const clear = () => {
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "ruby on rails",
10
10
  "ruby-on-rails"
11
11
  ],
12
- "version": "1.0.0-alpha.4",
12
+ "version": "1.0.0-alpha.8",
13
13
  "license": "MIT",
14
14
  "author": {
15
15
  "name": "Sub-Xaero",
@@ -55,5 +55,5 @@
55
55
  "typescript": "^5.1.3",
56
56
  "vite": "^4.1.1"
57
57
  },
58
- "gitHead": "bc482251a6b796fad8f5be7ab8b74731e602d1be"
58
+ "gitHead": "9c03bf65249f4ea252bea92526e38a4447ad25b8"
59
59
  }