@blackglory/observe 0.3.1 → 0.3.2

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.
@@ -1,44 +1,44 @@
1
1
  import { Observable, fromEvent, merge } from 'rxjs';
2
2
  import { map } from 'rxjs/operators';
3
- const pushStateHooks = new Set();
4
- const replaceStateHooks = new Set();
5
- let pushStateHookRegistered = false;
6
- let replaceStateHookRegistered = false;
7
3
  export function observeStateChanges() {
8
4
  return merge(observePushState(), observeReplaceState(), fromEvent(window, 'popstate'), fromEvent(window, 'hashchange')).pipe(map(_ => undefined));
9
5
  }
6
+ const pushStateHooks = new Set();
7
+ let pushStateHookRegistered = false;
10
8
  function observePushState() {
11
9
  return new Observable(observer => {
12
- if (!pushStateHookRegistered) {
13
- registerPushStateHook();
14
- }
10
+ ensurePushStateHook();
15
11
  pushStateHooks.add(observer);
16
12
  return () => pushStateHooks.delete(observer);
17
13
  });
14
+ function ensurePushStateHook() {
15
+ if (pushStateHookRegistered)
16
+ return;
17
+ const pushState = history.pushState;
18
+ history.pushState = function (...args) {
19
+ Reflect.apply(pushState, this, args);
20
+ pushStateHooks.forEach(observer => observer.next());
21
+ };
22
+ pushStateHookRegistered = true;
23
+ }
18
24
  }
25
+ const replaceStateHooks = new Set();
26
+ let replaceStateHookRegistered = false;
19
27
  function observeReplaceState() {
20
28
  return new Observable(observer => {
21
- if (!replaceStateHookRegistered) {
22
- registerReplaceStateHook();
23
- }
29
+ ensureReplaceStateHook();
24
30
  replaceStateHooks.add(observer);
25
31
  return () => replaceStateHooks.delete(observer);
26
32
  });
27
- }
28
- function registerPushStateHook() {
29
- const pushState = history.pushState;
30
- history.pushState = function (...args) {
31
- Reflect.apply(pushState, this, args);
32
- pushStateHooks.forEach(observer => observer.next());
33
- };
34
- pushStateHookRegistered = true;
35
- }
36
- function registerReplaceStateHook() {
37
- const replaceState = history.replaceState;
38
- history.replaceState = function (...args) {
39
- Reflect.apply(replaceState, this, args);
40
- replaceStateHooks.forEach(observer => observer.next());
41
- };
42
- replaceStateHookRegistered = true;
33
+ function ensureReplaceStateHook() {
34
+ if (replaceStateHookRegistered)
35
+ return;
36
+ const replaceState = history.replaceState;
37
+ history.replaceState = function (...args) {
38
+ Reflect.apply(replaceState, this, args);
39
+ replaceStateHooks.forEach(observer => observer.next());
40
+ };
41
+ replaceStateHookRegistered = true;
42
+ }
43
43
  }
44
44
  //# sourceMappingURL=observe-state-changes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observe-state-changes.js","sourceRoot":"","sources":["../src/observe-state-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,SAAS,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAA;AAClD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAA;AACrD,IAAI,uBAAuB,GAAG,KAAK,CAAA;AACnC,IAAI,0BAA0B,GAAG,KAAK,CAAA;AAEtC,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CACV,gBAAgB,EAAE,EAClB,mBAAmB,EAAE,EACrB,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,EAC7B,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,CAChC,CAAC,IAAI,CACJ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CACpB,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC/B,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,qBAAqB,EAAE,CAAA;QACzB,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC/B,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAChC,wBAAwB,EAAE,CAAA;QAC5B,CAAC;QACD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC/B,OAAO,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,qBAAqB;IAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IACnC,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI;QACnC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACpC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC,CAAA;IACD,uBAAuB,GAAG,IAAI,CAAA;AAChC,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;IACzC,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAI;QACtC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;QACvC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC,CAAA;IACD,0BAA0B,GAAG,IAAI,CAAA;AACnC,CAAC"}
1
+ {"version":3,"file":"observe-state-changes.js","sourceRoot":"","sources":["../src/observe-state-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,SAAS,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAEpC,MAAM,UAAU,mBAAmB;IACjC,OAAO,KAAK,CACV,gBAAgB,EAAE,EAClB,mBAAmB,EAAE,EACrB,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,EAC7B,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,CAChC,CAAC,IAAI,CACJ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CACpB,CAAA;AACH,CAAC;AAED,MAAM,cAAc,GAAG,IAAI,GAAG,EAAoB,CAAA;AAClD,IAAI,uBAAuB,GAAG,KAAK,CAAA;AAEnC,SAAS,gBAAgB;IACvB,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC/B,mBAAmB,EAAE,CAAA;QAErB,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,SAAS,mBAAmB;QAC1B,IAAI,uBAAuB;YAAE,OAAM;QAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QAEnC,OAAO,CAAC,SAAS,GAAG,UAAU,GAAG,IAAI;YACnC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YACpC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;QACrD,CAAC,CAAA;QAED,uBAAuB,GAAG,IAAI,CAAA;IAChC,CAAC;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAA;AACrD,IAAI,0BAA0B,GAAG,KAAK,CAAA;AAEtC,SAAS,mBAAmB;IAC1B,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE;QAC/B,sBAAsB,EAAE,CAAA;QAExB,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC/B,OAAO,GAAG,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,SAAS,sBAAsB;QAC7B,IAAI,0BAA0B;YAAE,OAAM;QAEtC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAA;QAEzC,OAAO,CAAC,YAAY,GAAG,UAAU,GAAG,IAAI;YACtC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YACvC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;QACxD,CAAC,CAAA;QAED,0BAA0B,GAAG,IAAI,CAAA;IACnC,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blackglory/observe",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "A module for observing things happening.",
5
5
  "keywords": [
6
6
  "DOM"
@@ -1,11 +1,6 @@
1
1
  import { Observable, Subscriber, fromEvent, merge } from 'rxjs'
2
2
  import { map } from 'rxjs/operators'
3
3
 
4
- const pushStateHooks = new Set<Subscriber<void>>()
5
- const replaceStateHooks = new Set<Subscriber<void>>()
6
- let pushStateHookRegistered = false
7
- let replaceStateHookRegistered = false
8
-
9
4
  export function observeStateChanges(): Observable<void> {
10
5
  return merge(
11
6
  observePushState()
@@ -17,40 +12,52 @@ export function observeStateChanges(): Observable<void> {
17
12
  )
18
13
  }
19
14
 
15
+ const pushStateHooks = new Set<Subscriber<void>>()
16
+ let pushStateHookRegistered = false
17
+
20
18
  function observePushState(): Observable<void> {
21
19
  return new Observable(observer => {
22
- if (!pushStateHookRegistered) {
23
- registerPushStateHook()
24
- }
20
+ ensurePushStateHook()
21
+
25
22
  pushStateHooks.add(observer)
26
23
  return () => pushStateHooks.delete(observer)
27
24
  })
25
+
26
+ function ensurePushStateHook(): void {
27
+ if (pushStateHookRegistered) return
28
+
29
+ const pushState = history.pushState
30
+ // 该猴子补丁不可复原, 因为在打上补丁后可能有其他代码也选择劫持`history.pushState`.
31
+ history.pushState = function (...args) {
32
+ Reflect.apply(pushState, this, args)
33
+ pushStateHooks.forEach(observer => observer.next())
34
+ }
35
+
36
+ pushStateHookRegistered = true
37
+ }
28
38
  }
29
39
 
40
+ const replaceStateHooks = new Set<Subscriber<void>>()
41
+ let replaceStateHookRegistered = false
42
+
30
43
  function observeReplaceState(): Observable<void> {
31
44
  return new Observable(observer => {
32
- if (!replaceStateHookRegistered) {
33
- registerReplaceStateHook()
34
- }
45
+ ensureReplaceStateHook()
46
+
35
47
  replaceStateHooks.add(observer)
36
48
  return () => replaceStateHooks.delete(observer)
37
49
  })
38
- }
39
50
 
40
- function registerPushStateHook() {
41
- const pushState = history.pushState
42
- history.pushState = function (...args) {
43
- Reflect.apply(pushState, this, args)
44
- pushStateHooks.forEach(observer => observer.next())
45
- }
46
- pushStateHookRegistered = true
47
- }
51
+ function ensureReplaceStateHook(): void {
52
+ if (replaceStateHookRegistered) return
53
+
54
+ const replaceState = history.replaceState
55
+ // 该猴子补丁不可复原, 因为在打上补丁后可能有其他代码也选择劫持`history.replaceState`.
56
+ history.replaceState = function (...args) {
57
+ Reflect.apply(replaceState, this, args)
58
+ replaceStateHooks.forEach(observer => observer.next())
59
+ }
48
60
 
49
- function registerReplaceStateHook() {
50
- const replaceState = history.replaceState
51
- history.replaceState = function (...args) {
52
- Reflect.apply(replaceState, this, args)
53
- replaceStateHooks.forEach(observer => observer.next())
61
+ replaceStateHookRegistered = true
54
62
  }
55
- replaceStateHookRegistered = true
56
63
  }