@blackglory/observe 0.3.0 → 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.
- package/lib/observe-state-changes.js +27 -27
- package/lib/observe-state-changes.js.map +1 -1
- package/package.json +16 -16
- package/src/observe-state-changes.ts +34 -26
|
@@ -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
|
-
return merge(observePushState(), observeReplaceState(), fromEvent(window, 'popstate')).pipe(map(_ => undefined));
|
|
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
|
-
|
|
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
|
-
|
|
22
|
-
registerReplaceStateHook();
|
|
23
|
-
}
|
|
29
|
+
ensureReplaceStateHook();
|
|
24
30
|
replaceStateHooks.add(observer);
|
|
25
31
|
return () => replaceStateHooks.delete(observer);
|
|
26
32
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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,
|
|
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.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "A module for observing things happening.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"DOM"
|
|
@@ -35,28 +35,28 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@blackglory/wait-for": "^0.8.
|
|
39
|
-
"@commitlint/cli": "^
|
|
40
|
-
"@commitlint/config-conventional": "^
|
|
41
|
-
"@eslint/js": "^
|
|
42
|
-
"cross-env": "^
|
|
43
|
-
"eslint": "^
|
|
38
|
+
"@blackglory/wait-for": "^0.8.4",
|
|
39
|
+
"@commitlint/cli": "^20.4.1",
|
|
40
|
+
"@commitlint/config-conventional": "^20.4.1",
|
|
41
|
+
"@eslint/js": "^10.0.1",
|
|
42
|
+
"cross-env": "^10.1.0",
|
|
43
|
+
"eslint": "^10.0.0",
|
|
44
44
|
"husky": "^4.3.6",
|
|
45
|
-
"jsdom": "^
|
|
45
|
+
"jsdom": "^28.1.0",
|
|
46
46
|
"npm-run-all": "^4.1.5",
|
|
47
|
-
"rimraf": "^6.
|
|
47
|
+
"rimraf": "^6.1.3",
|
|
48
48
|
"standard-version": "^9.5.0",
|
|
49
49
|
"ts-patch": "^3.3.0",
|
|
50
50
|
"tslib": "^2.8.1",
|
|
51
|
-
"typescript": "5.
|
|
52
|
-
"typescript-eslint": "^8.
|
|
53
|
-
"typescript-transform-paths": "^3.5.
|
|
54
|
-
"vite": "^7.
|
|
55
|
-
"vite-tsconfig-paths": "^
|
|
56
|
-
"vitest": "^
|
|
51
|
+
"typescript": "5.9.3",
|
|
52
|
+
"typescript-eslint": "^8.56.0",
|
|
53
|
+
"typescript-transform-paths": "^3.5.6",
|
|
54
|
+
"vite": "^7.3.1",
|
|
55
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
56
|
+
"vitest": "^4.0.18"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"iterable-operator": "^
|
|
59
|
+
"iterable-operator": "^6.0.0",
|
|
60
60
|
"rxjs": "^7.8.2"
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -1,55 +1,63 @@
|
|
|
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()
|
|
12
7
|
, observeReplaceState()
|
|
13
8
|
, fromEvent(window, 'popstate')
|
|
9
|
+
, fromEvent(window, 'hashchange')
|
|
14
10
|
).pipe(
|
|
15
11
|
map(_ => undefined)
|
|
16
12
|
)
|
|
17
13
|
}
|
|
18
14
|
|
|
15
|
+
const pushStateHooks = new Set<Subscriber<void>>()
|
|
16
|
+
let pushStateHookRegistered = false
|
|
17
|
+
|
|
19
18
|
function observePushState(): Observable<void> {
|
|
20
19
|
return new Observable(observer => {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
}
|
|
20
|
+
ensurePushStateHook()
|
|
21
|
+
|
|
24
22
|
pushStateHooks.add(observer)
|
|
25
23
|
return () => pushStateHooks.delete(observer)
|
|
26
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
|
+
}
|
|
27
38
|
}
|
|
28
39
|
|
|
40
|
+
const replaceStateHooks = new Set<Subscriber<void>>()
|
|
41
|
+
let replaceStateHookRegistered = false
|
|
42
|
+
|
|
29
43
|
function observeReplaceState(): Observable<void> {
|
|
30
44
|
return new Observable(observer => {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
45
|
+
ensureReplaceStateHook()
|
|
46
|
+
|
|
34
47
|
replaceStateHooks.add(observer)
|
|
35
48
|
return () => replaceStateHooks.delete(observer)
|
|
36
49
|
})
|
|
37
|
-
}
|
|
38
50
|
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
+
}
|
|
47
60
|
|
|
48
|
-
|
|
49
|
-
const replaceState = history.replaceState
|
|
50
|
-
history.replaceState = function (...args) {
|
|
51
|
-
Reflect.apply(replaceState, this, args)
|
|
52
|
-
replaceStateHooks.forEach(observer => observer.next())
|
|
61
|
+
replaceStateHookRegistered = true
|
|
53
62
|
}
|
|
54
|
-
replaceStateHookRegistered = true
|
|
55
63
|
}
|