@vscode/observables-react 0.1.1-0

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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/IPropertyTransformer.d.ts +37 -0
  4. package/dist/IPropertyTransformer.d.ts.map +1 -0
  5. package/dist/IPropertyTransformer.js +64 -0
  6. package/dist/IPropertyTransformer.js.map +1 -0
  7. package/dist/ManualChangesHandler.d.ts +14 -0
  8. package/dist/ManualChangesHandler.d.ts.map +1 -0
  9. package/dist/ManualChangesHandler.js +45 -0
  10. package/dist/ManualChangesHandler.js.map +1 -0
  11. package/dist/ProvideViewModel.d.ts +41 -0
  12. package/dist/ProvideViewModel.d.ts.map +1 -0
  13. package/dist/ProvideViewModel.js +41 -0
  14. package/dist/ProvideViewModel.js.map +1 -0
  15. package/dist/Value.d.ts +16 -0
  16. package/dist/Value.d.ts.map +1 -0
  17. package/dist/Value.js +26 -0
  18. package/dist/Value.js.map +1 -0
  19. package/dist/di.d.ts +31 -0
  20. package/dist/di.d.ts.map +1 -0
  21. package/dist/di.js +86 -0
  22. package/dist/di.js.map +1 -0
  23. package/dist/index.d.ts +12 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +20 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/index.min.js +6 -0
  28. package/dist/index.min.js.map +1 -0
  29. package/dist/internal.d.ts +2 -0
  30. package/dist/internal.d.ts.map +1 -0
  31. package/dist/internal.js +6 -0
  32. package/dist/internal.js.map +1 -0
  33. package/dist/obsView.d.ts +14 -0
  34. package/dist/obsView.d.ts.map +1 -0
  35. package/dist/obsView.js +109 -0
  36. package/dist/obsView.js.map +1 -0
  37. package/dist/router/Navigator.d.ts +18 -0
  38. package/dist/router/Navigator.d.ts.map +1 -0
  39. package/dist/router/Navigator.js +35 -0
  40. package/dist/router/Navigator.js.map +1 -0
  41. package/dist/router/Path.d.ts +23 -0
  42. package/dist/router/Path.d.ts.map +1 -0
  43. package/dist/router/Path.js +63 -0
  44. package/dist/router/Path.js.map +1 -0
  45. package/dist/router/PathPattern.d.ts +15 -0
  46. package/dist/router/PathPattern.d.ts.map +1 -0
  47. package/dist/router/PathPattern.js +88 -0
  48. package/dist/router/PathPattern.js.map +1 -0
  49. package/dist/router/Route.d.ts +35 -0
  50. package/dist/router/Route.d.ts.map +1 -0
  51. package/dist/router/Route.js +63 -0
  52. package/dist/router/Route.js.map +1 -0
  53. package/dist/router/Router.d.ts +16 -0
  54. package/dist/router/Router.d.ts.map +1 -0
  55. package/dist/router/Router.js +37 -0
  56. package/dist/router/Router.js.map +1 -0
  57. package/dist/router/index.d.ts +10 -0
  58. package/dist/router/index.d.ts.map +1 -0
  59. package/dist/utils.d.ts +8 -0
  60. package/dist/utils.d.ts.map +1 -0
  61. package/dist/utils.js +14 -0
  62. package/dist/utils.js.map +1 -0
  63. package/dist/view.d.ts +9 -0
  64. package/dist/view.d.ts.map +1 -0
  65. package/dist/view.js +27 -0
  66. package/dist/view.js.map +1 -0
  67. package/dist/viewModel.d.ts +33 -0
  68. package/dist/viewModel.d.ts.map +1 -0
  69. package/dist/viewModel.js +36 -0
  70. package/dist/viewModel.js.map +1 -0
  71. package/dist/viewWithModel.d.ts +30 -0
  72. package/dist/viewWithModel.d.ts.map +1 -0
  73. package/dist/viewWithModel.js +50 -0
  74. package/dist/viewWithModel.js.map +1 -0
  75. package/package.json +72 -0
package/dist/Value.js ADDED
@@ -0,0 +1,26 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { jsx } from 'react/jsx-runtime';
6
+ import { prop } from './IPropertyTransformer.js';
7
+ import { view } from './view.js';
8
+
9
+ /**
10
+ * A component that renders an observable ReactNode value.
11
+ * Re-renders when the observable changes.
12
+ * Usage: <Value value={myObservable} />
13
+ */
14
+ const Value = view({ value: prop.obs() }, (reader, props) => {
15
+ return props.value.read(reader);
16
+ });
17
+ /**
18
+ * Helper function to render an observable as inline JSX.
19
+ * Usage: {val(myObservable)}
20
+ */
21
+ function val(v) {
22
+ return jsx(Value, { value: v });
23
+ }
24
+
25
+ export { Value, val };
26
+ //# sourceMappingURL=Value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Value.js","sources":["../src/Value.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;;;;;AAKA;;;;AAIG;MACU,KAAK,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAa,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,KAAI;IAC1E,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC,EAAE;AAEH;;;AAGG;AACG,SAAU,GAAG,CAAC,CAAyB,EAAA;AACzC,IAAA,OAAOA,IAAC,KAAK,EAAA,EAAC,KAAK,EAAE,CAAC,GAAI,CAAC;AAC/B;;;;"}
package/dist/di.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import { ReactNode, Context } from "react";
2
+ import { IPropertyTransformerFactory } from "./IPropertyTransformer";
3
+ export interface ServiceKey<T> {
4
+ readonly _brand: T;
5
+ readonly id: symbol;
6
+ readonly name: string;
7
+ }
8
+ /** Create a service key with a string name */
9
+ export declare function createServiceKey<T>(name: string): ServiceKey<T>;
10
+ /** Create a service key from a class constructor (uses class name) */
11
+ export declare function createServiceKey<T>(ctor: new (...args: never[]) => T): ServiceKey<T>;
12
+ export declare class DIContainer {
13
+ private readonly _services;
14
+ private readonly _parent;
15
+ constructor(parent?: DIContainer | null);
16
+ register<T>(key: ServiceKey<T>, service: T): this;
17
+ get<T>(key: ServiceKey<T>): T;
18
+ has<T>(key: ServiceKey<T>): boolean;
19
+ createChild(): DIContainer;
20
+ }
21
+ export declare const DIContext: Context<DIContainer | null>;
22
+ export declare function DIProvider({ container, children }: {
23
+ container: DIContainer;
24
+ children: ReactNode;
25
+ }): ReactNode;
26
+ export declare function useDIContainer(): DIContainer;
27
+ /** Inject a service from DIContainer into a ViewModel property */
28
+ export declare function inject<T>(key: ServiceKey<T>): IPropertyTransformerFactory<T | undefined, T> & {
29
+ _requiredContext: Context<unknown>;
30
+ };
31
+ //# sourceMappingURL=di.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di.d.ts","sourceRoot":"","sources":["../src/di.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,SAAS,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,2BAA2B,EAA0B,MAAM,wBAAwB,CAAC;AAO7F,MAAM,WAAW,UAAU,CAAC,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AACjE,sEAAsE;AACtE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAUtF,qBAAa,WAAW;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,MAAM,GAAE,WAAW,GAAG,IAAW;IAI7C,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAKjD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;IAO7B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO;IAInC,WAAW,IAAI,WAAW;CAG7B;AAMD,eAAO,MAAM,SAAS,EAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAA2C,CAAC;AAE9F,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAE9G;AAED,wBAAgB,cAAc,IAAI,WAAW,CAI5C;AAgCD,kEAAkE;AAClE,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC,GAAG;IAAE,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAEpI"}
package/dist/di.js ADDED
@@ -0,0 +1,86 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { jsx } from 'react/jsx-runtime';
6
+ import { createContext, useContext } from 'react';
7
+ import { derived } from '@vscode/observables';
8
+
9
+ function createServiceKey(nameOrCtor) {
10
+ const name = typeof nameOrCtor === 'string' ? nameOrCtor : nameOrCtor.name;
11
+ return { _brand: undefined, id: Symbol(name), name };
12
+ }
13
+ // =============================================================================
14
+ // DI Container
15
+ // =============================================================================
16
+ class DIContainer {
17
+ constructor(parent = null) {
18
+ this._services = new Map();
19
+ this._parent = parent;
20
+ }
21
+ register(key, service) {
22
+ this._services.set(key.id, service);
23
+ return this;
24
+ }
25
+ get(key) {
26
+ const service = this._services.get(key.id);
27
+ if (service !== undefined)
28
+ return service;
29
+ if (this._parent)
30
+ return this._parent.get(key);
31
+ throw new Error(`Service "${key.name}" not registered`);
32
+ }
33
+ has(key) {
34
+ return this._services.has(key.id) || (this._parent?.has(key) ?? false);
35
+ }
36
+ createChild() {
37
+ return new DIContainer(this);
38
+ }
39
+ }
40
+ // =============================================================================
41
+ // React Context
42
+ // =============================================================================
43
+ const DIContext = createContext(null);
44
+ function DIProvider({ container, children }) {
45
+ return jsx(DIContext.Provider, { value: container, children: children });
46
+ }
47
+ function useDIContainer() {
48
+ const container = useContext(DIContext);
49
+ if (!container)
50
+ throw new Error("DIProvider not found");
51
+ return container;
52
+ }
53
+ // =============================================================================
54
+ // inject() - Property Transformer for DI
55
+ // =============================================================================
56
+ class InjectTransformerFactory {
57
+ constructor(serviceKey) {
58
+ this.serviceKey = serviceKey;
59
+ this._requiredContext = DIContext;
60
+ }
61
+ create(readable, contextValue) {
62
+ const container = contextValue;
63
+ let cachedService;
64
+ return derived(reader => {
65
+ // Check if an explicit value was provided as a prop
66
+ const explicitValue = readable(reader);
67
+ if (explicitValue !== undefined) {
68
+ return explicitValue;
69
+ }
70
+ // Otherwise, use DI container (cached)
71
+ if (cachedService === undefined) {
72
+ if (!container)
73
+ throw new Error(`inject(${this.serviceKey.name}): DIProvider not found`);
74
+ cachedService = container.get(this.serviceKey);
75
+ }
76
+ return cachedService;
77
+ });
78
+ }
79
+ }
80
+ /** Inject a service from DIContainer into a ViewModel property */
81
+ function inject(key) {
82
+ return new InjectTransformerFactory(key);
83
+ }
84
+
85
+ export { DIContainer, DIContext, DIProvider, createServiceKey, inject, useDIContainer };
86
+ //# sourceMappingURL=di.js.map
package/dist/di.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"di.js","sources":["../src/di.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { ManualChangesHandler } from './ManualChangesHandler';
2
+ export { type Readable, type IReadableObj, type IPropertyTransformerFactory, prop } from './IPropertyTransformer';
3
+ export { mapObject } from './utils';
4
+ export { type PropsDesc, type PropsIn, type PropsOut, type ViewModelClass, ViewModelContextSymbol, BaseViewModel, getOrCreateViewModelContext, ViewModel } from './viewModel';
5
+ export { type ViewModelMock, ProvideViewModel, mockViewModel, ProvideMockViewModels } from './ProvideViewModel';
6
+ export { view } from './view';
7
+ export { viewWithModel } from './viewWithModel';
8
+ export { Value, val } from './Value';
9
+ export { ObsView } from './obsView';
10
+ export { type ServiceKey, createServiceKey, DIContainer, DIContext, DIProvider, useDIContainer, inject } from './di';
11
+ export { type QueryArgs, type PathMatcher, type PathArgs, type PathArgsToType, type QueryArgsToType, type RouteQueryArgs, type RouteResult, NavigationPath, PathPattern, Route, Router, Navigator } from './router';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAE,KAAK,2BAA2B,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAClH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,sBAAsB,EAAE,aAAa,EAAE,2BAA2B,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9K,OAAO,EAAE,KAAK,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACrH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ export { ManualChangesHandler } from './ManualChangesHandler.js';
6
+ export { prop } from './IPropertyTransformer.js';
7
+ export { mapObject } from './utils.js';
8
+ export { BaseViewModel, ViewModel, ViewModelContextSymbol, getOrCreateViewModelContext } from './viewModel.js';
9
+ export { ProvideMockViewModels, ProvideViewModel, mockViewModel } from './ProvideViewModel.js';
10
+ export { view } from './view.js';
11
+ export { viewWithModel } from './viewWithModel.js';
12
+ export { Value, val } from './Value.js';
13
+ export { ObsView } from './obsView.js';
14
+ export { DIContainer, DIContext, DIProvider, createServiceKey, inject, useDIContainer } from './di.js';
15
+ export { NavigationPath } from './router/Path.js';
16
+ export { PathPattern } from './router/PathPattern.js';
17
+ export { Route } from './router/Route.js';
18
+ export { Router } from './router/Router.js';
19
+ export { Navigator } from './router/Navigator.js';
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,6 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import{derived as t,DisposableStore as e,observableValue as r,derivedDisposable as n}from"@vscode/observables";import{createContext as s,useReducer as i,useState as o,useContext as a,useEffect as c}from"react";import{jsx as h}from"react/jsx-runtime";import{unstable_batchedUpdates as u}from"react-dom";class d{constructor(t){this._run=t,this._changes=[],this._map=new Map,this._updateCounter=0}addDependency(t,e){return this._map.set(t,e),t.addObserver(this),{dispose:()=>{this._map.delete(t),t.removeObserver(this)}}}beginUpdate(t){this._updateCounter++,this._changes.push(this._map.get(t))}endUpdate(t){if(this._updateCounter--,0===this._updateCounter&&this._changes.length>0){const t=this._changes;this._changes=[],this._run(t)}}handlePossibleChange(t){this._changes.push(this._map.get(t))}handleChange(t,e){}}function l(){return f.instance}l.const=function(){return p.instance},l.obs=function(){return g.instance};class f{create(e){const r=t(t=>e(t));return{read:t=>r}}}f.instance=new f;class p{create(e){const r=t(t=>e(t));return{read:t=>r.read(t)}}}p.instance=new p;class g{create(e){const r=t(t=>{const r=e(t);return"object"==typeof(n=r)&&null!==n&&"read"in n?r.read(t):r;var n});return{read:t=>r}}}function v(t,e){return Object.fromEntries(Object.entries(t).map(([t,r])=>[t,e(r,t)]))}g.instance=new g;const _=Symbol("ViewModelContext");class m{constructor(t){this._store=new e,this.props=t}dispose(){this._store.dispose()}}function w(t){return t[_]||(t[_]=s(void 0)),t[_]}function b(t={}){var e;return(e=class extends m{})._props=t,e}function P({viewModel:t,value:e,children:r}){const n=w(t);return h(n.Provider,{value:e,children:r})}function y(t,e){const r=w(t);return{_provide:t=>h(r.Provider,{value:e,children:t})}}function R({mocks:t,children:e}){return t.reduceRight((t,e)=>e._provide(t),e)}let U=0;const C=new d(t=>{for(const e of t)e.rendered=!1;if(U>0){t.find(t=>t.isRendering).itemsToRender=t}else u(()=>{for(const e of t)e.rendered||e.forceUpdate()})});let S=0;class E{constructor(t,e){this.debugName=t,this.renderFactory=e,this._obsProps=void 0,this.forceUpdate=void 0,this._render=void 0,this._disposable=void 0,this.contextValues=new Map,this.cleanupEffect=()=>()=>{this._disposable?.dispose()},this.itemsToRender=[],this.handleAfterRender=()=>{u(()=>{for(const t of this.itemsToRender)t.rendered||t.forceUpdate()}),this.itemsToRender=[]},this.rendering=void 0,this.isRendering=!1,this.rendered=!1}toString(){return this.debugName}updateProps(e){this._obsProps?this._obsProps.set(e,void 0):(this._obsProps=r(this,e),this._render=this.renderFactory(this._obsProps,()=>this.contextValues),this.rendering=t(this,this._render),this._disposable=C.addDependency(this.rendering,this))}}function j(t,e,r){const n=t=>t+1,s=()=>new E(t+ ++S,e),h=function(t){const e=i(n,0)[1],h=o(s)[0];for(const t of r??[])h.contextValues.set(t,a(t));if(c(h.cleanupEffect,[]),c(h.handleAfterRender),h.isRendering)throw new Error("Component is already rendering");h.isRendering=!0,U++;try{h.forceUpdate=e,h.updateProps(t);const r=h.rendering.get();return h.rendered=!0,r}finally{h.isRendering=!1,U--}};return h.displayName=t,h}const x=j("ObsView",t=>e=>t.read(e).children(e));function A(t,e){return j("view",r=>{const n=v(t,(t,e)=>t.create(t=>r.read(t)[e],void 0));return t=>{const r=v(n,e=>e.read(t));return e(t,r)}})}function q(t,e,r){const s="function"==typeof e?{}:e,i="function"==typeof e?e:r,o=function(t){const e=[];for(const r of Object.values(t)){const t=r._requiredContext;t&&!e.includes(t)&&e.push(t)}return e}({..."_props"in t?t._props:{},...s}),a=w(t),c=[...o,a];return j("viewWithModel",(e,r)=>{const o=r(),c=o.get(a),h="_props"in t?v(t._props,(t,r)=>t.create(t=>e.read(t)[r],o.get(t._requiredContext))):{},u=c?{read:()=>c,dispose:()=>{}}:n(e=>{const r=v(h,t=>t.read(e));return new t(r)}),d=v(s,(t,r)=>t.create(t=>e.read(t)[r],o.get(t._requiredContext)));return t=>{const e=u.read(t),r=v(d,e=>e.read(t));return i(t,e,r)}},c.length>0?c:void 0)}const k=A({value:l.obs()},(t,e)=>e.value.read(t));function L(t){return h(k,{value:t})}function N(t){const e="string"==typeof t?t:t.name;return{_brand:void 0,id:Symbol(e),name:e}}class O{constructor(t=null){this._services=new Map,this._parent=t}register(t,e){return this._services.set(t.id,e),this}get(t){const e=this._services.get(t.id);if(void 0!==e)return e;if(this._parent)return this._parent.get(t);throw new Error(`Service "${t.name}" not registered`)}has(t){return this._services.has(t.id)||(this._parent?.has(t)??!1)}createChild(){return new O(this)}}const D=s(null);function M({container:t,children:e}){return h(D.Provider,{value:t,children:e})}function T(){const t=a(D);if(!t)throw new Error("DIProvider not found");return t}class W{constructor(t){this.serviceKey=t,this._requiredContext=D}create(e,r){const n=r;let s;return t(t=>{const r=e(t);if(void 0!==r)return r;if(void 0===s){if(!n)throw new Error(`inject(${this.serviceKey.name}): DIProvider not found`);s=n.get(this.serviceKey)}return s})}}function V(t){return new W(t)}class I{static create(t,e){const r=$(t);return new I(r,e,"",null)}static fromUrl(t,e){const r=$(e.pathname),n=function(t,e){for(let r=0;r<e.length;r++)if(t[r]!==e[r])return[".."];return t.slice(e.length)}($(t.pathname),r),s=new URLSearchParams(t.search),i=Object.fromEntries(s);return new I(n,i,t.hash,null)}toUrl(t){const e=$(t.pathname);return new URL(e.join("/")+this.toString(),t)}constructor(t,e,r,n){this.path=t,this.queryArgs=e,this.hash=r,this.state=n}getPathString(){return"/"+this.path.join("/")}toString(){let t=this.getPathString();const e=new URLSearchParams(this.queryArgs).toString();return""!==e&&(t+=`?${e}`),t}}function $(t){if(!t.startsWith("/"))throw new Error(`Expected pathname "${t}" to start with "/"`);return(t=t.substring(1))?t.split("/"):[]}class K{static parse(t){if(!t.startsWith("/"))throw new Error;const e=t.substring(1).split("/").map(t=>{if(t.startsWith("::")){return{kind:"variable",variableName:t.substring(2),catchAll:!0}}if(t.startsWith(":")){return{kind:"variable",variableName:t.substring(1),catchAll:!1}}return{kind:"literal",value:t}});return new K(e)}constructor(t){this._segments=t}match(t){if(!t.startsWith("/"))throw new Error;const e=t.substring(1).split("/"),r={};for(const t of this._segments)if("literal"===t.kind){const r=e.shift();if(t.value!==r)return}else{if("variable"!=t.kind)throw new Error;if(t.catchAll){const n=e.join("/");e.length=0;const s=decodeURIComponent(n);r[t.variableName]=s}else{const n=e.shift();if(void 0===n)return;const s=decodeURIComponent(n);r[t.variableName]=s}}if(!(e.length>0))return r}build(t){return"/"+this._segments.map(e=>{if("literal"===e.kind)return e.value;{const r=t[e.variableName];if(void 0===r)throw new Error;return r}}).join("/")}}class F{static create(t,e,r){return new F(t,e??{},r??{})}constructor(t,e,r){this.path=t,this.args=e,this.queryArgs=r,this._pathPattern=K.parse(this.path)}build(t){const e={};for(const r in this.args)e[r]=t[r];const r=this._pathPattern.build(e),n={};for(const e in this.queryArgs){const r=this.queryArgs[e];n[e]="object"==typeof r?r.const:t[e]}return I.create(r,n)}matches(t){const e=this._pathPattern.match(t.getPathString());if(!e)return;const r=new URLSearchParams(t.queryArgs),n={...e};for(const[t,e]of Object.entries(this.queryArgs)){const s=r.get(t);if(null===s)return;if("object"==typeof e){if(s!==e.const)return}else n[t]=s}return n}}class z{static create(){return new z(void 0,void 0)}constructor(t,e){this._parent=t,this._addedRoute=e}with(t,e){return new z(this,{matcher:t,dataProvider:e})}route(t){if(this._addedRoute){const e=this._addedRoute.matcher.matches(t);if(e)return{args:e,out:this._addedRoute.dataProvider(e),matcher:this._addedRoute.matcher}}if(this._parent)return this._parent.route(t)}}class B{constructor(t=new URL("/",document.location.href)){this.root=t,this._currentPath=r(this,I.fromUrl(new URL(document.location.href),this.root)),this.currentPath=this._currentPath,window.addEventListener("popstate",()=>{this._currentPath.set(I.fromUrl(new URL(document.location.href),this.root),void 0)})}getLinkData(t,e){return{onClick:r=>{r.preventDefault(),this.navigateTo(t,e)},href:t.build(e??{}).toUrl(this.root).toString()}}navigateTo(t,e){const r=t.build(e??{}),n=r.toUrl(this.root).toString();this._currentPath.set(r,void 0),history.pushState(void 0,"",n)}}export{m as BaseViewModel,O as DIContainer,D as DIContext,M as DIProvider,d as ManualChangesHandler,I as NavigationPath,B as Navigator,x as ObsView,K as PathPattern,R as ProvideMockViewModels,P as ProvideViewModel,F as Route,z as Router,k as Value,b as ViewModel,_ as ViewModelContextSymbol,N as createServiceKey,w as getOrCreateViewModelContext,V as inject,v as mapObject,y as mockViewModel,l as prop,T as useDIContainer,L as val,A as view,q as viewWithModel};
6
+ //# sourceMappingURL=index.min.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.min.js","sources":["../src/ManualChangesHandler.ts","../src/IPropertyTransformer.ts","../src/utils.ts","../src/viewModel.ts","../src/ProvideViewModel.tsx","../src/obsView.ts","../src/view.ts","../src/viewWithModel.ts","../src/Value.tsx","../src/di.tsx","../src/router/Path.ts","../src/router/PathPattern.ts","../src/router/Route.ts","../src/router/Router.ts","../src/router/Navigator.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["ManualChangesHandler","constructor","_run","this","_changes","_map","Map","_updateCounter","addDependency","observable","data","set","addObserver","dispose","delete","removeObserver","beginUpdate","push","get","endUpdate","_observable","length","c","handlePossibleChange","handleChange","_change","prop","PropertyTransformerFactory","instance","const","PropertyConstTransformerFactory","obs","PropertyObsTransformerFactory","create","readableProp","d","derived","reader","read","_reader","v","mapObject","obj","fn","Object","fromEntries","entries","map","key","value","ViewModelContextSymbol","Symbol","BaseViewModel","props","_store","DisposableStore","getOrCreateViewModelContext","ctor","createContext","undefined","ViewModel","_a","_props","ProvideViewModel","viewModel","ViewModelClass","children","ContextType","_jsx","Provider","mockViewModel","viewModelClass","_provide","ProvideMockViewModels","mocks","reduceRight","acc","mock","renderingCount","batchedUpdater","potentialChanges","change","rendered","find","isRendering","itemsToRender","unstable_batchedUpdates","forceUpdate","viewIdx","ViewImpl","debugName","renderFactory","_obsProps","_render","_disposable","contextValues","cleanupEffect","handleAfterRender","rendering","toString","updateProps","observableValue","obsView","componentName","render","contexts","plusOne","x","createVM","useReducer","state","useState","ctx","useContext","useEffect","Error","result","displayName","ObsView","view","p","readableProps","propValues","viewWithModel","viewModelCtor","propsOrRender","maybeRender","requiredContexts","propsDesc","t","values","_requiredContext","includes","collectRequiredContexts","viewModelContext","allContexts","getContextValues","providedModel","readableModelProps","k","r","model","derivedDisposable","modelProps","m","Value","val","createServiceKey","nameOrCtor","name","_brand","id","DIContainer","parent","_services","_parent","register","service","has","createChild","DIContext","DIProvider","container","useDIContainer","InjectTransformerFactory","serviceKey","readable","contextValue","cachedService","explicitValue","inject","NavigationPath","path","queryArgs","parts","parsePath","fromUrl","url","rootUrl","rootPath","pathname","prefix","i","slice","relative","URLSearchParams","search","hash","toUrl","URL","join","getPathString","str","startsWith","substring","split","PathPattern","parse","pattern","part","kind","variableName","catchAll","_segments","match","params","segment","shift","partText","decodeURIComponent","build","Route","pathArgs","args","_pathPattern","matches","type","Router","_addedRoute","matcher","dataProvider","route","out","Navigator","root","document","location","href","_currentPath","currentPath","window","addEventListener","getLinkData","onClick","e","preventDefault","navigateTo","history","pushState"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { type ContextValues, obsView } from './obsView';
2
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ export { obsView } from './obsView.js';
6
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,14 @@
1
+ import React, { Context } from "react";
2
+ import { IReader, IObservable } from "@vscode/observables";
3
+ export type ContextValues = Map<Context<unknown>, unknown>;
4
+ export declare function obsView<TProps extends Record<string, any>>(componentName: string, render: (props: IObservable<TProps>, getContextValues: () => ContextValues) => ((reader: IReader) => React.ReactNode), contexts?: Context<unknown>[]): {
5
+ (props: TProps): React.ReactNode;
6
+ displayName: string;
7
+ };
8
+ export declare const ObsView: {
9
+ (props: {
10
+ children: (reader: IReader) => React.ReactNode;
11
+ }): React.ReactNode;
12
+ displayName: string;
13
+ };
14
+ //# sourceMappingURL=obsView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsView.d.ts","sourceRoot":"","sources":["../src/obsView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAA+C,MAAM,OAAO,CAAC;AACpF,OAAO,EAAW,OAAO,EAAmB,WAAW,EAAoC,MAAM,qBAAqB,CAAC;AAIvH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AA6E3D,wBAAgB,OAAO,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,MAAM,aAAa,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC,EACrH,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YAID,MAAM,GAAG,KAAK,CAAC,SAAS;;EA+BvD;AAED,eAAO,MAAM,OAAO;;kBAAuB,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS;QAjCtC,KAAK,CAAC,SAAS;;CAiC+F,CAAC"}
@@ -0,0 +1,109 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { useReducer, useState, useContext, useEffect } from 'react';
6
+ import { observableValue, derived } from '@vscode/observables';
7
+ import { ManualChangesHandler } from './ManualChangesHandler.js';
8
+ import { unstable_batchedUpdates } from 'react-dom';
9
+
10
+ let renderingCount = 0;
11
+ const batchedUpdater = new ManualChangesHandler(potentialChanges => {
12
+ for (const change of potentialChanges) {
13
+ change.rendered = false;
14
+ }
15
+ if (renderingCount > 0) {
16
+ const rendering = potentialChanges.find(c => c.isRendering);
17
+ rendering.itemsToRender = potentialChanges;
18
+ }
19
+ else {
20
+ unstable_batchedUpdates(() => {
21
+ for (const change of potentialChanges) {
22
+ if (!change.rendered) {
23
+ change.forceUpdate();
24
+ }
25
+ }
26
+ });
27
+ }
28
+ });
29
+ let viewIdx = 0;
30
+ class ViewImpl {
31
+ constructor(debugName, renderFactory) {
32
+ this.debugName = debugName;
33
+ this.renderFactory = renderFactory;
34
+ this._obsProps = undefined;
35
+ this.forceUpdate = undefined;
36
+ this._render = undefined;
37
+ this._disposable = undefined;
38
+ this.contextValues = new Map();
39
+ this.cleanupEffect = () => {
40
+ return () => {
41
+ this._disposable?.dispose();
42
+ };
43
+ };
44
+ this.itemsToRender = [];
45
+ this.handleAfterRender = () => {
46
+ unstable_batchedUpdates(() => {
47
+ for (const change of this.itemsToRender) {
48
+ if (!change.rendered) {
49
+ change.forceUpdate();
50
+ }
51
+ }
52
+ });
53
+ this.itemsToRender = [];
54
+ };
55
+ this.rendering = undefined;
56
+ this.isRendering = false;
57
+ this.rendered = false;
58
+ }
59
+ toString() {
60
+ return this.debugName;
61
+ }
62
+ updateProps(props) {
63
+ if (!this._obsProps) {
64
+ this._obsProps = observableValue(this, props);
65
+ this._render = this.renderFactory(this._obsProps, () => this.contextValues);
66
+ this.rendering = derived(this, this._render);
67
+ this._disposable = batchedUpdater.addDependency(this.rendering, this);
68
+ }
69
+ else {
70
+ this._obsProps.set(props, undefined);
71
+ }
72
+ }
73
+ }
74
+ function obsView(componentName, render, contexts) {
75
+ const plusOne = (x) => x + 1;
76
+ const createVM = () => new ViewImpl(componentName + (++viewIdx), render);
77
+ const fn = function (props) {
78
+ const forceUpdate = useReducer(plusOne, 0)[1];
79
+ const state = useState(createVM)[0];
80
+ // Read and update context values each render
81
+ for (const ctx of contexts ?? []) {
82
+ state.contextValues.set(ctx, useContext(ctx)); // eslint-disable-line react-hooks/rules-of-hooks
83
+ }
84
+ useEffect(state.cleanupEffect, []);
85
+ useEffect(state.handleAfterRender);
86
+ if (state.isRendering) {
87
+ throw new Error("Component is already rendering");
88
+ }
89
+ state.isRendering = true;
90
+ renderingCount++;
91
+ try {
92
+ state.forceUpdate = forceUpdate;
93
+ state.updateProps(props);
94
+ const result = state.rendering.get();
95
+ state.rendered = true;
96
+ return result;
97
+ }
98
+ finally {
99
+ state.isRendering = false;
100
+ renderingCount--;
101
+ }
102
+ };
103
+ fn.displayName = componentName;
104
+ return fn;
105
+ }
106
+ const ObsView = obsView('ObsView', (props) => reader => props.read(reader).children(reader));
107
+
108
+ export { ObsView, obsView };
109
+ //# sourceMappingURL=obsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsView.js","sources":["../src/obsView.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { IObservable } from "@vscode/observables";
2
+ import { NavigationPath } from "./Path";
3
+ import { Route } from "./Route";
4
+ export interface ILinkData {
5
+ onClick: (e: React.MouseEvent) => void;
6
+ href: string;
7
+ }
8
+ export declare class Navigator {
9
+ readonly root: URL;
10
+ constructor(root?: URL);
11
+ getLinkData(route: Route<void>): ILinkData;
12
+ getLinkData<TArgs extends {} | void>(route: Route<TArgs>, data: TArgs): ILinkData;
13
+ private readonly _currentPath;
14
+ readonly currentPath: IObservable<NavigationPath>;
15
+ navigateTo(route: Route<void>): void;
16
+ navigateTo<TArgs extends {} | void>(route: Route<TArgs>, args: TArgs): void;
17
+ }
18
+ //# sourceMappingURL=Navigator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navigator.d.ts","sourceRoot":"","sources":["../../src/router/Navigator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,WAAW,SAAS;IACtB,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,SAAS;aAEE,IAAI;gBAAJ,IAAI,MAAuC;IAOxD,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS;IAC1C,WAAW,CAAC,KAAK,SAAS,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,SAAS;IAWxF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6F;IAC1H,SAAgB,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC,CAAqB;IAEtE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI;IACpC,UAAU,CAAC,KAAK,SAAS,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;CAOrF"}
@@ -0,0 +1,35 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { observableValue } from '@vscode/observables';
6
+ import { NavigationPath } from './Path.js';
7
+
8
+ class Navigator {
9
+ constructor(root = new URL('/', document.location.href)) {
10
+ this.root = root;
11
+ this._currentPath = observableValue(this, NavigationPath.fromUrl(new URL(document.location.href), this.root));
12
+ this.currentPath = this._currentPath;
13
+ window.addEventListener('popstate', () => {
14
+ this._currentPath.set(NavigationPath.fromUrl(new URL(document.location.href), this.root), undefined);
15
+ });
16
+ }
17
+ getLinkData(route, data) {
18
+ return {
19
+ onClick: (e) => {
20
+ e.preventDefault();
21
+ this.navigateTo(route, data);
22
+ },
23
+ href: route.build(data ?? {}).toUrl(this.root).toString(),
24
+ };
25
+ }
26
+ navigateTo(route, args) {
27
+ const path = route.build(args ?? {});
28
+ const p = path.toUrl(this.root).toString();
29
+ this._currentPath.set(path, undefined);
30
+ history.pushState(undefined, '', p);
31
+ }
32
+ }
33
+
34
+ export { Navigator };
35
+ //# sourceMappingURL=Navigator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Navigator.js","sources":["../../src/router/Navigator.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;MASa,SAAS,CAAA;IAClB,WACoB,CAAA,IAAA,GAAO,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAA;QAA3C,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAuC;QAmB9C,IAAY,CAAA,YAAA,GAAG,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1G,QAAA,IAAA,CAAA,WAAW,GAAgC,IAAI,CAAC,YAAY,CAAC;AAlBzE,QAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAK;YACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;AACzG,SAAC,CAAC,CAAC;KACN;IAIM,WAAW,CAA0B,KAAmB,EAAE,IAAY,EAAA;QACzE,OAAO;AACH,YAAA,OAAO,EAAE,CAAC,CAAC,KAAI;gBACX,CAAC,CAAC,cAAc,EAAE,CAAC;AACnB,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aAChC;AACD,YAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAW,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;SACrE,CAAC;KACL;IAOM,UAAU,CAA0B,KAAmB,EAAE,IAAY,EAAA;QACxE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAW,CAAC,CAAC;AAC9C,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;KACvC;AACJ;;;;"}
@@ -0,0 +1,23 @@
1
+ export declare class NavigationPath {
2
+ readonly path: string[];
3
+ readonly queryArgs: QueryArgs;
4
+ readonly hash: string;
5
+ /**
6
+ * Has to serialize/deserialize to/from json
7
+ */
8
+ readonly state: unknown;
9
+ static create(path: string, queryArgs: QueryArgs): NavigationPath;
10
+ static fromUrl(url: URL, rootUrl: URL): NavigationPath;
11
+ toUrl(rootUrl: URL): URL;
12
+ constructor(path: string[], queryArgs: QueryArgs, hash: string,
13
+ /**
14
+ * Has to serialize/deserialize to/from json
15
+ */
16
+ state: unknown);
17
+ getPathString(): string;
18
+ toString(): string;
19
+ }
20
+ export interface QueryArgs {
21
+ readonly [key: string]: string;
22
+ }
23
+ //# sourceMappingURL=Path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Path.d.ts","sourceRoot":"","sources":["../../src/router/Path.ts"],"names":[],"mappings":"AASA,qBAAa,cAAc;aAsBH,IAAI,EAAE,MAAM,EAAE;aACd,SAAS,EAAE,SAAS;aACpB,IAAI,EAAE,MAAM;IAE5B;;OAEG;aACa,KAAK,EAAE,OAAO;WA5BpB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,cAAc;WAK1D,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,cAAc;IAStD,KAAK,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG;gBAOX,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM;IAE5B;;OAEG;IACa,KAAK,EAAE,OAAO;IAG3B,aAAa,IAAI,MAAM;IAIvB,QAAQ,IAAI,MAAM;CAQ5B;AAED,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC"}
@@ -0,0 +1,63 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ function relative(path, prefix) {
6
+ for (let i = 0; i < prefix.length; i++) {
7
+ if (path[i] !== prefix[i]) {
8
+ return ['..'];
9
+ }
10
+ }
11
+ return path.slice(prefix.length);
12
+ }
13
+ class NavigationPath {
14
+ static create(path, queryArgs) {
15
+ const parts = parsePath(path);
16
+ return new NavigationPath(parts, queryArgs, '', null);
17
+ }
18
+ static fromUrl(url, rootUrl) {
19
+ const rootPath = parsePath(rootUrl.pathname);
20
+ const urlPath = parsePath(url.pathname);
21
+ const path = relative(urlPath, rootPath);
22
+ const p = new URLSearchParams(url.search);
23
+ const queryArgs = Object.fromEntries(p);
24
+ return new NavigationPath(path, queryArgs, url.hash, null);
25
+ }
26
+ toUrl(rootUrl) {
27
+ const parts = parsePath(rootUrl.pathname);
28
+ const url = new URL(parts.join('/') + this.toString(), rootUrl);
29
+ return url;
30
+ }
31
+ constructor(path, queryArgs, hash,
32
+ /**
33
+ * Has to serialize/deserialize to/from json
34
+ */
35
+ state) {
36
+ this.path = path;
37
+ this.queryArgs = queryArgs;
38
+ this.hash = hash;
39
+ this.state = state;
40
+ }
41
+ getPathString() {
42
+ return "/" + this.path.join("/");
43
+ }
44
+ toString() {
45
+ let str = this.getPathString();
46
+ const search = new URLSearchParams(this.queryArgs).toString();
47
+ if (search !== "") {
48
+ str += `?${search}`;
49
+ }
50
+ return str;
51
+ }
52
+ }
53
+ function parsePath(path) {
54
+ if (!path.startsWith("/")) {
55
+ throw new Error(`Expected pathname "${path}" to start with "/"`);
56
+ }
57
+ path = path.substring(1);
58
+ const items = path ? path.split("/") : [];
59
+ return items;
60
+ }
61
+
62
+ export { NavigationPath };
63
+ //# sourceMappingURL=Path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Path.js","sources":["../../src/router/Path.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class PathPattern {
2
+ private readonly _segments;
3
+ /**
4
+ * E.g. "/folder/:path/::rest"
5
+ */
6
+ static parse(pattern: string): PathPattern;
7
+ private constructor();
8
+ match(path: string): {
9
+ [key: string]: string;
10
+ } | undefined;
11
+ build(data: {
12
+ [key: string]: unknown;
13
+ }): string;
14
+ }
15
+ //# sourceMappingURL=PathPattern.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathPattern.d.ts","sourceRoot":"","sources":["../../src/router/PathPattern.ts"],"names":[],"mappings":"AACA,qBAAa,WAAW;IAuBA,OAAO,CAAC,QAAQ,CAAC,SAAS;IAtB9C;;MAEE;WACY,KAAK,CAAC,OAAO,EAAE,MAAM;IAmBnC,OAAO;IAGA,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,SAAS;IAsC1D,KAAK,CAAC,IAAI,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,MAAM;CAezD"}