@aerogel/core 0.0.0-next.a68f133e2c9a1ae9ba84b4e2e42df909289e5fba → 0.0.0-next.abea39863ad0f7c484b8b1f365870e43e9bdd0ba

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 (210) hide show
  1. package/dist/aerogel-core.css +1 -0
  2. package/dist/aerogel-core.d.ts +2197 -1605
  3. package/dist/aerogel-core.js +3575 -0
  4. package/dist/aerogel-core.js.map +1 -0
  5. package/package.json +32 -37
  6. package/src/bootstrap/bootstrap.test.ts +4 -8
  7. package/src/bootstrap/index.ts +26 -16
  8. package/src/bootstrap/options.ts +1 -1
  9. package/src/components/AppLayout.vue +14 -0
  10. package/src/components/{AGAppModals.vue → AppModals.vue} +3 -4
  11. package/src/components/AppOverlays.vue +9 -0
  12. package/src/components/AppToasts.vue +16 -0
  13. package/src/components/contracts/AlertModal.ts +19 -0
  14. package/src/components/contracts/Button.ts +16 -0
  15. package/src/components/contracts/ConfirmModal.ts +48 -0
  16. package/src/components/contracts/DropdownMenu.ts +25 -0
  17. package/src/components/contracts/ErrorReportModal.ts +33 -0
  18. package/src/components/contracts/Input.ts +26 -0
  19. package/src/components/contracts/LoadingModal.ts +26 -0
  20. package/src/components/contracts/Modal.ts +21 -0
  21. package/src/components/contracts/PromptModal.ts +34 -0
  22. package/src/components/contracts/Select.ts +45 -0
  23. package/src/components/contracts/Toast.ts +15 -0
  24. package/src/components/contracts/index.ts +11 -0
  25. package/src/components/headless/HeadlessButton.vue +51 -0
  26. package/src/components/headless/HeadlessInput.vue +59 -0
  27. package/src/components/headless/HeadlessInputDescription.vue +27 -0
  28. package/src/components/headless/{forms/AGHeadlessInputError.vue → HeadlessInputError.vue} +4 -8
  29. package/src/components/headless/HeadlessInputInput.vue +75 -0
  30. package/src/components/headless/{forms/AGHeadlessInputLabel.vue → HeadlessInputLabel.vue} +3 -7
  31. package/src/components/headless/HeadlessInputTextArea.vue +40 -0
  32. package/src/components/headless/HeadlessModal.vue +57 -0
  33. package/src/components/headless/HeadlessModalContent.vue +30 -0
  34. package/src/components/headless/HeadlessModalDescription.vue +12 -0
  35. package/src/components/headless/HeadlessModalOverlay.vue +12 -0
  36. package/src/components/headless/HeadlessModalTitle.vue +12 -0
  37. package/src/components/headless/HeadlessSelect.vue +120 -0
  38. package/src/components/headless/{forms/AGHeadlessSelectError.vue → HeadlessSelectError.vue} +5 -6
  39. package/src/components/headless/HeadlessSelectLabel.vue +25 -0
  40. package/src/components/headless/HeadlessSelectOption.vue +34 -0
  41. package/src/components/headless/HeadlessSelectOptions.vue +42 -0
  42. package/src/components/headless/HeadlessSelectTrigger.vue +22 -0
  43. package/src/components/headless/HeadlessSelectValue.vue +18 -0
  44. package/src/components/headless/HeadlessSwitch.vue +96 -0
  45. package/src/components/headless/HeadlessToast.vue +18 -0
  46. package/src/components/headless/HeadlessToastAction.vue +13 -0
  47. package/src/components/headless/index.ts +20 -3
  48. package/src/components/index.ts +6 -9
  49. package/src/components/ui/AdvancedOptions.vue +18 -0
  50. package/src/components/ui/AlertModal.vue +17 -0
  51. package/src/components/ui/Button.vue +115 -0
  52. package/src/components/ui/Checkbox.vue +56 -0
  53. package/src/components/ui/ConfirmModal.vue +50 -0
  54. package/src/components/ui/DropdownMenu.vue +32 -0
  55. package/src/components/ui/DropdownMenuOption.vue +22 -0
  56. package/src/components/ui/DropdownMenuOptions.vue +44 -0
  57. package/src/components/ui/EditableContent.vue +82 -0
  58. package/src/components/ui/ErrorLogs.vue +19 -0
  59. package/src/components/ui/ErrorLogsModal.vue +48 -0
  60. package/src/components/ui/ErrorMessage.vue +15 -0
  61. package/src/components/ui/ErrorReportModal.vue +73 -0
  62. package/src/components/{modals/AGErrorReportModalButtons.vue → ui/ErrorReportModalButtons.vue} +34 -27
  63. package/src/components/ui/ErrorReportModalTitle.vue +24 -0
  64. package/src/components/ui/Form.vue +24 -0
  65. package/src/components/ui/Input.vue +56 -0
  66. package/src/components/ui/Link.vue +12 -0
  67. package/src/components/ui/LoadingModal.vue +34 -0
  68. package/src/components/ui/Markdown.vue +97 -0
  69. package/src/components/ui/Modal.vue +131 -0
  70. package/src/components/ui/ModalContext.vue +31 -0
  71. package/src/components/ui/ProgressBar.vue +51 -0
  72. package/src/components/ui/PromptModal.vue +38 -0
  73. package/src/components/ui/Select.vue +27 -0
  74. package/src/components/ui/SelectLabel.vue +21 -0
  75. package/src/components/ui/SelectOption.vue +29 -0
  76. package/src/components/ui/SelectOptions.vue +35 -0
  77. package/src/components/ui/SelectTrigger.vue +29 -0
  78. package/src/components/ui/SettingsModal.vue +15 -0
  79. package/src/components/{lib/AGStartupCrash.vue → ui/StartupCrash.vue} +8 -8
  80. package/src/components/ui/Switch.vue +11 -0
  81. package/src/components/ui/Toast.vue +46 -0
  82. package/src/components/ui/index.ts +33 -0
  83. package/src/directives/index.ts +11 -5
  84. package/src/directives/measure.ts +41 -7
  85. package/src/errors/Errors.state.ts +1 -1
  86. package/src/errors/Errors.ts +36 -41
  87. package/src/errors/JobCancelledError.ts +3 -0
  88. package/src/errors/index.ts +16 -8
  89. package/src/errors/settings/Debug.vue +39 -0
  90. package/src/errors/settings/index.ts +10 -0
  91. package/src/errors/utils.ts +35 -0
  92. package/src/forms/FormController.test.ts +110 -0
  93. package/src/forms/FormController.ts +246 -0
  94. package/src/forms/index.ts +3 -2
  95. package/src/forms/utils.ts +51 -20
  96. package/src/forms/validation.ts +19 -0
  97. package/src/index.css +73 -0
  98. package/src/{main.ts → index.ts} +3 -0
  99. package/src/jobs/Job.ts +147 -0
  100. package/src/jobs/index.ts +10 -0
  101. package/src/jobs/listeners.ts +3 -0
  102. package/src/jobs/status.ts +4 -0
  103. package/src/lang/DefaultLangProvider.ts +46 -0
  104. package/src/lang/Lang.state.ts +11 -0
  105. package/src/lang/Lang.ts +43 -28
  106. package/src/lang/index.ts +12 -6
  107. package/src/lang/settings/Language.vue +48 -0
  108. package/src/lang/settings/index.ts +10 -0
  109. package/src/plugins/Plugin.ts +1 -1
  110. package/src/plugins/index.ts +10 -7
  111. package/src/services/App.state.ts +36 -3
  112. package/src/services/App.ts +19 -3
  113. package/src/services/Cache.ts +43 -0
  114. package/src/services/Events.test.ts +39 -0
  115. package/src/services/Events.ts +109 -35
  116. package/src/services/Service.ts +129 -54
  117. package/src/services/Storage.ts +20 -0
  118. package/src/services/index.ts +18 -7
  119. package/src/services/utils.ts +18 -0
  120. package/src/testing/index.ts +30 -0
  121. package/src/testing/setup.ts +11 -0
  122. package/src/ui/UI.state.ts +14 -12
  123. package/src/ui/UI.ts +252 -120
  124. package/src/ui/index.ts +28 -28
  125. package/src/ui/utils.ts +16 -0
  126. package/src/utils/classes.ts +41 -0
  127. package/src/utils/composition/events.ts +4 -6
  128. package/src/utils/composition/forms.ts +20 -4
  129. package/src/utils/composition/persistent.test.ts +33 -0
  130. package/src/utils/composition/persistent.ts +11 -0
  131. package/src/utils/composition/state.test.ts +47 -0
  132. package/src/utils/composition/state.ts +33 -0
  133. package/src/utils/index.ts +5 -1
  134. package/src/utils/markdown.test.ts +50 -0
  135. package/src/utils/markdown.ts +53 -6
  136. package/src/utils/types.ts +3 -0
  137. package/src/utils/vue.ts +38 -132
  138. package/dist/aerogel-core.cjs.js +0 -2
  139. package/dist/aerogel-core.cjs.js.map +0 -1
  140. package/dist/aerogel-core.esm.js +0 -2
  141. package/dist/aerogel-core.esm.js.map +0 -1
  142. package/histoire.config.ts +0 -7
  143. package/noeldemartin.config.js +0 -5
  144. package/postcss.config.js +0 -6
  145. package/src/assets/histoire.css +0 -3
  146. package/src/components/AGAppLayout.vue +0 -16
  147. package/src/components/AGAppOverlays.vue +0 -41
  148. package/src/components/AGAppSnackbars.vue +0 -13
  149. package/src/components/constants.ts +0 -8
  150. package/src/components/forms/AGButton.vue +0 -44
  151. package/src/components/forms/AGCheckbox.vue +0 -41
  152. package/src/components/forms/AGForm.vue +0 -26
  153. package/src/components/forms/AGInput.vue +0 -38
  154. package/src/components/forms/AGSelect.story.vue +0 -46
  155. package/src/components/forms/AGSelect.vue +0 -60
  156. package/src/components/forms/index.ts +0 -5
  157. package/src/components/headless/forms/AGHeadlessButton.vue +0 -51
  158. package/src/components/headless/forms/AGHeadlessInput.ts +0 -28
  159. package/src/components/headless/forms/AGHeadlessInput.vue +0 -57
  160. package/src/components/headless/forms/AGHeadlessInputInput.vue +0 -45
  161. package/src/components/headless/forms/AGHeadlessSelect.ts +0 -42
  162. package/src/components/headless/forms/AGHeadlessSelect.vue +0 -77
  163. package/src/components/headless/forms/AGHeadlessSelectButton.vue +0 -24
  164. package/src/components/headless/forms/AGHeadlessSelectLabel.vue +0 -24
  165. package/src/components/headless/forms/AGHeadlessSelectOption.ts +0 -4
  166. package/src/components/headless/forms/AGHeadlessSelectOption.vue +0 -39
  167. package/src/components/headless/forms/AGHeadlessSelectOptions.ts +0 -3
  168. package/src/components/headless/forms/index.ts +0 -14
  169. package/src/components/headless/modals/AGHeadlessModal.ts +0 -34
  170. package/src/components/headless/modals/AGHeadlessModal.vue +0 -86
  171. package/src/components/headless/modals/AGHeadlessModalPanel.vue +0 -28
  172. package/src/components/headless/modals/AGHeadlessModalTitle.vue +0 -13
  173. package/src/components/headless/modals/index.ts +0 -4
  174. package/src/components/headless/snackbars/AGHeadlessSnackbar.vue +0 -10
  175. package/src/components/headless/snackbars/index.ts +0 -40
  176. package/src/components/lib/AGErrorMessage.vue +0 -16
  177. package/src/components/lib/AGLink.vue +0 -9
  178. package/src/components/lib/AGMarkdown.vue +0 -36
  179. package/src/components/lib/AGMeasured.vue +0 -15
  180. package/src/components/lib/index.ts +0 -5
  181. package/src/components/modals/AGAlertModal.ts +0 -15
  182. package/src/components/modals/AGAlertModal.vue +0 -14
  183. package/src/components/modals/AGConfirmModal.ts +0 -27
  184. package/src/components/modals/AGConfirmModal.vue +0 -26
  185. package/src/components/modals/AGErrorReportModal.ts +0 -46
  186. package/src/components/modals/AGErrorReportModal.vue +0 -54
  187. package/src/components/modals/AGErrorReportModalTitle.vue +0 -25
  188. package/src/components/modals/AGLoadingModal.ts +0 -23
  189. package/src/components/modals/AGLoadingModal.vue +0 -15
  190. package/src/components/modals/AGModal.ts +0 -10
  191. package/src/components/modals/AGModal.vue +0 -39
  192. package/src/components/modals/AGModalContext.ts +0 -8
  193. package/src/components/modals/AGModalContext.vue +0 -22
  194. package/src/components/modals/AGModalTitle.vue +0 -9
  195. package/src/components/modals/AGPromptModal.ts +0 -30
  196. package/src/components/modals/AGPromptModal.vue +0 -34
  197. package/src/components/modals/index.ts +0 -17
  198. package/src/components/snackbars/AGSnackbar.vue +0 -36
  199. package/src/components/snackbars/index.ts +0 -3
  200. package/src/components/utils.ts +0 -10
  201. package/src/directives/initial-focus.ts +0 -11
  202. package/src/forms/Form.test.ts +0 -58
  203. package/src/forms/Form.ts +0 -185
  204. package/src/forms/composition.ts +0 -6
  205. package/src/main.histoire.ts +0 -1
  206. package/src/utils/tailwindcss.test.ts +0 -26
  207. package/src/utils/tailwindcss.ts +0 -7
  208. package/tailwind.config.js +0 -4
  209. package/tsconfig.json +0 -11
  210. package/vite.config.ts +0 -14
@@ -1,29 +1,36 @@
1
- import type { App as VueApp } from 'vue';
1
+ import type { App as AppInstance } from 'vue';
2
2
 
3
- import { definePlugin } from '@/plugins';
3
+ import { definePlugin } from '@aerogel/core/plugins';
4
+ import { isDevelopment, isTesting } from '@noeldemartin/utils';
4
5
 
5
6
  import App from './App';
7
+ import Cache from './Cache';
6
8
  import Events from './Events';
7
9
  import Service from './Service';
10
+ import Storage from './Storage';
8
11
  import { getPiniaStore } from './store';
12
+ import type { AppSetting } from './App.state';
9
13
 
10
14
  export * from './App';
15
+ export * from './Cache';
11
16
  export * from './Events';
12
17
  export * from './Service';
13
18
  export * from './store';
19
+ export * from './utils';
14
20
 
15
- export { App, Events, Service };
21
+ export { App, Cache, Events, Storage, Service };
16
22
 
17
23
  const defaultServices = {
18
24
  $app: App,
19
25
  $events: Events,
26
+ $storage: Storage,
20
27
  };
21
28
 
22
29
  export type DefaultServices = typeof defaultServices;
23
30
 
24
31
  export interface Services extends DefaultServices {}
25
32
 
26
- export async function bootServices(app: VueApp, services: Record<string, Service>): Promise<void> {
33
+ export async function bootServices(app: AppInstance, services: Record<string, Service>): Promise<void> {
27
34
  await Promise.all(
28
35
  Object.entries(services).map(async ([name, service]) => {
29
36
  await service
@@ -34,7 +41,9 @@ export async function bootServices(app: VueApp, services: Record<string, Service
34
41
 
35
42
  Object.assign(app.config.globalProperties, services);
36
43
 
37
- App.development && Object.assign(window, services);
44
+ if (isDevelopment() || isTesting()) {
45
+ Object.assign(globalThis, services);
46
+ }
38
47
  }
39
48
 
40
49
  export default definePlugin({
@@ -45,17 +54,19 @@ export default definePlugin({
45
54
  };
46
55
 
47
56
  app.use(getPiniaStore());
57
+ options.settings?.forEach((setting) => App.addSetting(setting));
48
58
 
49
59
  await bootServices(app, services);
50
60
  },
51
61
  });
52
62
 
53
- declare module '@/bootstrap/options' {
63
+ declare module '@aerogel/core/bootstrap/options' {
54
64
  export interface AerogelOptions {
55
65
  services?: Record<string, Service>;
66
+ settings?: AppSetting[];
56
67
  }
57
68
  }
58
69
 
59
- declare module '@vue/runtime-core' {
70
+ declare module 'vue' {
60
71
  interface ComponentCustomProperties extends Services {}
61
72
  }
@@ -0,0 +1,18 @@
1
+ import { objectOnly } from '@noeldemartin/utils';
2
+
3
+ export type Replace<
4
+ TOriginal extends Record<string, unknown>,
5
+ TReplacements extends Partial<Record<keyof TOriginal, unknown>>,
6
+ > = {
7
+ [K in keyof TOriginal]: TReplacements extends Record<K, infer Replacement> ? Replacement : TOriginal[K];
8
+ };
9
+
10
+ export function replaceExisting<
11
+ TOriginal extends Record<string, unknown>,
12
+ TReplacements extends Partial<Record<keyof TOriginal, unknown>>,
13
+ >(original: TOriginal, replacements: TReplacements): Replace<TOriginal, TReplacements> {
14
+ return {
15
+ ...original,
16
+ ...objectOnly(replacements, Object.keys(original)),
17
+ } as Replace<TOriginal, TReplacements>;
18
+ }
@@ -0,0 +1,30 @@
1
+ import { isTesting } from '@noeldemartin/utils';
2
+ import type { GetClosureArgs } from '@noeldemartin/utils';
3
+
4
+ import Events from '@aerogel/core/services/Events';
5
+ import { App } from '@aerogel/core/services';
6
+ import { definePlugin } from '@aerogel/core/plugins';
7
+ import type { Services } from '@aerogel/core/services';
8
+
9
+ export interface AerogelTestingRuntime {
10
+ on: (typeof Events)['on'];
11
+ service<T extends keyof Services>(name: T): Services[T] | null;
12
+ }
13
+
14
+ export default definePlugin({
15
+ async install() {
16
+ if (!isTesting()) {
17
+ return;
18
+ }
19
+
20
+ globalThis.testingRuntime = {
21
+ on: ((...args: GetClosureArgs<(typeof Events)['on']>) => Events.on(...args)) as (typeof Events)['on'],
22
+ service: (name) => App.service(name),
23
+ };
24
+ },
25
+ });
26
+
27
+ declare global {
28
+ // eslint-disable-next-line no-var
29
+ var testingRuntime: AerogelTestingRuntime | undefined;
30
+ }
@@ -0,0 +1,11 @@
1
+ import { FakeLocalStorage } from '@noeldemartin/testing';
2
+ import { beforeEach, vi } from 'vitest';
3
+
4
+ vi.mock('dompurify', async () => {
5
+ return { default: { sanitize: (html: string) => html } };
6
+ });
7
+
8
+ beforeEach(() => {
9
+ FakeLocalStorage.reset();
10
+ FakeLocalStorage.patchGlobal();
11
+ });
@@ -1,23 +1,19 @@
1
1
  import type { Component } from 'vue';
2
2
 
3
- import { defineServiceState } from '@/services/Service';
3
+ import { defineServiceState } from '@aerogel/core/services/Service';
4
4
 
5
- export interface Modal<T = unknown> {
5
+ import { Layouts, getCurrentLayout } from './utils';
6
+
7
+ export interface UIModal<T = unknown> {
6
8
  id: string;
7
9
  properties: Record<string, unknown>;
8
10
  component: Component;
11
+ closing: boolean;
9
12
  beforeClose: Promise<T | undefined>;
10
13
  afterClose: Promise<T | undefined>;
11
14
  }
12
15
 
13
- export interface ModalComponent<
14
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
15
- Properties extends Record<string, unknown> = Record<string, unknown>,
16
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
17
- Result = unknown
18
- > {}
19
-
20
- export interface Snackbar {
16
+ export interface UIToast {
21
17
  id: string;
22
18
  component: Component;
23
19
  properties: Record<string, unknown>;
@@ -26,7 +22,13 @@ export interface Snackbar {
26
22
  export default defineServiceState({
27
23
  name: 'ui',
28
24
  initialState: {
29
- modals: [] as Modal[],
30
- snackbars: [] as Snackbar[],
25
+ modals: [] as UIModal[],
26
+ toasts: [] as UIToast[],
27
+ layout: getCurrentLayout(),
28
+ },
29
+ computed: {
30
+ desktop: ({ layout }) => layout === Layouts.Desktop,
31
+ mobile: ({ layout }) => layout === Layouts.Mobile,
32
+ openModals: ({ modals }) => modals.filter(({ closing }) => !closing),
31
33
  },
32
34
  });