@things-factory/auth-ui 6.1.185 → 6.1.189

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 (29) hide show
  1. package/client/components/abstract-auth-page.ts +10 -0
  2. package/client/index.ts +11 -0
  3. package/client/pages/attribute/attribute-set-management.ts +1 -1
  4. package/client/pages/auth-provider/auth-provider-management.ts +379 -0
  5. package/client/route.ts +4 -0
  6. package/dist-client/components/abstract-auth-page.js +8 -0
  7. package/dist-client/components/abstract-auth-page.js.map +1 -1
  8. package/dist-client/index.js +10 -0
  9. package/dist-client/index.js.map +1 -1
  10. package/dist-client/pages/attribute/attribute-set-management.d.ts +0 -1
  11. package/dist-client/pages/attribute/attribute-set-management.js +1 -1
  12. package/dist-client/pages/attribute/attribute-set-management.js.map +1 -1
  13. package/dist-client/pages/auth-provider/auth-provider-management.d.ts +54 -0
  14. package/dist-client/pages/auth-provider/auth-provider-management.js +369 -0
  15. package/dist-client/pages/auth-provider/auth-provider-management.js.map +1 -0
  16. package/dist-client/pages/auth-provider/auth-provider.d.ts +1 -0
  17. package/dist-client/pages/auth-provider/auth-provider.js +381 -0
  18. package/dist-client/pages/auth-provider/auth-provider.js.map +1 -0
  19. package/dist-client/route.js +3 -0
  20. package/dist-client/route.js.map +1 -1
  21. package/dist-client/tsconfig.tsbuildinfo +1 -1
  22. package/dist-server/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +5 -5
  24. package/things-factory.config.js +2 -1
  25. package/translations/en.json +8 -0
  26. package/translations/ja.json +8 -0
  27. package/translations/ko.json +8 -0
  28. package/translations/ms.json +8 -0
  29. package/translations/zh.json +8 -0
@@ -0,0 +1,381 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import Clipboard from 'clipboard';
3
+ import gql from 'graphql-tag';
4
+ import { css, html } from 'lit';
5
+ import { customElement, property, queryAll } from 'lit/decorators.js';
6
+ import { connect } from 'pwa-helpers/connect-mixin.js';
7
+ import { APPLICATION_TYPES } from '../../constants/application';
8
+ import { client } from '@operato/graphql';
9
+ import { navigate, PageView, store } from '@operato/shell';
10
+ let AuthProvider = class AuthProvider extends connect(store)(PageView) {
11
+ get context() {
12
+ return {
13
+ title: {
14
+ icon: 'apps',
15
+ text: this.application.name
16
+ }
17
+ };
18
+ }
19
+ render() {
20
+ var app = this.application || {};
21
+ return html `
22
+ <div>
23
+ <h2><mwc-icon>apps</mwc-icon>&nbsp;${app.name}</h2>
24
+ <p page-description>${app.description}</p>
25
+ </div>
26
+
27
+ <div icon>
28
+ <img src=${app.icon} />
29
+ </div>
30
+
31
+ <form>
32
+ <div fieldset-container>
33
+ <fieldset>
34
+ <legend>application</legend>
35
+ <div field-2column>
36
+ <div field grid-span>
37
+ <label for="name">app name</label>
38
+ <input id="name" type="text" name="name" .value=${app.name} />
39
+ </div>
40
+
41
+ <div field grid-span>
42
+ <label for="description">description</label>
43
+ <input id="description" type="text" name="description" .value=${app.description} />
44
+ </div>
45
+
46
+ <div field grid-span>
47
+ <label for="email">contact email</label>
48
+ <input id="email" type="text" name="email" .value=${app.email} />
49
+ </div>
50
+
51
+ <div field grid-span>
52
+ <label for="type-selector">type</label>
53
+ <select id="type-selector" name="type">
54
+ ${APPLICATION_TYPES.map(type => html `<option value="${app.type}" ?selected="${type === app.type ? true : false}">${type}</option>`)}
55
+ </select>
56
+ </div>
57
+
58
+ <div field grid-span>
59
+ <label for="url">application URL</label>
60
+ <input id="url" type="text" name="url" .value=${app.url} />
61
+ </div>
62
+
63
+ <div field grid-span>
64
+ <label for="icon">icon</label>
65
+ <input id="icon" type="text" name="icon" .value=${app.icon} />
66
+ </div>
67
+
68
+ <div field grid-span>
69
+ <label for="redirect-url">redirect URL</label>
70
+ <input id="redirect-url" type="text" name="redirectUrl" .value=${app.redirectUrl} />
71
+ </div>
72
+
73
+ <div field grid-span>
74
+ <label for="webhook">webhook</label>
75
+ <input id="webhook" type="text" name="webhook" .value=${app.webhook} />
76
+ </div>
77
+
78
+ <div field grid-span>
79
+ <label for="available-scopes">available-scopes</label>
80
+ <input id="available-scopes" type="text" .value=${app.availableScopes} readonly />
81
+ </div>
82
+
83
+ <div field grid-span>
84
+ <label for="auth-url">auth URL</label>
85
+ <input id="auth-url" type="text" .value=${app.authUrl} readonly />
86
+ <mwc-button
87
+ dense
88
+ unelevated
89
+ button-in-field
90
+ clipboard-copy
91
+ @click=${e => e.preventDefault()}
92
+ label="copy"
93
+ ></mwc-button>
94
+ The endpoint for authorization server. This is used to get the authorization code.
95
+ </div>
96
+
97
+ <div field grid-span>
98
+ <label for="access-token-url">access token URL</label>
99
+ <input id="access-token-url" type="text" .value=${app.accessTokenUrl} readonly />
100
+ <mwc-button
101
+ dense
102
+ unelevated
103
+ button-in-field
104
+ clipboard-copy
105
+ @click=${e => e.preventDefault()}
106
+ label="copy"
107
+ ></mwc-button>
108
+ The endpoint for authentication server. This is used to exchange the authorization code for an access
109
+ token.
110
+ </div>
111
+ </div>
112
+ </fieldset>
113
+ </div>
114
+
115
+ <div fieldset-container>
116
+ <fieldset>
117
+ <legend>credentials</legend>
118
+ <div field-2column>
119
+ <div field grid-span>
120
+ <label for="app-key">appKey</label>
121
+ <input id="app-key" type="text" .value=${app.appKey} readonly />
122
+ <mwc-button
123
+ dense
124
+ unelevated
125
+ button-in-field
126
+ clipboard-copy
127
+ @click=${e => e.preventDefault()}
128
+ label="copy"
129
+ ></mwc-button>
130
+ </div>
131
+
132
+ <div field grid-span>
133
+ <label for="app-secret">appSecret</label>
134
+ <input id="app-secret" type="text" .value=${app.appSecret} readonly />
135
+ <mwc-button
136
+ dense
137
+ unelevated
138
+ button-in-field
139
+ clipboard-copy
140
+ @click=${e => e.preventDefault()}
141
+ label="copy"
142
+ ></mwc-button>
143
+ </div>
144
+ </div>
145
+ </fieldset>
146
+ </div>
147
+
148
+ <div class="button-container">
149
+ <mwc-button raised danger label="delete this app" @click=${this.deleteApplication.bind(this)}></mwc-button>
150
+ <mwc-button raised label="update" @click=${this.updateApplication.bind(this)}></mwc-button>
151
+ <mwc-button outlined label="generate new secret"></mwc-button>
152
+ </div>
153
+ </form>
154
+ `;
155
+ }
156
+ firstUpdated() {
157
+ this.clipboard = new Clipboard(this.copybuttons, {
158
+ target: (trigger => trigger.parentElement.querySelector('input'))
159
+ });
160
+ }
161
+ async pageUpdated(changes, lifecycle, before) {
162
+ if (this.active) {
163
+ await this.fetchApplication();
164
+ }
165
+ }
166
+ async fetchApplication() {
167
+ const response = await client.query({
168
+ query: gql `
169
+ query ($id: String!) {
170
+ application(id: $id) {
171
+ id
172
+ name
173
+ description
174
+ email
175
+ url
176
+ icon
177
+ redirectUrl
178
+ authUrl
179
+ accessTokenUrl
180
+ webhook
181
+ availableScopes
182
+ appKey
183
+ appSecret
184
+ type
185
+ }
186
+ }
187
+ `,
188
+ variables: {
189
+ id: this.lifecycle.resourceId
190
+ }
191
+ });
192
+ this.application = response.data.application;
193
+ }
194
+ async updateApplication(e) {
195
+ e.preventDefault();
196
+ const form = this.renderRoot.querySelector('form');
197
+ const formData = new FormData(form);
198
+ const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => {
199
+ patch[key] = value;
200
+ return patch;
201
+ }, {});
202
+ const id = this.lifecycle.resourceId;
203
+ const response = await client.mutate({
204
+ mutation: gql `
205
+ mutation ($id: String!, $patch: ApplicationPatch!) {
206
+ updateApplication(id: $id, patch: $patch) {
207
+ id
208
+ name
209
+ description
210
+ email
211
+ url
212
+ icon
213
+ redirectUrl
214
+ webhook
215
+ appKey
216
+ appSecret
217
+ type
218
+ }
219
+ }
220
+ `,
221
+ variables: {
222
+ id,
223
+ patch
224
+ }
225
+ });
226
+ if (response.errors) {
227
+ console.error('update fail');
228
+ }
229
+ else {
230
+ this.application = Object.assign(Object.assign({}, this.application), response.data.updateApplication);
231
+ console.log('update sucess');
232
+ }
233
+ }
234
+ async deleteApplication(e) {
235
+ e.preventDefault();
236
+ const id = this.lifecycle.resourceId;
237
+ const response = await client.mutate({
238
+ mutation: gql `
239
+ mutation ($id: String!) {
240
+ deleteApplication(id: $id)
241
+ }
242
+ `,
243
+ variables: {
244
+ id
245
+ }
246
+ });
247
+ const result = response.data.deleteApplication;
248
+ if (result) {
249
+ console.log('delete sucess');
250
+ navigate('applications');
251
+ }
252
+ else {
253
+ console.error('delete fail');
254
+ }
255
+ }
256
+ };
257
+ AuthProvider.styles = [
258
+ css `
259
+ :host {
260
+ display: flex;
261
+ flex-direction: column;
262
+ overflow-y: auto;
263
+ position: relative;
264
+ background-color: var(--main-section-background-color);
265
+ padding: var(--padding-wide);
266
+ }
267
+ h2 {
268
+ margin: var(--title-margin);
269
+ font: var(--title-font);
270
+ color: var(--title-text-color);
271
+ }
272
+ [page-description] {
273
+ margin: var(--page-description-margin);
274
+ font: var(--page-description-font);
275
+ color: var(--page-description-color);
276
+ }
277
+ [icon] {
278
+ position: absolute;
279
+ top: 10px;
280
+ right: 10px;
281
+ max-width: 80px;
282
+ }
283
+ [icon] img {
284
+ max-width: 100%;
285
+ max-height: 100%;
286
+ }
287
+ label {
288
+ font: var(--label-font);
289
+ color: var(--label-color);
290
+ text-transform: var(--label-text-transform);
291
+ }
292
+ input,
293
+ select {
294
+ border: var(--border-dark-color);
295
+ border-radius: var(--border-radius);
296
+ margin: var(--input-margin);
297
+ padding: var(--input-padding);
298
+ font: var(--input-font);
299
+ flex: 1;
300
+ }
301
+ select:focus,
302
+ input:focus,
303
+ button {
304
+ outline: none;
305
+ }
306
+ form {
307
+ max-width: var(--content-container-max-width);
308
+ }
309
+ [fieldset-container] {
310
+ background-color: var(--theme-white-color);
311
+ margin: var(--margin-wide) 0 var(--margin-default) 0;
312
+ padding: var(--padding-default);
313
+ border-radius: var(--border-radius);
314
+ box-shadow: var(--box-shadow);
315
+ }
316
+ [fieldset-container] fieldset {
317
+ margin: 0;
318
+ margin-top: -15px;
319
+ }
320
+ fieldset {
321
+ border-radius: var(--border-radius);
322
+ border: var(--border-dark-color);
323
+ margin: var(--fieldset-margin);
324
+ padding: var(--fieldset-padding);
325
+ }
326
+ legend {
327
+ padding: var(--legend-padding);
328
+ font-weight: bold;
329
+ color: var(--legend-color);
330
+ }
331
+ [field-2column] {
332
+ display: grid;
333
+ grid-template-columns: 1fr 1fr;
334
+ grid-gap: 15px;
335
+ }
336
+ [field] {
337
+ display: flex;
338
+ flex-direction: column;
339
+ position: relative;
340
+ }
341
+ [grid-span] {
342
+ grid-column: span 2;
343
+ }
344
+ [button-in-field] {
345
+ position: absolute;
346
+ top: 24px;
347
+ right: 4px;
348
+ }
349
+ [input-hint] {
350
+ font: var(--input-hint-font);
351
+ color: var(--input-hint-color);
352
+ }
353
+ [danger] {
354
+ --mdc-theme-primary: var(--mdc-danger-button-primary-color);
355
+ }
356
+ .button-container {
357
+ margin-top: var(--margin-wide);
358
+ text-align: right;
359
+ }
360
+ .button-container mwc-button {
361
+ margin-left: var(--margin-narrow);
362
+ }
363
+ @media screen and (max-width: 480px) {
364
+ [field] {
365
+ grid-column: span 2;
366
+ }
367
+ }
368
+ `
369
+ ];
370
+ __decorate([
371
+ property({ type: Object }),
372
+ __metadata("design:type", Object)
373
+ ], AuthProvider.prototype, "application", void 0);
374
+ __decorate([
375
+ queryAll('[clipboard-copy]'),
376
+ __metadata("design:type", Object)
377
+ ], AuthProvider.prototype, "copybuttons", void 0);
378
+ AuthProvider = __decorate([
379
+ customElement('auth-provider')
380
+ ], AuthProvider);
381
+ //# sourceMappingURL=auth-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-provider.js","sourceRoot":"","sources":["../../../client/pages/auth-provider/auth-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import Clipboard from 'clipboard'\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, property, queryAll } from 'lit/decorators.js'\nimport { connect } from 'pwa-helpers/connect-mixin.js'\n\nimport { APPLICATION_TYPES } from '../../constants/application'\n\nimport { client } from '@operato/graphql'\nimport { navigate, PageView, store } from '@operato/shell'\n\n@customElement('auth-provider')\nclass AuthProvider extends connect(store)(PageView) {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n position: relative;\n background-color: var(--main-section-background-color);\n padding: var(--padding-wide);\n }\n h2 {\n margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n }\n [page-description] {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n }\n [icon] {\n position: absolute;\n top: 10px;\n right: 10px;\n max-width: 80px;\n }\n [icon] img {\n max-width: 100%;\n max-height: 100%;\n }\n label {\n font: var(--label-font);\n color: var(--label-color);\n text-transform: var(--label-text-transform);\n }\n input,\n select {\n border: var(--border-dark-color);\n border-radius: var(--border-radius);\n margin: var(--input-margin);\n padding: var(--input-padding);\n font: var(--input-font);\n flex: 1;\n }\n select:focus,\n input:focus,\n button {\n outline: none;\n }\n form {\n max-width: var(--content-container-max-width);\n }\n [fieldset-container] {\n background-color: var(--theme-white-color);\n margin: var(--margin-wide) 0 var(--margin-default) 0;\n padding: var(--padding-default);\n border-radius: var(--border-radius);\n box-shadow: var(--box-shadow);\n }\n [fieldset-container] fieldset {\n margin: 0;\n margin-top: -15px;\n }\n fieldset {\n border-radius: var(--border-radius);\n border: var(--border-dark-color);\n margin: var(--fieldset-margin);\n padding: var(--fieldset-padding);\n }\n legend {\n padding: var(--legend-padding);\n font-weight: bold;\n color: var(--legend-color);\n }\n [field-2column] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n grid-gap: 15px;\n }\n [field] {\n display: flex;\n flex-direction: column;\n position: relative;\n }\n [grid-span] {\n grid-column: span 2;\n }\n [button-in-field] {\n position: absolute;\n top: 24px;\n right: 4px;\n }\n [input-hint] {\n font: var(--input-hint-font);\n color: var(--input-hint-color);\n }\n [danger] {\n --mdc-theme-primary: var(--mdc-danger-button-primary-color);\n }\n .button-container {\n margin-top: var(--margin-wide);\n text-align: right;\n }\n .button-container mwc-button {\n margin-left: var(--margin-narrow);\n }\n @media screen and (max-width: 480px) {\n [field] {\n grid-column: span 2;\n }\n }\n `\n ]\n\n @property({ type: Object }) application: any\n @queryAll('[clipboard-copy]') copybuttons\n private clipboard?: Clipboard\n\n get context() {\n return {\n title: {\n icon: 'apps',\n text: this.application.name\n }\n }\n }\n\n render() {\n var app = this.application || {}\n\n return html`\n <div>\n <h2><mwc-icon>apps</mwc-icon>&nbsp;${app.name}</h2>\n <p page-description>${app.description}</p>\n </div>\n\n <div icon>\n <img src=${app.icon} />\n </div>\n\n <form>\n <div fieldset-container>\n <fieldset>\n <legend>application</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"name\">app name</label>\n <input id=\"name\" type=\"text\" name=\"name\" .value=${app.name} />\n </div>\n\n <div field grid-span>\n <label for=\"description\">description</label>\n <input id=\"description\" type=\"text\" name=\"description\" .value=${app.description} />\n </div>\n\n <div field grid-span>\n <label for=\"email\">contact email</label>\n <input id=\"email\" type=\"text\" name=\"email\" .value=${app.email} />\n </div>\n\n <div field grid-span>\n <label for=\"type-selector\">type</label>\n <select id=\"type-selector\" name=\"type\">\n ${APPLICATION_TYPES.map(\n type =>\n html`<option value=\"${app.type}\" ?selected=\"${type === app.type ? true : false}\">${type}</option>`\n )}\n </select>\n </div>\n\n <div field grid-span>\n <label for=\"url\">application URL</label>\n <input id=\"url\" type=\"text\" name=\"url\" .value=${app.url} />\n </div>\n\n <div field grid-span>\n <label for=\"icon\">icon</label>\n <input id=\"icon\" type=\"text\" name=\"icon\" .value=${app.icon} />\n </div>\n\n <div field grid-span>\n <label for=\"redirect-url\">redirect URL</label>\n <input id=\"redirect-url\" type=\"text\" name=\"redirectUrl\" .value=${app.redirectUrl} />\n </div>\n\n <div field grid-span>\n <label for=\"webhook\">webhook</label>\n <input id=\"webhook\" type=\"text\" name=\"webhook\" .value=${app.webhook} />\n </div>\n\n <div field grid-span>\n <label for=\"available-scopes\">available-scopes</label>\n <input id=\"available-scopes\" type=\"text\" .value=${app.availableScopes} readonly />\n </div>\n\n <div field grid-span>\n <label for=\"auth-url\">auth URL</label>\n <input id=\"auth-url\" type=\"text\" .value=${app.authUrl} readonly />\n <mwc-button\n dense\n unelevated\n button-in-field\n clipboard-copy\n @click=${e => e.preventDefault()}\n label=\"copy\"\n ></mwc-button>\n The endpoint for authorization server. This is used to get the authorization code.\n </div>\n\n <div field grid-span>\n <label for=\"access-token-url\">access token URL</label>\n <input id=\"access-token-url\" type=\"text\" .value=${app.accessTokenUrl} readonly />\n <mwc-button\n dense\n unelevated\n button-in-field\n clipboard-copy\n @click=${e => e.preventDefault()}\n label=\"copy\"\n ></mwc-button>\n The endpoint for authentication server. This is used to exchange the authorization code for an access\n token.\n </div>\n </div>\n </fieldset>\n </div>\n\n <div fieldset-container>\n <fieldset>\n <legend>credentials</legend>\n <div field-2column>\n <div field grid-span>\n <label for=\"app-key\">appKey</label>\n <input id=\"app-key\" type=\"text\" .value=${app.appKey} readonly />\n <mwc-button\n dense\n unelevated\n button-in-field\n clipboard-copy\n @click=${e => e.preventDefault()}\n label=\"copy\"\n ></mwc-button>\n </div>\n\n <div field grid-span>\n <label for=\"app-secret\">appSecret</label>\n <input id=\"app-secret\" type=\"text\" .value=${app.appSecret} readonly />\n <mwc-button\n dense\n unelevated\n button-in-field\n clipboard-copy\n @click=${e => e.preventDefault()}\n label=\"copy\"\n ></mwc-button>\n </div>\n </div>\n </fieldset>\n </div>\n\n <div class=\"button-container\">\n <mwc-button raised danger label=\"delete this app\" @click=${this.deleteApplication.bind(this)}></mwc-button>\n <mwc-button raised label=\"update\" @click=${this.updateApplication.bind(this)}></mwc-button>\n <mwc-button outlined label=\"generate new secret\"></mwc-button>\n </div>\n </form>\n `\n }\n\n firstUpdated() {\n this.clipboard = new Clipboard(this.copybuttons, {\n target: (trigger => trigger.parentElement.querySelector('input')) as any\n })\n }\n\n async pageUpdated(changes, lifecycle, before) {\n if (this.active) {\n await this.fetchApplication()\n }\n }\n\n async fetchApplication() {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n application(id: $id) {\n id\n name\n description\n email\n url\n icon\n redirectUrl\n authUrl\n accessTokenUrl\n webhook\n availableScopes\n appKey\n appSecret\n type\n }\n }\n `,\n variables: {\n id: this.lifecycle.resourceId\n }\n })\n\n this.application = response.data.application\n }\n\n async updateApplication(e) {\n e.preventDefault()\n\n const form = this.renderRoot.querySelector('form') as HTMLFormElement\n const formData = new FormData(form)\n\n const patch = Array.from(formData.entries()).reduce((patch, [key, value]) => {\n patch[key] = value\n return patch\n }, {})\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!, $patch: ApplicationPatch!) {\n updateApplication(id: $id, patch: $patch) {\n id\n name\n description\n email\n url\n icon\n redirectUrl\n webhook\n appKey\n appSecret\n type\n }\n }\n `,\n variables: {\n id,\n patch\n }\n })\n\n if (response.errors) {\n console.error('update fail')\n } else {\n this.application = { ...this.application, ...response.data.updateApplication }\n console.log('update sucess')\n }\n }\n\n async deleteApplication(e) {\n e.preventDefault()\n\n const id = this.lifecycle.resourceId\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($id: String!) {\n deleteApplication(id: $id)\n }\n `,\n variables: {\n id\n }\n })\n\n const result = response.data.deleteApplication\n if (result) {\n console.log('delete sucess')\n navigate('applications')\n } else {\n console.error('delete fail')\n }\n }\n}\n"]}
@@ -45,6 +45,9 @@ export default function route(page) {
45
45
  case 'attributes':
46
46
  import('./pages/attribute/attribute-set-management.js');
47
47
  return page;
48
+ case 'auth-providers':
49
+ import('./pages/auth-provider/auth-provider-management.js');
50
+ return page;
48
51
  }
49
52
  }
50
53
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI;IAChC,QAAQ,IAAI,EAAE;QACZ,KAAK,SAAS;YACZ,MAAM;YACJ,2BAA2B;YAC3B,iCAAiC;YACjC,oBAAoB,CACrB,CAAA;YACD,OAAO,IAAI,CAAA;QAEb,KAAK,oBAAoB;YACvB,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,sBAAsB;YACzB,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,wBAAwB,CAAC,CAAA;YAChC,OAAO,IAAI,CAAA;QAEb,KAAK,WAAW;YACd,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,UAAU;YACb,MAAM,CAAC,oCAAoC,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QAEb,KAAK,SAAS;YACZ,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,YAAY;YACf,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;KACd;AACH,CAAC","sourcesContent":["export default function route(page) {\n switch (page) {\n case 'profile':\n import(\n /* webpackPrefetch: true */\n /* webpackChunkName: \"profile\" */\n './pages/profile.js'\n )\n return page\n\n case 'appliance-register':\n import('./pages/appliance/register')\n return page\n\n case 'application':\n import('./pages/application/application')\n return page\n\n case 'applications':\n import('./pages/application/applications')\n return page\n\n case 'application-register':\n import('./pages/application/register')\n return page\n\n case 'app-bindings':\n import('./pages/app-binding/app-bindings')\n return page\n\n case 'app-binding':\n import('./pages/app-binding/app-binding')\n return page\n\n case 'appliance-home':\n import('./pages/appliance/home')\n return page\n\n case 'appliance':\n import('./pages/appliance/appliance')\n return page\n\n case 'roles':\n import('./pages/role/role-management')\n return page\n\n case 'users':\n import('./pages/user/user-management')\n return page\n\n case 'partners':\n import('./pages/partner/partner-management')\n return page\n\n case 'domains':\n import('./pages/domain/domain-management')\n return page\n\n case 'attributes':\n import('./pages/attribute/attribute-set-management.js')\n return page\n }\n}\n"]}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAI;IAChC,QAAQ,IAAI,EAAE;QACZ,KAAK,SAAS;YACZ,MAAM;YACJ,2BAA2B;YAC3B,iCAAiC;YACjC,oBAAoB,CACrB,CAAA;YACD,OAAO,IAAI,CAAA;QAEb,KAAK,oBAAoB;YACvB,MAAM,CAAC,4BAA4B,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,sBAAsB;YACzB,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,cAAc;YACjB,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,aAAa;YAChB,MAAM,CAAC,iCAAiC,CAAC,CAAA;YACzC,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,wBAAwB,CAAC,CAAA;YAChC,OAAO,IAAI,CAAA;QAEb,KAAK,WAAW;YACd,MAAM,CAAC,6BAA6B,CAAC,CAAA;YACrC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,OAAO;YACV,MAAM,CAAC,8BAA8B,CAAC,CAAA;YACtC,OAAO,IAAI,CAAA;QAEb,KAAK,UAAU;YACb,MAAM,CAAC,oCAAoC,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QAEb,KAAK,SAAS;YACZ,MAAM,CAAC,kCAAkC,CAAC,CAAA;YAC1C,OAAO,IAAI,CAAA;QAEb,KAAK,YAAY;YACf,MAAM,CAAC,+CAA+C,CAAC,CAAA;YACvD,OAAO,IAAI,CAAA;QAEb,KAAK,gBAAgB;YACnB,MAAM,CAAC,mDAAmD,CAAC,CAAA;YAC3D,OAAO,IAAI,CAAA;KACd;AACH,CAAC","sourcesContent":["export default function route(page) {\n switch (page) {\n case 'profile':\n import(\n /* webpackPrefetch: true */\n /* webpackChunkName: \"profile\" */\n './pages/profile.js'\n )\n return page\n\n case 'appliance-register':\n import('./pages/appliance/register')\n return page\n\n case 'application':\n import('./pages/application/application')\n return page\n\n case 'applications':\n import('./pages/application/applications')\n return page\n\n case 'application-register':\n import('./pages/application/register')\n return page\n\n case 'app-bindings':\n import('./pages/app-binding/app-bindings')\n return page\n\n case 'app-binding':\n import('./pages/app-binding/app-binding')\n return page\n\n case 'appliance-home':\n import('./pages/appliance/home')\n return page\n\n case 'appliance':\n import('./pages/appliance/appliance')\n return page\n\n case 'roles':\n import('./pages/role/role-management')\n return page\n\n case 'users':\n import('./pages/user/user-management')\n return page\n\n case 'partners':\n import('./pages/partner/partner-management')\n return page\n\n case 'domains':\n import('./pages/domain/domain-management')\n return page\n\n case 'attributes':\n import('./pages/attribute/attribute-set-management.js')\n return page\n\n case 'auth-providers':\n import('./pages/auth-provider/auth-provider-management.js')\n return page\n }\n}\n"]}