@csntgao/uni-base 0.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 (90) hide show
  1. package/.prettierignore +4 -0
  2. package/.prettierrc.json +6 -0
  3. package/AGENTS.md +519 -0
  4. package/CLAUDE.md +512 -0
  5. package/README.md +734 -0
  6. package/docs//346/225/260/345/255/227/345/221/230/345/267/245/345/256/214/346/225/264/346/212/275/345/261/211/346/216/245/345/205/245/350/257/264/346/230/216.md +110 -0
  7. package/docs//347/273/204/347/273/207/345/221/230/345/267/245/345/215/225/351/200/211/347/273/204/344/273/266/346/216/245/345/205/245/350/257/264/346/230/216.md +79 -0
  8. package/docs//347/273/204/347/273/207/345/221/230/345/267/245/345/244/232/351/200/211/347/273/204/344/273/266/346/216/245/345/205/245/350/257/264/346/230/216.md +93 -0
  9. package/docs//350/264/246/346/210/267/344/270/216/347/231/273/345/275/225/347/273/204/344/273/266/345/212/250/346/200/201/346/216/245/345/205/245/350/257/264/346/230/216.md +201 -0
  10. package/eslint.config.js +30 -0
  11. package/examples/vanilla/index.html +33 -0
  12. package/examples/vanilla/main.js +247 -0
  13. package/examples/vanilla/package.json +15 -0
  14. package/examples/vanilla/public/runtime-config.js +10 -0
  15. package/examples/vanilla/style.css +99 -0
  16. package/package.json +31 -0
  17. package/packages/core/package.json +30 -0
  18. package/packages/core/src/client.ts +1132 -0
  19. package/packages/core/src/customer-support-client.ts +825 -0
  20. package/packages/core/src/customer-support-types.ts +123 -0
  21. package/packages/core/src/index.ts +79 -0
  22. package/packages/core/src/notification-center-client.ts +462 -0
  23. package/packages/core/src/notification-center-types.ts +154 -0
  24. package/packages/core/src/protocol.ts +237 -0
  25. package/packages/core/src/types.ts +170 -0
  26. package/packages/core/tests/client.test.ts +760 -0
  27. package/packages/core/tests/customer-support-client.test.ts +576 -0
  28. package/packages/core/tests/fake-websocket.ts +55 -0
  29. package/packages/core/tests/notification-center-client.test.ts +467 -0
  30. package/packages/core/tests/protocol.test.ts +124 -0
  31. package/packages/core/tsconfig.json +7 -0
  32. package/packages/core/tsup.config.ts +11 -0
  33. package/packages/web-components/package.json +35 -0
  34. package/packages/web-components/scripts/verify-runtime-build.mjs +111 -0
  35. package/packages/web-components/src/account-context.ts +1540 -0
  36. package/packages/web-components/src/application-switcher-transport.ts +243 -0
  37. package/packages/web-components/src/application-switcher.ts +1103 -0
  38. package/packages/web-components/src/chat.ts +1754 -0
  39. package/packages/web-components/src/customer-support-chat.ts +862 -0
  40. package/packages/web-components/src/customer-support-transport.ts +269 -0
  41. package/packages/web-components/src/index.ts +256 -0
  42. package/packages/web-components/src/notification-center.ts +1066 -0
  43. package/packages/web-components/src/notification-popover.ts +615 -0
  44. package/packages/web-components/src/organization-multi-employee-selector.ts +1564 -0
  45. package/packages/web-components/src/organization-onboarding-transport.ts +54 -0
  46. package/packages/web-components/src/organization-onboarding.ts +1216 -0
  47. package/packages/web-components/src/organization-selector.ts +534 -0
  48. package/packages/web-components/src/organization-single-employee-selector.ts +114 -0
  49. package/packages/web-components/src/prototype-icons.ts +242 -0
  50. package/packages/web-components/src/safe-image-url.ts +29 -0
  51. package/packages/web-components/src/safe-markdown.ts +192 -0
  52. package/packages/web-components/src/uniplat-base-account-context-transport.ts +625 -0
  53. package/packages/web-components/src/uniplat-base-application-switcher-transport.ts +418 -0
  54. package/packages/web-components/src/uniplat-base-application-ticket.ts +254 -0
  55. package/packages/web-components/src/uniplat-base-identity-ticket.ts +202 -0
  56. package/packages/web-components/src/uniplat-base-notification-center-transport.ts +378 -0
  57. package/packages/web-components/src/uniplat-base-organization-multi-employee-selector-transport.ts +394 -0
  58. package/packages/web-components/src/uniplat-base-organization-onboarding-transport.ts +183 -0
  59. package/packages/web-components/src/uniplat-base-organization-single-employee-selector-transport.ts +14 -0
  60. package/packages/web-components/src/user-login-transport.ts +563 -0
  61. package/packages/web-components/src/user-login.ts +2027 -0
  62. package/packages/web-components/src/user-menu.ts +880 -0
  63. package/packages/web-components/tests/account-context.test.ts +798 -0
  64. package/packages/web-components/tests/application-switcher.test.ts +562 -0
  65. package/packages/web-components/tests/chat.test.ts +1130 -0
  66. package/packages/web-components/tests/customer-support-chat.test.ts +428 -0
  67. package/packages/web-components/tests/customer-support-transport.test.ts +79 -0
  68. package/packages/web-components/tests/notification-center-transport.test.ts +271 -0
  69. package/packages/web-components/tests/notification-center.test.ts +429 -0
  70. package/packages/web-components/tests/notification-popover.test.ts +283 -0
  71. package/packages/web-components/tests/organization-multi-employee-selector-transport.test.ts +332 -0
  72. package/packages/web-components/tests/organization-multi-employee-selector.test.ts +225 -0
  73. package/packages/web-components/tests/organization-onboarding.test.ts +260 -0
  74. package/packages/web-components/tests/organization-selector.test.ts +127 -0
  75. package/packages/web-components/tests/organization-single-employee-selector.test.ts +145 -0
  76. package/packages/web-components/tests/uniplat-base-account-context-transport.test.ts +496 -0
  77. package/packages/web-components/tests/uniplat-base-application-switcher-transport.test.ts +598 -0
  78. package/packages/web-components/tests/uniplat-base-application-ticket.test.ts +233 -0
  79. package/packages/web-components/tests/uniplat-base-identity-ticket.test.ts +226 -0
  80. package/packages/web-components/tests/uniplat-base-organization-onboarding-transport.test.ts +227 -0
  81. package/packages/web-components/tests/user-login-transport.test.ts +443 -0
  82. package/packages/web-components/tests/user-login.test.ts +626 -0
  83. package/packages/web-components/tests/user-menu.test.ts +271 -0
  84. package/packages/web-components/tsconfig.json +8 -0
  85. package/packages/web-components/tsup.config.ts +12 -0
  86. package/packages/web-components/tsup.runtime.config.ts +37 -0
  87. package/pnpm-workspace.yaml +6 -0
  88. package/tsconfig.base.json +21 -0
  89. package/vitest.config.ts +20 -0
  90. package//344/272/244/346/216/245/346/226/207/346/241/243.md +254 -0
@@ -0,0 +1,111 @@
1
+ import { mkdir, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises'
2
+ import { URL } from 'node:url'
3
+ import { Window } from 'happy-dom'
4
+
5
+ const packageManifest = JSON.parse(
6
+ await readFile(new URL('../package.json', import.meta.url), 'utf8'),
7
+ )
8
+ const version = typeof packageManifest.version === 'string' ? packageManifest.version.trim() : ''
9
+
10
+ if (!/^[0-9A-Za-z][0-9A-Za-z._+-]{0,63}$/.test(version)) {
11
+ throw new TypeError('Web Components package version cannot be used as a runtime release version')
12
+ }
13
+
14
+ const runtimeDirectoryUrl = new URL('../../../dist/runtime/', import.meta.url)
15
+ const moduleUrl = new URL(`./releases/${version}/index.js`, runtimeDirectoryUrl)
16
+ const sourceMapUrl = new URL(`./releases/${version}/index.js.map`, runtimeDirectoryUrl)
17
+ const currentManifestUrl = new URL('./current.json', runtimeDirectoryUrl)
18
+ const temporaryManifestUrl = new URL(`./current.json.tmp-${Date.now()}`, runtimeDirectoryUrl)
19
+ const expectedManifest = {
20
+ schema_version: 1,
21
+ api_version: 1,
22
+ version,
23
+ format: 'esm-standalone',
24
+ module_url: `./releases/${version}/index.js`,
25
+ }
26
+
27
+ const requiredExports = [
28
+ 'createUniplatBaseApplicationSwitcherTransport',
29
+ 'createUniplatBaseNotificationCenterTransport',
30
+ 'createUniplatBaseOrganizationMultiEmployeeSelectorTransport',
31
+ 'createUniplatBaseOrganizationSingleEmployeeSelectorTransport',
32
+ 'createUniplatBaseOrganizationOnboardingTransport',
33
+ 'createUniplatBaseUserLoginTransport',
34
+ 'createHrSaasCustomerSupportTransport',
35
+ 'exchangeUniplatBaseApplicationTicket',
36
+ 'loginWithUniplatBaseIdentityTicket',
37
+ ]
38
+ const requiredTags = [
39
+ 'uniplat-account-context',
40
+ 'uniplat-ai-employee-chat',
41
+ 'uniplat-customer-support-chat',
42
+ 'uniplat-notification-center',
43
+ 'uniplat-notification-popover',
44
+ 'uniplat-organization-multi-employee-selector',
45
+ 'uniplat-organization-single-employee-selector',
46
+ 'uniplat-organization-selector',
47
+ 'uniplat-user-login',
48
+ 'uniplat-user-menu',
49
+ ]
50
+
51
+ const moduleSource = await readFile(moduleUrl, 'utf8')
52
+ const sourceMapStats = await stat(sourceMapUrl)
53
+
54
+ if (!moduleSource.trim() || sourceMapStats.size === 0) {
55
+ throw new Error('Runtime release module and source map must not be empty')
56
+ }
57
+
58
+ const runtimeImports = [
59
+ ...moduleSource.matchAll(/^\s*import\s+(?:[^'"\n]+?\s+from\s+)?['"]([^'"]+)['"]/gm),
60
+ ...moduleSource.matchAll(/^\s*export\s+[^'"\n]+?\s+from\s+['"]([^'"]+)['"]/gm),
61
+ ...moduleSource.matchAll(/\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g),
62
+ ].map((match) => match[1])
63
+
64
+ if (runtimeImports.length > 0) {
65
+ throw new Error(`Standalone runtime module contains imports: ${runtimeImports.join(', ')}`)
66
+ }
67
+
68
+ const browserWindow = new Window()
69
+
70
+ for (const key of Object.getOwnPropertyNames(browserWindow)) {
71
+ if (!(key in globalThis)) {
72
+ try {
73
+ globalThis[key] = browserWindow[key]
74
+ } catch {
75
+ // Some browser globals expose read-only accessors and are not needed by this bundle.
76
+ }
77
+ }
78
+ }
79
+
80
+ globalThis.window = browserWindow
81
+ globalThis.document = browserWindow.document
82
+ globalThis.customElements = browserWindow.customElements
83
+ globalThis.HTMLElement = browserWindow.HTMLElement
84
+
85
+ try {
86
+ const runtimeModule = await import(`${moduleUrl.href}?verification=${Date.now()}`)
87
+
88
+ for (const exportName of requiredExports) {
89
+ if (typeof runtimeModule[exportName] !== 'function') {
90
+ throw new Error(`Runtime module is missing required export: ${exportName}`)
91
+ }
92
+ }
93
+
94
+ for (const tagName of requiredTags) {
95
+ if (!browserWindow.customElements.get(tagName)) {
96
+ throw new Error(`Runtime module did not register required custom element: ${tagName}`)
97
+ }
98
+ }
99
+ } finally {
100
+ await browserWindow.close()
101
+ }
102
+
103
+ await mkdir(runtimeDirectoryUrl, { recursive: true })
104
+
105
+ try {
106
+ await writeFile(temporaryManifestUrl, `${JSON.stringify(expectedManifest, null, 2)}\n`, 'utf8')
107
+ await rename(temporaryManifestUrl, currentManifestUrl)
108
+ } catch (error) {
109
+ await unlink(temporaryManifestUrl).catch(() => undefined)
110
+ throw error
111
+ }