@owlmeans/web-client 0.1.18-rc.9 → 0.1.18

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 (118) hide show
  1. package/README.md +247 -43
  2. package/agent-meta/manifest.json +3 -3
  3. package/agent-meta/skills/web-client/SKILL.md +62 -73
  4. package/build/components/dispatcher/component.d.ts.map +1 -1
  5. package/build/components/dispatcher/component.js +55 -9
  6. package/build/components/dispatcher/component.js.map +1 -1
  7. package/build/components/dispatcher/parametrise.d.ts.map +1 -1
  8. package/build/components/dispatcher/parametrise.js +0 -3
  9. package/build/components/dispatcher/parametrise.js.map +1 -1
  10. package/build/components/dispatcher/types.d.ts +2 -2
  11. package/build/components/dispatcher/types.d.ts.map +1 -1
  12. package/build/context.d.ts.map +1 -1
  13. package/build/context.js +0 -1
  14. package/build/context.js.map +1 -1
  15. package/build/entrypoints.d.ts +16 -0
  16. package/build/entrypoints.d.ts.map +1 -0
  17. package/build/entrypoints.js +20 -0
  18. package/build/entrypoints.js.map +1 -0
  19. package/build/exports.d.ts +3 -2
  20. package/build/exports.d.ts.map +1 -1
  21. package/build/exports.js +2 -2
  22. package/build/exports.js.map +1 -1
  23. package/build/i18n/auth-be.json +32 -0
  24. package/build/i18n/auth-de.json +32 -0
  25. package/build/i18n/auth-en.json +32 -0
  26. package/build/i18n/auth-es.json +32 -0
  27. package/build/i18n/auth-fr.json +38 -0
  28. package/build/i18n/auth-pl.json +32 -0
  29. package/build/i18n/auth-ru.json +32 -0
  30. package/build/i18n/auth-uk.json +32 -0
  31. package/build/i18n.js +10 -8
  32. package/build/i18n.js.map +1 -1
  33. package/build/index.d.ts +1 -1
  34. package/build/index.d.ts.map +1 -1
  35. package/build/index.js +1 -1
  36. package/build/index.js.map +1 -1
  37. package/build/login/consts.d.ts +36 -0
  38. package/build/login/consts.d.ts.map +1 -1
  39. package/build/login/consts.js +38 -0
  40. package/build/login/consts.js.map +1 -1
  41. package/build/login/consts.local.d.ts +22 -0
  42. package/build/login/consts.local.d.ts.map +1 -0
  43. package/build/login/consts.local.js +48 -0
  44. package/build/login/consts.local.js.map +1 -0
  45. package/build/login/index.d.ts +4 -0
  46. package/build/login/index.d.ts.map +1 -1
  47. package/build/login/index.js +3 -0
  48. package/build/login/index.js.map +1 -1
  49. package/build/login/pump.d.ts +20 -0
  50. package/build/login/pump.d.ts.map +1 -0
  51. package/build/login/pump.js +46 -0
  52. package/build/login/pump.js.map +1 -0
  53. package/build/login/redirect.d.ts.map +1 -1
  54. package/build/login/redirect.js +17 -1
  55. package/build/login/redirect.js.map +1 -1
  56. package/build/login/screen.d.ts +19 -0
  57. package/build/login/screen.d.ts.map +1 -0
  58. package/build/login/screen.js +119 -0
  59. package/build/login/screen.js.map +1 -0
  60. package/build/login/surrogate.d.ts +16 -0
  61. package/build/login/surrogate.d.ts.map +1 -1
  62. package/build/login/surrogate.js +139 -71
  63. package/build/login/surrogate.js.map +1 -1
  64. package/build/login/types.d.ts +10 -0
  65. package/build/login/types.d.ts.map +1 -0
  66. package/build/login/types.js +2 -0
  67. package/build/login/types.js.map +1 -0
  68. package/build/login/view.d.ts +4 -0
  69. package/build/login/view.d.ts.map +1 -0
  70. package/build/login/view.js +12 -0
  71. package/build/login/view.js.map +1 -0
  72. package/build/main.d.ts +9 -1
  73. package/build/main.d.ts.map +1 -1
  74. package/build/main.js +18 -5
  75. package/build/main.js.map +1 -1
  76. package/build/middleware.d.ts +1 -1
  77. package/build/middleware.d.ts.map +1 -1
  78. package/build/middleware.js +7 -6
  79. package/build/middleware.js.map +1 -1
  80. package/build/service.js +1 -1
  81. package/build/service.js.map +1 -1
  82. package/build/types.local.d.ts +5 -0
  83. package/build/types.local.d.ts.map +1 -0
  84. package/build/types.local.js +2 -0
  85. package/build/types.local.js.map +1 -0
  86. package/package.json +22 -21
  87. package/src/components/dispatcher/component.tsx +71 -8
  88. package/src/components/dispatcher/parametrise.tsx +0 -3
  89. package/src/components/dispatcher/types.ts +2 -2
  90. package/src/context.ts +0 -2
  91. package/src/entrypoints.ts +20 -0
  92. package/src/exports.ts +7 -2
  93. package/src/i18n/auth-be.json +32 -0
  94. package/src/i18n/auth-de.json +32 -0
  95. package/src/i18n/auth-en.json +32 -0
  96. package/src/i18n/auth-es.json +32 -0
  97. package/src/i18n/auth-fr.json +38 -0
  98. package/src/i18n/auth-pl.json +32 -0
  99. package/src/i18n/auth-ru.json +32 -0
  100. package/src/i18n/auth-uk.json +32 -0
  101. package/src/i18n.ts +10 -8
  102. package/src/index.ts +1 -1
  103. package/src/login/consts.local.ts +52 -0
  104. package/src/login/consts.ts +38 -0
  105. package/src/login/index.ts +4 -0
  106. package/src/login/pump.ts +53 -0
  107. package/src/login/redirect.ts +23 -2
  108. package/src/login/screen.tsx +141 -0
  109. package/src/login/surrogate.ts +170 -86
  110. package/src/login/types.ts +10 -0
  111. package/src/login/view.tsx +22 -0
  112. package/src/main.tsx +19 -6
  113. package/src/middleware.ts +9 -12
  114. package/src/service.ts +1 -1
  115. package/src/types.local.ts +5 -0
  116. package/tests/surrogate.spec.ts +74 -0
  117. package/tsconfig.json +1 -1
  118. package/src/modules.ts +0 -9
@@ -1,5 +1,30 @@
1
- import { adoptToken, clearSurrogate, markSurrogate, LoginOutcome, LOGIN_SURROGATE_FEATURES, LOGIN_SURROGATE_NAME, LOGIN_TOKEN_MESSAGE, LOGIN_WATCH_INTERVAL, } from '@owlmeans/client-auth/login';
1
+ import { surrogatePath, LoginIntent, LoginOutcome, LOGIN_LOGOUT_MESSAGE, LOGIN_SURROGATE_HEIGHT, LOGIN_SURROGATE_NAME, LOGIN_SURROGATE_WIDTH, LOGIN_TOKEN_MESSAGE, loginEnvHelper, loginTokenOf } from '@owlmeans/client-auth/login';
2
2
  import { SURROGATE_LOGIN, SURROGATE_LOGIN_PRIORITY } from './consts.js';
3
+ import { awaitSurrogate } from './pump.js';
4
+ /**
5
+ * `window.open` features that size and CENTER the surrogate on the screen the browser window
6
+ * currently occupies.
7
+ *
8
+ * Computed fresh per call, never a constant: centering depends on where the browser window sits
9
+ * NOW, which can change between one login attempt and the next. `screenLeft`/`screenTop` and
10
+ * `outerWidth`/`outerHeight` describe the browser's own chrome rather than this document's
11
+ * viewport — and, unlike `innerWidth` or anything reached through `window.top`, they stay readable
12
+ * from a cross-origin iframe. That matters here specifically: a generated app's preview runs
13
+ * framed on a different origin than the manager that embeds it, so `env.embedded` is exactly the
14
+ * case where `window.top.innerWidth` would throw, and reading this document's own `innerWidth`
15
+ * instead would center the popup on the IFRAME's rectangle rather than on the actual window a
16
+ * person sees. Falling back to `window.screen` covers a window that reports no outer geometry at
17
+ * all (a headless test runner).
18
+ */
19
+ export const centeredPopupFeatures = (width, height) => {
20
+ const screenLeft = window.screenLeft ?? window.screenX ?? 0;
21
+ const screenTop = window.screenTop ?? window.screenY ?? 0;
22
+ const outerWidth = window.outerWidth || window.screen.width;
23
+ const outerHeight = window.outerHeight || window.screen.height;
24
+ const left = Math.round(screenLeft + Math.max(0, (outerWidth - width) / 2));
25
+ const top = Math.round(screenTop + Math.max(0, (outerHeight - height) / 2));
26
+ return `popup=yes,width=${width},height=${height},left=${left},top=${top}`;
27
+ };
3
28
  /**
4
29
  * Login for a document that cannot complete the flow where it is.
5
30
  *
@@ -18,73 +43,14 @@ import { SURROGATE_LOGIN, SURROGATE_LOGIN_PRIORITY } from './consts.js';
18
43
  * top-level, so it authorizes by an ordinary redirect and differs only in what it does with the
19
44
  * token at the end.
20
45
  */
21
- export const makeSurrogateLoginPlugin = () => ({
22
- alias: SURROGATE_LOGIN,
23
- priority: SURROGATE_LOGIN_PRIORITY,
24
- mode: 'surrogate',
25
- match: env => env.hasWindow && (env.embedded || env.surrogate),
26
- enter: () => { markSurrogate(); },
27
- begin: (ctx, request, env) => {
28
- // Already one window up — nothing to open, just run the flow.
29
- if (env.surrogate) {
30
- window.location.href = request.url;
31
- return Promise.resolve(LoginOutcome.Redirected);
32
- }
33
- // Opened FIRST and synchronously: `window.open` escapes the popup blocker only while the user
34
- // gesture is still being handled, so nothing may be awaited before this line. That is why this
35
- // function is not `async`.
36
- const surrogate = window.open(request.url, LOGIN_SURROGATE_NAME, LOGIN_SURROGATE_FEATURES);
37
- if (surrogate == null) {
38
- return Promise.resolve(LoginOutcome.Failed);
39
- }
40
- return new Promise(resolve => {
41
- let settled = false;
42
- let watch;
43
- const finish = (result) => {
44
- if (settled) {
45
- return;
46
- }
47
- settled = true;
48
- window.removeEventListener('message', onMessage);
49
- if (watch != null) {
50
- clearInterval(watch);
51
- }
52
- resolve(result);
53
- };
54
- function onMessage(event) {
55
- if (event.origin !== window.location.origin) {
56
- return;
57
- }
58
- const data = event.data;
59
- if (data?.type !== LOGIN_TOKEN_MESSAGE || data.token == null || data.token === '') {
60
- return;
61
- }
62
- void adoptToken(ctx, data.token)
63
- .then(() => finish(LoginOutcome.Handled))
64
- .catch(() => finish(LoginOutcome.Failed));
65
- }
66
- window.addEventListener('message', onMessage);
67
- // A window the user simply closes announces nothing, so the only way to stop waiting on it
68
- // is to watch for it going away.
69
- watch = setInterval(() => {
70
- if (surrogate.closed) {
71
- finish(LoginOutcome.Failed);
72
- }
73
- }, LOGIN_WATCH_INTERVAL);
74
- });
75
- },
76
- authorize: async (_ctx, url, env) => {
77
- // The surrogate is top-level, so it redirects like any ordinary tab.
78
- if (env.surrogate) {
79
- window.location.href = url;
80
- return LoginOutcome.Redirected;
81
- }
82
- // Framed, and not yet one window up. A redirect from here would land in the frame and be
83
- // refused, and the window that would fix it cannot be opened without a user gesture — so the
84
- // caller is told to render a control rather than to navigate.
85
- return LoginOutcome.Gesture;
86
- },
87
- complete: async (_ctx, token, env) => {
46
+ export const makeSurrogateLoginPlugin = () => {
47
+ /**
48
+ * Give the token to whoever is entitled to it, and get out of the way.
49
+ *
50
+ * Shared by `complete` (a token was just issued here) and `resume` (one was already here),
51
+ * because what happens to it is the same in both cases and only the question differs.
52
+ */
53
+ const handBack = async (token, env) => {
88
54
  if (!env.surrogate) {
89
55
  // This document started the flow and finished it in place — it already has what it needs.
90
56
  return LoginOutcome.Passed;
@@ -94,12 +60,114 @@ export const makeSurrogateLoginPlugin = () => ({
94
60
  // provider severs `window.opener` permanently, so this is not a timing problem to retry.
95
61
  return LoginOutcome.Orphaned;
96
62
  }
97
- clearSurrogate();
63
+ loginEnvHelper.clearSurrogate();
98
64
  // Both windows are the same origin (the surrogate is this application's own login route), so
99
65
  // the origin is pinned rather than passed as `*` — the message carries a bearer token.
100
66
  window.opener.postMessage({ type: LOGIN_TOKEN_MESSAGE, token }, window.location.origin);
101
67
  window.close();
102
68
  return LoginOutcome.Handled;
103
- },
104
- });
69
+ };
70
+ const plugin = {
71
+ alias: SURROGATE_LOGIN,
72
+ priority: SURROGATE_LOGIN_PRIORITY,
73
+ mode: 'surrogate',
74
+ match: env => env.hasWindow && (env.embedded || env.surrogate),
75
+ enter: () => { loginEnvHelper.markSurrogate(); },
76
+ begin: (ctx, request, env) => {
77
+ // Already one window up — nothing to open, just run the flow.
78
+ if (env.surrogate) {
79
+ window.location.href = request.url;
80
+ return Promise.resolve(LoginOutcome.Redirected);
81
+ }
82
+ // Opened FIRST and synchronously: `window.open` escapes the popup blocker only while the
83
+ // user gesture is still being handled, so nothing may be awaited before this line. That is
84
+ // why this function is not `async`.
85
+ //
86
+ // The window opens on the surrogate route rather than on the dispatcher, so its very first
87
+ // paint is a bare "signing you in" panel instead of the application with its navigation. The
88
+ // dispatcher address travels as `next`, because the provider's callback still lands there and
89
+ // whatever flow parameters the caller's URL carried must survive the hop.
90
+ const path = surrogatePath(ctx, {
91
+ intent: LoginIntent.Login, next: request.url,
92
+ });
93
+ const surrogate = window.open(path ?? request.url, LOGIN_SURROGATE_NAME, centeredPopupFeatures(LOGIN_SURROGATE_WIDTH, LOGIN_SURROGATE_HEIGHT));
94
+ if (surrogate == null) {
95
+ // Distinct from `Failed` below: nothing ever opened, so there is nothing left to wait on.
96
+ return Promise.resolve(LoginOutcome.Blocked);
97
+ }
98
+ return awaitSurrogate(surrogate, LOGIN_TOKEN_MESSAGE, async (data) => {
99
+ if (data.token == null || data.token === '') {
100
+ return LoginOutcome.Failed;
101
+ }
102
+ await loginTokenOf(ctx).adoptToken(data.token);
103
+ // Adopting the token is not the end of the flow — running the caller's continuation is,
104
+ // exactly as the redirect plugin does before it reports `Handled`. Without it the token
105
+ // lands in the auth service and nothing else happens: the framed app keeps rendering its
106
+ // signed-out tree, and the user watches the login window close over a preview that never
107
+ // changes. `Handled` promises the caller there is nothing left to do.
108
+ await request.navigate?.();
109
+ return LoginOutcome.Handled;
110
+ });
111
+ },
112
+ authorize: async (_ctx, url, env) => {
113
+ // The surrogate is top-level, so it redirects like any ordinary tab.
114
+ if (env.surrogate) {
115
+ window.location.href = url;
116
+ return LoginOutcome.Redirected;
117
+ }
118
+ // Framed, and not yet one window up. A redirect from here would land in the frame and be
119
+ // refused, and the window that would fix it cannot be opened without a user gesture — so the
120
+ // caller is told to render a control rather than to navigate.
121
+ return LoginOutcome.Gesture;
122
+ },
123
+ complete: async (_ctx, token, env) => await handBack(token, env),
124
+ // A session that was already here is worth exactly as much as one just issued — to the window
125
+ // that asked for it. Without this the surrogate would render the signed-in application to
126
+ // itself and the framed app would stay signed out, which is the whole reported defect.
127
+ resume: async (_ctx, token, env) => await handBack(token, env),
128
+ logout: (ctx, request, env) => {
129
+ // Already one window up — end the session here and tell the opener.
130
+ if (env.surrogate) {
131
+ return loginTokenOf(ctx).revokeToken()
132
+ .then(async () => await plugin.logoutComplete(ctx, env));
133
+ }
134
+ const path = surrogatePath(ctx, { intent: LoginIntent.Logout });
135
+ // Opened first and synchronously, for the same reason `begin` does.
136
+ const surrogate = path != null
137
+ ? window.open(path, LOGIN_SURROGATE_NAME, centeredPopupFeatures(LOGIN_SURROGATE_WIDTH, LOGIN_SURROGATE_HEIGHT))
138
+ : null;
139
+ // The local session goes next, and UNCONDITIONALLY. A blocked window, a severed opener or a
140
+ // user who closes the popup must never leave THIS document signed in: a logout that only
141
+ // half happened is bad, and one that did not happen at all is worse.
142
+ const local = loginTokenOf(ctx).revokeToken();
143
+ if (surrogate == null) {
144
+ // `path == null` is an app whose entrypoint list predates the surrogate route — nothing a
145
+ // retry would do differently. A `window.open` the browser refused is the one case worth
146
+ // telling the user about, so only that one reports `Blocked`.
147
+ const outcome = path != null ? LoginOutcome.Blocked : LoginOutcome.Failed;
148
+ return local.then(async () => {
149
+ await request.navigate?.();
150
+ return outcome;
151
+ });
152
+ }
153
+ return local.then(async () => await awaitSurrogate(surrogate, LOGIN_LOGOUT_MESSAGE, async () => {
154
+ await request.navigate?.();
155
+ return LoginOutcome.Handled;
156
+ }));
157
+ },
158
+ logoutComplete: async (_ctx, env) => {
159
+ if (!env.surrogate) {
160
+ return LoginOutcome.Passed;
161
+ }
162
+ if (!env.hasOpener) {
163
+ return LoginOutcome.Orphaned;
164
+ }
165
+ loginEnvHelper.clearSurrogate();
166
+ window.opener.postMessage({ type: LOGIN_LOGOUT_MESSAGE, ok: true }, window.location.origin);
167
+ window.close();
168
+ return LoginOutcome.Handled;
169
+ },
170
+ };
171
+ return plugin;
172
+ };
105
173
  //# sourceMappingURL=surrogate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"surrogate.js","sourceRoot":"","sources":["../../src/login/surrogate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EACvD,wBAAwB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,GAC1F,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAEvE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAgB,EAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,eAAe;IACtB,QAAQ,EAAE,wBAAwB;IAClC,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC;IAE9D,KAAK,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,CAAA,CAAC,CAAC;IAEhC,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC3B,8DAA8D;QAC9D,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAA;YAElC,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAA;QACjD,CAAC;QAED,8FAA8F;QAC9F,+FAA+F;QAC/F,2BAA2B;QAC3B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,CAAA;QAC1F,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,IAAI,OAAO,CAAe,OAAO,CAAC,EAAE;YACzC,IAAI,OAAO,GAAG,KAAK,CAAA;YACnB,IAAI,KAAiD,CAAA;YAErD,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAQ,EAAE;gBAC5C,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAM;gBACR,CAAC;gBACD,OAAO,GAAG,IAAI,CAAA;gBACd,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBAChD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAClB,aAAa,CAAC,KAAK,CAAC,CAAA;gBACtB,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAA;YACjB,CAAC,CAAA;YAED,SAAS,SAAS,CAAC,KAAmB;gBACpC,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC5C,OAAM;gBACR,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAgD,CAAA;gBACnE,IAAI,IAAI,EAAE,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;oBAClF,OAAM;gBACR,CAAC;gBACD,KAAK,UAAU,CAAC,GAAmB,EAAE,IAAI,CAAC,KAAK,CAAC;qBAC7C,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;qBACxC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;YAC7C,CAAC;YAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YAC7C,2FAA2F;YAC3F,iCAAiC;YACjC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;gBACvB,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;oBACrB,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClC,qEAAqE;QACrE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAA;YAE1B,OAAO,YAAY,CAAC,UAAU,CAAA;QAChC,CAAC;QAED,yFAAyF;QACzF,6FAA6F;QAC7F,8DAA8D;QAC9D,OAAO,YAAY,CAAC,OAAO,CAAA;IAC7B,CAAC;IAED,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACnC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,0FAA0F;YAC1F,OAAO,YAAY,CAAC,MAAM,CAAA;QAC5B,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,4FAA4F;YAC5F,yFAAyF;YACzF,OAAO,YAAY,CAAC,QAAQ,CAAA;QAC9B,CAAC;QAED,cAAc,EAAE,CAAA;QAChB,6FAA6F;QAC7F,uFAAuF;QACvF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACvF,MAAM,CAAC,KAAK,EAAE,CAAA;QAEd,OAAO,YAAY,CAAC,OAAO,CAAA;IAC7B,CAAC;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"surrogate.js","sourceRoot":"","sources":["../../src/login/surrogate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { LoginIntent } from '@owlmeans/client-auth/login';
2
+ import { SurrogateStage } from './consts.js';
3
+ export interface SurrogateViewProps {
4
+ stage: SurrogateStage;
5
+ intent: LoginIntent;
6
+ onAction?: () => void;
7
+ error?: string;
8
+ translate?: (key: string, defaultValue: string) => string;
9
+ }
10
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/login/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,WAAW,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,CAAA;CAC1D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/login/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import type { FC } from 'react';
2
+ import type { SurrogateViewProps } from './types.js';
3
+ export declare const LoginSurrogateView: FC<SurrogateViewProps>;
4
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/login/view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAG/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,kBAAkB,CAgBrD,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { LoginIntent } from '@owlmeans/client-auth/login';
3
+ import { action, box, COPY, LOGOUT_COPY } from './consts.local.js';
4
+ export const LoginSurrogateView = ({ stage, intent, onAction, error, translate }) => {
5
+ const t = translate ?? ((_key, defaultValue) => defaultValue);
6
+ const scope = intent === LoginIntent.Logout ? 'logout' : 'login';
7
+ const base = COPY[stage];
8
+ const copy = (intent === LoginIntent.Logout ? LOGOUT_COPY[stage] : undefined) ?? base;
9
+ return _jsxs("div", { style: box, "data-surrogate-stage": stage, "data-surrogate-intent": intent, children: [_jsx("p", { children: t(`surrogate.${scope}.${copy.key}`, copy.en) }), error != null && error !== '' &&
10
+ _jsx("p", { style: { color: '#b00', fontSize: '.875rem' }, role: "alert", children: error }), base.action != null && onAction != null && _jsx("button", { type: "button", style: action, onClick: onAction, children: t(`surrogate.${scope}.${base.action[0]}`, base.action[1]) })] });
11
+ };
12
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../src/login/view.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGlE,MAAM,CAAC,MAAM,kBAAkB,GAA2B,CACxD,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,EAC7C,EAAE;IACF,MAAM,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,IAAY,EAAE,YAAoB,EAAE,EAAE,CAAC,YAAY,CAAC,CAAA;IAC7E,MAAM,KAAK,GAAG,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IACxB,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;IAErF,OAAO,eAAK,KAAK,EAAE,GAAG,0BAAwB,KAAK,2BAAyB,MAAM,aAChF,sBAAI,CAAC,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,GAAK,EACpD,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;gBAC5B,YAAG,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAC,OAAO,YAAE,KAAK,GAAK,EAC3E,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,iBAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,YAC/F,CAAC,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GACnD,IACL,CAAA;AACR,CAAC,CAAA"}
package/build/main.d.ts CHANGED
@@ -1,5 +1,13 @@
1
1
  import type { ReactNode } from 'react';
2
2
  import type { AppConfig, AppContext, RenderOptions } from './types.js';
3
3
  export declare const render: (node: ReactNode, opts?: RenderOptions) => void;
4
- export declare const renderApp: <C extends AppConfig, T extends AppContext<C>>(context: T, opts?: RenderOptions) => void;
4
+ /**
5
+ * Mount the application.
6
+ *
7
+ * `children` are rendered inside the context provider and BEFORE the router, which makes them the
8
+ * app's global overlay slot: a consent dialog, a toast surface, anything that must exist on every
9
+ * route and outlive navigation. A component mounted inside a route instead is torn down and
10
+ * rebuilt on every navigation, which for a dialog means it closes itself.
11
+ */
12
+ export declare const renderApp: <C extends AppConfig, T extends AppContext<C>>(context: T, opts?: RenderOptions, children?: ReactNode) => void;
5
13
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGtE,eAAO,MAAM,MAAM,SAAU,SAAS,SAAS,aAAa,SAkB3D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,aAAa,SAC5D,CAAA"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGtE,eAAO,MAAM,MAAM,SAAU,SAAS,SAAS,aAAa,SAsB3D,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,WAC3D,CAAC,SAAS,aAAa,aAAa,SAAS,SACQ,CAAA"}
package/build/main.js CHANGED
@@ -6,9 +6,6 @@ export const render = (node, opts) => {
6
6
  const _callback = () => {
7
7
  const key = opts?.domId ?? DEFAULT_ROOT;
8
8
  const root = document.getElementById(key);
9
- if (opts?.debug) {
10
- console.debug(`Render react app to ${key}`);
11
- }
12
9
  if (root == null) {
13
10
  throw new Error(`Root element not found with id: ${key}`);
14
11
  }
@@ -19,7 +16,23 @@ export const render = (node, opts) => {
19
16
  createRoot(root).render(node);
20
17
  }
21
18
  };
22
- opts?.onReady ?? true ? window.addEventListener('DOMContentLoaded', _callback) : _callback();
19
+ // Wait for the DOM only while it is still loading: a caller that awaits something first
20
+ // (`await prepareI18n(cfg); render(...)`) can run after `DOMContentLoaded` has already fired,
21
+ // and a listener added then never runs — the app would never mount.
22
+ if ((opts?.onReady ?? true) && document.readyState === 'loading') {
23
+ window.addEventListener('DOMContentLoaded', _callback, { once: true });
24
+ }
25
+ else {
26
+ _callback();
27
+ }
23
28
  };
24
- export const renderApp = (context, opts) => render(_jsx(WebApp, { context: context }), opts);
29
+ /**
30
+ * Mount the application.
31
+ *
32
+ * `children` are rendered inside the context provider and BEFORE the router, which makes them the
33
+ * app's global overlay slot: a consent dialog, a toast surface, anything that must exist on every
34
+ * route and outlive navigation. A component mounted inside a route instead is torn down and
35
+ * rebuilt on every navigation, which for a dialog means it closes itself.
36
+ */
37
+ export const renderApp = (context, opts, children) => render(_jsx(WebApp, { context: context, children: children }), opts);
25
38
  //# sourceMappingURL=main.js.map
package/build/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,IAAoB,EAAE,EAAE;IAC9D,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI,YAAY,CAAA;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAA;QAC7C,CAAC;QACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC,CAAA;IAED,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;AAC9F,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAA+C,OAAU,EAAE,IAAoB,EAAE,EAAE,CAC1G,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,GAAI,EAAE,IAAI,CAAC,CAAA"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,IAAoB,EAAE,EAAE;IAC9D,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI,YAAY,CAAA;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,GAAG,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,IAAI,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;YAC3B,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC,CAAA;IAED,wFAAwF;IACxF,8FAA8F;IAC9F,oEAAoE;IACpE,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACjE,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;SAAM,CAAC;QACN,SAAS,EAAE,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAAU,EAAE,IAAoB,EAAE,QAAoB,EACtD,EAAE,CAAC,MAAM,CAAC,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,YAAG,QAAQ,GAAU,EAAE,IAAI,CAAC,CAAA"}
@@ -1,3 +1,3 @@
1
- import type { Middleware } from '@owlmeans/context';
1
+ import { type Middleware } from '@owlmeans/context';
2
2
  export declare const logoutMiddleware: Middleware;
3
3
  //# sourceMappingURL=middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAQnD,eAAO,MAAM,gBAAgB,EAAE,UAsC9B,CAAA"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAA4C,MAAM,mBAAmB,CAAA;AAO7F,eAAO,MAAM,gBAAgB,EAAE,UAuC9B,CAAA"}
@@ -7,18 +7,19 @@ export const logoutMiddleware = {
7
7
  stage: MiddlewareStage.Loading,
8
8
  apply: async (context) => {
9
9
  context.entrypoints().forEach(module => {
10
- if (module.route.route.type === AppType.Backend && module.call != null) {
10
+ if (module.route.route.type === AppType.Backend && module.invoke != null) {
11
11
  const guards = module.getGuards();
12
12
  if (guards.length > 0) {
13
13
  if (module._auth_web_middleware_applied === true) {
14
14
  return;
15
15
  }
16
16
  module._auth_web_middleware_applied = true;
17
- // const auth = context.service<GuardService>(service)
18
- const call = module.call;
19
- module.call = async (req, res) => {
17
+ // Wrapping `invoke` covers `call` too: `call` reads `invoke` off the entrypoint at the
18
+ // moment it runs, so a rejected session is caught whichever verb the caller used.
19
+ const invoke = module.invoke;
20
+ module.invoke = (async (req) => {
20
21
  try {
21
- return await call(req, res);
22
+ return await invoke(req);
22
23
  }
23
24
  catch (e) {
24
25
  if (e instanceof Error) {
@@ -35,7 +36,7 @@ export const logoutMiddleware = {
35
36
  }
36
37
  throw e;
37
38
  }
38
- };
39
+ });
39
40
  }
40
41
  }
41
42
  });
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,IAAI,EAAE,cAAc,CAAC,OAAO;IAC5B,KAAK,EAAE,eAAe,CAAC,OAAO;IAC9B,KAAK,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QACrB,OAAO,CAAC,WAAW,EAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;gBACvE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;gBACjC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,IAAI,MAAM,CAAC,4BAA4B,KAAK,IAAI,EAAE,CAAC;wBACjD,OAAM;oBACR,CAAC;oBACD,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAA;oBAC1C,sDAAsD;oBACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;oBACxB,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;wBAC/B,IAAI,CAAC;4BACH,OAAO,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;wBAC7B,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;gCACvB,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gCACpC,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;oCAC/B,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wCACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;4CAClC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAc,aAAa,CAAC,CAAA;4CACxD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;4CAC5B,MAAM,GAAG,CAAA;wCACX,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;4BACD,MAAM,CAAC,CAAA;wBACT,CAAC;oBACH,CAAC,CAAA;gBAEH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,cAAc,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAIrD,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C,IAAI,EAAE,cAAc,CAAC,OAAO;IAC5B,KAAK,EAAE,eAAe,CAAC,OAAO;IAC9B,KAAK,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QACrB,OAAO,CAAC,WAAW,EAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;gBACzE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;gBACjC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtB,IAAI,MAAM,CAAC,4BAA4B,KAAK,IAAI,EAAE,CAAC;wBACjD,OAAM;oBACR,CAAC;oBACD,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAA;oBAC1C,uFAAuF;oBACvF,kFAAkF;oBAClF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;oBAC5B,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;wBAC3B,IAAI,CAAC;4BACH,OAAO,MAAM,MAAM,CAAC,GAAG,CAAC,CAAA;wBAC1B,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;gCACvB,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gCACpC,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;oCAC/B,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wCACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;4CAClC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAc,aAAa,CAAC,CAAA;4CACxD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;4CAC5B,MAAM,GAAG,CAAA;wCACX,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;4BACD,MAAM,CAAC,CAAA;wBACT,CAAC;oBACH,CAAC,CAAyB,CAAA;gBAE5B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF,CAAA"}
package/build/service.js CHANGED
@@ -9,7 +9,7 @@ export const makeAuthWebService = (alias = DEFAULT_ALIAS) => {
9
9
  await update(token);
10
10
  if (token == null) {
11
11
  const module = service.assertCtx().entrypoint(DISPATCHER);
12
- const [url] = await module.call();
12
+ const url = await module.url();
13
13
  document.location.href = url;
14
14
  }
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAK,GAAW,aAAa,EAAe,EAAE;IAC/E,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAEtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC7B,OAAO,CAAC,MAAM,GAAG,KAAK,EAAC,KAAK,EAAC,EAAE;QAC7B,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;QACnB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAA2B,UAAU,CAAC,CAAA;YACnF,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YACjC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAM,EAAE,KAAK,GAAW,aAAa,EACd,EAAE;IACzB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAEzC,MAAM,OAAO,GAAG,GAA4B,CAAA;IAE5C,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAEhC,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAA;IAC1C,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAA;IAE5C,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAE/C,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAK,GAAW,aAAa,EAAe,EAAE;IAC/E,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAEtC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC7B,OAAO,CAAC,MAAM,GAAG,KAAK,EAAC,KAAK,EAAC,EAAE;QAC7B,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;QACnB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,UAAU,CAA2B,UAAU,CAAC,CAAA;YACnF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAA;YAC9B,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAA;QAC9B,CAAC;IACH,CAAC,CAAA;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,GAAM,EAAE,KAAK,GAAW,aAAa,EACd,EAAE;IACzB,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAEzC,MAAM,OAAO,GAAG,GAA4B,CAAA;IAE5C,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAA;IAEhC,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAA;IAC1C,OAAO,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAA;IAE5C,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAE/C,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ClientEntrypoint } from '@owlmeans/client-entrypoint';
2
+ export interface Perked extends ClientEntrypoint<unknown> {
3
+ _auth_web_middleware_applied?: boolean;
4
+ }
5
+ //# sourceMappingURL=types.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE,MAAM,WAAW,MAAO,SAAQ,gBAAgB,CAAC,OAAO,CAAC;IACvD,4BAA4B,CAAC,EAAE,OAAO,CAAA;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.js","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/web-client",
3
- "version": "0.1.18-rc.9",
3
+ "version": "0.1.18",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -21,32 +21,33 @@
21
21
  }
22
22
  },
23
23
  "dependencies": {
24
- "@owlmeans/auth": "^0.1.18-rc.6",
25
- "@owlmeans/auth-common": "^0.1.18-rc.7",
26
- "@owlmeans/client": "^0.1.18-rc.8",
27
- "@owlmeans/client-auth": "^0.1.18-rc.9",
28
- "@owlmeans/client-context": "^0.1.18-rc.7",
29
- "@owlmeans/client-i18n": "^0.1.18-rc.7",
30
- "@owlmeans/client-entrypoint": "^0.1.18-rc.7",
31
- "@owlmeans/client-resource": "^0.1.18-rc.7",
32
- "@owlmeans/client-route": "^0.1.18-rc.7",
33
- "@owlmeans/config": "^0.1.18-rc.7",
34
- "@owlmeans/context": "^0.1.18-rc.6",
35
- "@owlmeans/error": "^0.1.18-rc.6",
36
- "@owlmeans/i18n": "^0.1.18-rc.6",
37
- "@owlmeans/route": "^0.1.18-rc.6",
38
- "@owlmeans/web-db": "^0.1.18-rc.7",
39
- "@owlmeans/web-router": "^0.1.18-rc.7",
40
- "react-dropzone": "^14.3.5"
24
+ "@owlmeans/auth": "^0.1.18",
25
+ "@owlmeans/auth-common": "^0.1.18",
26
+ "@owlmeans/client": "^0.1.18",
27
+ "@owlmeans/client-auth": "^0.1.18",
28
+ "@owlmeans/client-context": "^0.1.18",
29
+ "@owlmeans/client-i18n": "^0.1.18",
30
+ "@owlmeans/client-entrypoint": "^0.1.18",
31
+ "@owlmeans/client-resource": "^0.1.18",
32
+ "@owlmeans/client-route": "^0.1.18",
33
+ "@owlmeans/config": "^0.1.18",
34
+ "@owlmeans/context": "^0.1.18",
35
+ "@owlmeans/error": "^0.1.18",
36
+ "@owlmeans/i18n": "^0.1.18",
37
+ "@owlmeans/log": "^0.1.18",
38
+ "@owlmeans/route": "^0.1.18",
39
+ "@owlmeans/web-db": "^0.1.18",
40
+ "@owlmeans/web-router": "^0.1.18",
41
+ "react-dropzone": "^20.1.2"
41
42
  },
42
43
  "peerDependencies": {
43
44
  "react": "*",
44
45
  "react-dom": "*"
45
46
  },
46
47
  "devDependencies": {
47
- "@owlmeans/dep-config": "workspace:*",
48
- "@types/react": "^19.2.17",
49
- "@types/react-dom": "^19.2.3",
48
+ "@owlmeans/dep-config": "^0.1.18",
49
+ "@types/react": "^19.3.0",
50
+ "@types/react-dom": "^19.3.0",
50
51
  "nodemon": "^3.1.14",
51
52
  "typescript": "^7.0.2"
52
53
  },