mod-arch-shared 1.15.3 → 1.16.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 (36) hide show
  1. package/dist/components/ResourceNameTooltip.d.ts +1 -1
  2. package/dist/components/ResourceNameTooltip.js +1 -1
  3. package/dist/components/design/utils.js +22 -22
  4. package/package.json +6 -6
  5. package/dist/__tests__/unit/FieldGroupHelpLabelIcon.test.d.ts +0 -2
  6. package/dist/__tests__/unit/FieldGroupHelpLabelIcon.test.d.ts.map +0 -1
  7. package/dist/__tests__/unit/FieldGroupHelpLabelIcon.test.js +0 -43
  8. package/dist/__tests__/unit/FieldGroupHelpLabelIcon.test.js.map +0 -1
  9. package/dist/__tests__/unit/jest.setup.d.ts +0 -3
  10. package/dist/__tests__/unit/jest.setup.d.ts.map +0 -1
  11. package/dist/__tests__/unit/jest.setup.js +0 -5
  12. package/dist/__tests__/unit/jest.setup.js.map +0 -1
  13. package/dist/config/transform.file.d.ts +0 -3
  14. package/dist/config/transform.file.d.ts.map +0 -1
  15. package/dist/config/transform.file.js +0 -4
  16. package/dist/config/transform.file.js.map +0 -1
  17. package/dist/config/transform.style.d.ts +0 -2
  18. package/dist/config/transform.style.d.ts.map +0 -1
  19. package/dist/config/transform.style.js +0 -4
  20. package/dist/config/transform.style.js.map +0 -1
  21. package/dist/jest.config.d.ts +0 -22
  22. package/dist/jest.config.d.ts.map +0 -1
  23. package/dist/jest.config.js +0 -43
  24. package/dist/jest.config.js.map +0 -1
  25. package/dist/utilities/__tests__/markdown.spec.d.ts +0 -2
  26. package/dist/utilities/__tests__/markdown.spec.d.ts.map +0 -1
  27. package/dist/utilities/__tests__/markdown.spec.js +0 -17
  28. package/dist/utilities/__tests__/markdown.spec.js.map +0 -1
  29. package/dist/utilities/__tests__/string.spec.d.ts +0 -2
  30. package/dist/utilities/__tests__/string.spec.d.ts.map +0 -1
  31. package/dist/utilities/__tests__/string.spec.js +0 -51
  32. package/dist/utilities/__tests__/string.spec.js.map +0 -1
  33. package/dist/utilities/__tests__/time.spec.d.ts +0 -2
  34. package/dist/utilities/__tests__/time.spec.d.ts.map +0 -1
  35. package/dist/utilities/__tests__/time.spec.js +0 -61
  36. package/dist/utilities/__tests__/time.spec.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { K8sResourceCommon } from '../types';
3
- import '~/components/NotebookController.scss';
3
+ import '../components/NotebookController.scss';
4
4
  type ResourceNameTooltipProps = {
5
5
  resource: K8sResourceCommon;
6
6
  children: React.ReactNode;
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { ClipboardCopy, DescriptionList, DescriptionListDescription, DescriptionListGroup, DescriptionListTerm, Flex, FlexItem, Popover, Stack, StackItem, } from '@patternfly/react-core';
3
3
  import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons';
4
- import '~/components/NotebookController.scss';
4
+ import '../components/NotebookController.scss';
5
5
  import DashboardPopupIconButton from '../components/dashboard/DashboardPopupIconButton';
6
6
  const ResourceNameTooltip = ({ children, resource, wrap = true, }) => (React.createElement("div", { style: { display: wrap ? 'block' : 'inline-flex' } },
7
7
  React.createElement(Flex, { gap: { default: 'gapXs' }, alignItems: { default: 'alignItemsCenter' } },
@@ -1,25 +1,25 @@
1
- import projectImg from '~/images/UI_icon-Folder-RGB.svg';
2
- import notebookImg from '~/images/UI_icon-Wrench-RGB.svg';
3
- import pipelineImg from '~/images/UI_icon-Branch-RGB.svg';
4
- import pipelineRunImg from '~/images/UI_icon-Double_arrow_right-RGB.svg';
5
- import clusterStorageImg from '~/images/UI_icon-Storage-RGB.svg';
6
- import modelServerImg from '~/images/UI_icon-Server-RGB.svg';
7
- import registeredModelsImg from '~/images/Icon-Layered_A_Black-RGB.svg';
8
- import deployedModelsImg from '~/images/UI_icon-Cubes-RGB.svg';
9
- import deployingModelsImg from '~/images/UI_icon-Server_upload-RGB.svg';
10
- import dataConnectionImg from '~/images/UI_icon-Connected-RGB.svg';
11
- import userImg from '~/images/UI_icon-User-RGB.svg';
12
- import groupImg from '~/images/UI_icon-Shared_workspace-RGB.svg';
13
- import projectEmptyStateImg from '~/images/empty-state-project-overview.svg';
14
- import notebookEmptyStateImg from '~/images/empty-state-notebooks.svg';
15
- import pipelineEmptyStateImg from '~/images/empty-state-pipelines.svg';
16
- import clusterStorageEmptyStateImg from '~/images/empty-state-cluster-storage.svg';
17
- import modelServerEmptyStateImg from '~/images/empty-state-model-serving.svg';
18
- import dataConnectionEmptyStateImg from '~/images/empty-state-data-connections.svg';
19
- import modelRegistryEmptyStateImg from '~/images/empty-state-model-registries.svg';
20
- import storageClassesEmptyStateImg from '~/images/empty-state-storage-classes.svg';
21
- import modelRegistryMissingModelImg from '~/images/no-models-model-registry.svg';
22
- import modelRegistryMissingVersionImg from '~/images/no-versions-model-registry.svg';
1
+ import projectImg from '../../images/UI_icon-Folder-RGB.svg';
2
+ import notebookImg from '../../images/UI_icon-Wrench-RGB.svg';
3
+ import pipelineImg from '../../images/UI_icon-Branch-RGB.svg';
4
+ import pipelineRunImg from '../../images/UI_icon-Double_arrow_right-RGB.svg';
5
+ import clusterStorageImg from '../../images/UI_icon-Storage-RGB.svg';
6
+ import modelServerImg from '../../images/UI_icon-Server-RGB.svg';
7
+ import registeredModelsImg from '../../images/Icon-Layered_A_Black-RGB.svg';
8
+ import deployedModelsImg from '../../images/UI_icon-Cubes-RGB.svg';
9
+ import deployingModelsImg from '../../images/UI_icon-Server_upload-RGB.svg';
10
+ import dataConnectionImg from '../../images/UI_icon-Connected-RGB.svg';
11
+ import userImg from '../../images/UI_icon-User-RGB.svg';
12
+ import groupImg from '../../images/UI_icon-Shared_workspace-RGB.svg';
13
+ import projectEmptyStateImg from '../../images/empty-state-project-overview.svg';
14
+ import notebookEmptyStateImg from '../../images/empty-state-notebooks.svg';
15
+ import pipelineEmptyStateImg from '../../images/empty-state-pipelines.svg';
16
+ import clusterStorageEmptyStateImg from '../../images/empty-state-cluster-storage.svg';
17
+ import modelServerEmptyStateImg from '../../images/empty-state-model-serving.svg';
18
+ import dataConnectionEmptyStateImg from '../../images/empty-state-data-connections.svg';
19
+ import modelRegistryEmptyStateImg from '../../images/empty-state-model-registries.svg';
20
+ import storageClassesEmptyStateImg from '../../images/empty-state-storage-classes.svg';
21
+ import modelRegistryMissingModelImg from '../../images/no-models-model-registry.svg';
22
+ import modelRegistryMissingVersionImg from '../../images/no-versions-model-registry.svg';
23
23
  import './vars.scss';
24
24
  /* eslint-disable @typescript-eslint/no-unnecessary-condition */
25
25
  // These conditions are required for future object types that may be added later.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mod-arch-shared",
3
- "version": "1.15.3",
3
+ "version": "1.16.0",
4
4
  "description": "Shared UI components and utilities for modular architecture micro-frontend projects",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -18,7 +18,7 @@
18
18
  "LICENSE"
19
19
  ],
20
20
  "scripts": {
21
- "build": "tsc && tsc-alias && npm run copy-assets",
21
+ "build": "rm -rf dist && tsc -p tsconfig.build.json && npm run copy-assets && tsc-alias -p tsconfig.build.json",
22
22
  "copy-assets": "mkdir -p dist/images && cp -r images/* dist/images/ && find components \\( -name '*.scss' -o -name '*.css' \\) -exec rsync -R {} dist/ \\;",
23
23
  "test": "run-s test:lint test:unit test:type-check",
24
24
  "test:jest": "jest --passWithNoTests",
@@ -50,8 +50,8 @@
50
50
  "access": "public"
51
51
  },
52
52
  "peerDependencies": {
53
- "mod-arch-core": ">=1.15.3",
54
- "mod-arch-kubeflow": ">=1.15.3",
53
+ "mod-arch-core": ">=1.16.0",
54
+ "mod-arch-kubeflow": ">=1.16.0",
55
55
  "react": ">=16.8.0",
56
56
  "react-dom": ">=16.8.0",
57
57
  "react-router-dom": ">=6.4.0"
@@ -86,8 +86,8 @@
86
86
  "ts-jest": "^29.2.6",
87
87
  "tsc-alias": "^1.8.15",
88
88
  "typescript": "^5.0.4",
89
- "mod-arch-core": "1.15.3",
90
- "mod-arch-kubeflow": "1.15.3"
89
+ "mod-arch-core": "1.16.0",
90
+ "mod-arch-kubeflow": "1.16.0"
91
91
  },
92
92
  "dependencies": {
93
93
  "@patternfly/patternfly": "^6.4.0",
@@ -1,2 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- //# sourceMappingURL=FieldGroupHelpLabelIcon.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FieldGroupHelpLabelIcon.test.d.ts","sourceRoot":"","sources":["../../../__tests__/unit/FieldGroupHelpLabelIcon.test.tsx"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,43 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- import * as React from 'react';
3
- import { render, screen, fireEvent } from '@testing-library/react';
4
- import FieldGroupHelpLabelIcon from '../../components/FieldGroupHelpLabelIcon';
5
- describe('FieldGroupHelpLabelIcon', () => {
6
- it('should render with content', () => {
7
- render(React.createElement(FieldGroupHelpLabelIcon, { content: "Test help content" }));
8
- const button = screen.getByRole('button', { name: 'More info' });
9
- expect(button).toBeInTheDocument();
10
- });
11
- it('should render with React element as content', () => {
12
- const content = (React.createElement("div", null,
13
- React.createElement("strong", null, "Help title"),
14
- React.createElement("p", null, "Help description")));
15
- render(React.createElement(FieldGroupHelpLabelIcon, { content: content }));
16
- const button = screen.getByRole('button', { name: 'More info' });
17
- expect(button).toBeInTheDocument();
18
- });
19
- it('should call onClick handler when provided', () => {
20
- const handleClick = jest.fn();
21
- render(React.createElement(FieldGroupHelpLabelIcon, { content: "Test help content", onClick: handleClick }));
22
- const button = screen.getByRole('button', { name: 'More info' });
23
- fireEvent.click(button);
24
- expect(handleClick).toHaveBeenCalledTimes(1);
25
- });
26
- it('should work without onClick handler (backward compatibility)', () => {
27
- render(React.createElement(FieldGroupHelpLabelIcon, { content: "Test help content" }));
28
- const button = screen.getByRole('button', { name: 'More info' });
29
- // Should not throw error when clicked without onClick handler
30
- fireEvent.click(button);
31
- expect(button).toBeInTheDocument();
32
- });
33
- it('should call onClick multiple times when clicked multiple times', () => {
34
- const handleClick = jest.fn();
35
- render(React.createElement(FieldGroupHelpLabelIcon, { content: "Test help content", onClick: handleClick }));
36
- const button = screen.getByRole('button', { name: 'More info' });
37
- fireEvent.click(button);
38
- fireEvent.click(button);
39
- fireEvent.click(button);
40
- expect(handleClick).toHaveBeenCalledTimes(3);
41
- });
42
- });
43
- //# sourceMappingURL=FieldGroupHelpLabelIcon.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FieldGroupHelpLabelIcon.test.js","sourceRoot":"","sources":["../../../__tests__/unit/FieldGroupHelpLabelIcon.test.tsx"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AACnC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,uBAAuB,MAAM,sCAAsC,CAAC;AAE3E,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,oBAAC,uBAAuB,IAAC,OAAO,EAAC,mBAAmB,GAAG,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,OAAO,GAAG,CACd;YACE,iDAA2B;YAC3B,kDAAuB,CACnB,CACP,CAAC;QACF,MAAM,CAAC,oBAAC,uBAAuB,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE9B,MAAM,CAAC,oBAAC,uBAAuB,IAAC,OAAO,EAAC,mBAAmB,EAAC,OAAO,EAAE,WAAW,GAAI,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACjE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,oBAAC,uBAAuB,IAAC,OAAO,EAAC,mBAAmB,GAAG,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAEjE,8DAA8D;QAC9D,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAE9B,MAAM,CAAC,oBAAC,uBAAuB,IAAC,OAAO,EAAC,mBAAmB,EAAC,OAAO,EAAE,WAAW,GAAI,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAEjE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAExB,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- import 'core-js/actual/array/to-sorted';
3
- //# sourceMappingURL=jest.setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jest.setup.d.ts","sourceRoot":"","sources":["../../../__tests__/unit/jest.setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AACnC,OAAO,gCAAgC,CAAC"}
@@ -1,5 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- import 'core-js/actual/array/to-sorted';
3
- // Set up Jest environment for React component testing
4
- // This file is referenced in jest.config.js setupFilesAfterEnv
5
- //# sourceMappingURL=jest.setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jest.setup.js","sourceRoot":"","sources":["../../../__tests__/unit/jest.setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC;AACnC,OAAO,gCAAgC,CAAC;AAExC,sDAAsD;AACtD,+DAA+D"}
@@ -1,3 +0,0 @@
1
- declare const _exports: string;
2
- export = _exports;
3
- //# sourceMappingURL=transform.file.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform.file.d.ts","sourceRoot":"","sources":["../../config/transform.file.js"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- "use strict";
2
- // Transform file imports (images, fonts, etc.) to filename strings in Jest tests
3
- module.exports = 'test-file-stub';
4
- //# sourceMappingURL=transform.file.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform.file.js","sourceRoot":"","sources":["../../config/transform.file.js"],"names":[],"mappings":";AAAA,iFAAiF;AACjF,MAAM,CAAC,OAAO,GAAG,gBAAgB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=transform.style.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform.style.d.ts","sourceRoot":"","sources":["../../config/transform.style.js"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- "use strict";
2
- // Transform style files (CSS, SCSS, SASS, LESS) to empty objects in Jest tests
3
- module.exports = {};
4
- //# sourceMappingURL=transform.style.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform.style.js","sourceRoot":"","sources":["../../config/transform.style.js"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC"}
@@ -1,22 +0,0 @@
1
- export let roots: string[];
2
- export let testMatch: string[];
3
- export let testPathIgnorePatterns: string[];
4
- export let modulePathIgnorePatterns: string[];
5
- export let clearMocks: boolean;
6
- export let moduleDirectories: string[];
7
- export let moduleNameMapper: {
8
- '\\.(css|less|sass|scss)$': string;
9
- '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': string;
10
- '~/(.*)': string;
11
- '#~/(.*)': string;
12
- };
13
- export let testEnvironment: string;
14
- export let transform: {
15
- '^.+\\.(t|j)sx?$': string;
16
- };
17
- export let transformIgnorePatterns: string[];
18
- export let snapshotSerializers: never[];
19
- export let setupFilesAfterEnv: string[];
20
- export let coverageDirectory: string;
21
- export let collectCoverageFrom: string[];
22
- //# sourceMappingURL=jest.config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jest.config.d.ts","sourceRoot":"","sources":["../jest.config.js"],"names":[],"mappings":""}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- // For a detailed explanation regarding each configuration property, visit:
3
- // https://jestjs.io/docs/en/configuration.html
4
- module.exports = {
5
- roots: ['<rootDir>/'],
6
- testMatch: [
7
- '**/__tests__/unit/**/?(*.)+(spec|test).ts?(x)',
8
- '**/__tests__/?(*.)+(spec|test).ts?(x)',
9
- '**/utilities/__tests__/?(*.)+(spec|test).ts?(x)',
10
- ],
11
- testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/dist/'],
12
- modulePathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/dist/'],
13
- // Automatically clear mock calls and instances between every test
14
- clearMocks: true,
15
- // An array of directory names to be searched recursively up from the requiring module's location
16
- moduleDirectories: ['node_modules', '<rootDir>/'],
17
- // A map from regular expressions to module names that allow to stub out resources with a single module
18
- moduleNameMapper: {
19
- '\\.(css|less|sass|scss)$': '<rootDir>/config/transform.style.js',
20
- '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': '<rootDir>/config/transform.file.js',
21
- '~/(.*)': '<rootDir>/$1',
22
- '#~/(.*)': '<rootDir>/$1',
23
- },
24
- // The test environment that will be used for testing.
25
- testEnvironment: 'jest-environment-jsdom',
26
- // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
27
- transform: {
28
- '^.+\\.(t|j)sx?$': 'ts-jest', // Process .js, .jsx, .ts, .tsx files with ts-jest
29
- },
30
- // include projects from node_modules as required
31
- transformIgnorePatterns: ['node_modules/(?!yaml|lodash-es|uuid|delaunator)'],
32
- // A list of paths to snapshot serializer modules Jest should use for snapshot testing
33
- snapshotSerializers: [],
34
- setupFilesAfterEnv: ['<rootDir>/__tests__/unit/jest.setup.ts'],
35
- coverageDirectory: 'jest-coverage',
36
- collectCoverageFrom: [
37
- '<rootDir>/**/*.{ts,tsx}',
38
- '!<rootDir>/__tests__/**',
39
- '!<rootDir>/__mocks__/**',
40
- '!**/*.spec.{ts,tsx}',
41
- ],
42
- };
43
- //# sourceMappingURL=jest.config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jest.config.js","sourceRoot":"","sources":["../jest.config.js"],"names":[],"mappings":";AAAA,2EAA2E;AAC3E,+CAA+C;AAE/C,MAAM,CAAC,OAAO,GAAG;IACf,KAAK,EAAE,CAAC,YAAY,CAAC;IACrB,SAAS,EAAE;QACT,+CAA+C;QAC/C,uCAAuC;QACvC,iDAAiD;KAClD;IACD,sBAAsB,EAAE,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;IACtE,wBAAwB,EAAE,CAAC,yBAAyB,EAAE,iBAAiB,CAAC;IACxE,kEAAkE;IAClE,UAAU,EAAE,IAAI;IAEhB,iGAAiG;IACjG,iBAAiB,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC;IAEjD,uGAAuG;IACvG,gBAAgB,EAAE;QAChB,0BAA0B,EAAE,qCAAqC;QACjE,qFAAqF,EACnF,oCAAoC;QACtC,QAAQ,EAAE,cAAc;QACxB,SAAS,EAAE,cAAc;KAC1B;IAED,sDAAsD;IACtD,eAAe,EAAE,wBAAwB;IAEzC,oIAAoI;IACpI,SAAS,EAAE;QACT,iBAAiB,EAAE,SAAS,EAAE,kDAAkD;KACjF;IAED,iDAAiD;IACjD,uBAAuB,EAAE,CAAC,iDAAiD,CAAC;IAE5E,sFAAsF;IACtF,mBAAmB,EAAE,EAAE;IAEvB,kBAAkB,EAAE,CAAC,wCAAwC,CAAC;IAE9D,iBAAiB,EAAE,eAAe;IAElC,mBAAmB,EAAE;QACnB,yBAAyB;QACzB,yBAAyB;QACzB,yBAAyB;QACzB,qBAAqB;KACtB;CACF,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=markdown.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdown.spec.d.ts","sourceRoot":"","sources":["../../../utilities/__tests__/markdown.spec.ts"],"names":[],"mappings":""}
@@ -1,17 +0,0 @@
1
- import { markdownConverter } from '../markdown';
2
- describe('markdownConverter', () => {
3
- // Helper function to convert HTML string to a DOM node
4
- const htmlToNode = (html) => {
5
- const container = document.createElement('div');
6
- container.innerHTML = html;
7
- return container;
8
- };
9
- it('should convert markdown to sanitized HTML and add hook to transform anchor tags', () => {
10
- const mockMarkdown = '## Heading\n\n[Link](https://example.com)';
11
- const expectedHtml = htmlToNode('<h2>Heading</h2>\n' +
12
- '<p><a href="https://example.com" rel="noopener noreferrer" target="_blank">Link</a></p>');
13
- const result = htmlToNode(markdownConverter.makeHtml(mockMarkdown));
14
- expect(result.isEqualNode(expectedHtml)).toBe(true);
15
- });
16
- });
17
- //# sourceMappingURL=markdown.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdown.spec.js","sourceRoot":"","sources":["../../../utilities/__tests__/markdown.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,uDAAuD;IACvD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAkB,EAAE;QAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAChD,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,YAAY,GAAG,2CAA2C,CAAC;QACjE,MAAM,YAAY,GAAG,UAAU,CAC7B,oBAAoB;YAClB,yFAAyF,CAC5F,CAAC;QAEF,MAAM,MAAM,GAAG,UAAU,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=string.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"string.spec.d.ts","sourceRoot":"","sources":["../../../utilities/__tests__/string.spec.ts"],"names":[],"mappings":""}
@@ -1,51 +0,0 @@
1
- import { genRandomChars } from '../string';
2
- describe('genRandomChars', () => {
3
- it('should return a string of default length 6', () => {
4
- const result = genRandomChars();
5
- expect(typeof result).toBe('string');
6
- expect(result.length).toBe(6);
7
- });
8
- it('should return a string of specified length', () => {
9
- const length = 10;
10
- const result = genRandomChars(length);
11
- expect(typeof result).toBe('string');
12
- expect(result.length).toBe(length);
13
- });
14
- it('should return different strings on multiple calls', () => {
15
- const result1 = genRandomChars();
16
- const result2 = genRandomChars();
17
- expect(result1).not.toBe(result2);
18
- });
19
- it('should only contain alphanumeric characters', () => {
20
- const result = genRandomChars(20);
21
- // Should only contain lowercase letters and numbers
22
- expect(result).toMatch(/^[a-z0-9]+$/);
23
- });
24
- it('should handle edge case of length 0', () => {
25
- const result = genRandomChars(0);
26
- expect(result).toBe('');
27
- });
28
- it('should handle length 1', () => {
29
- const result = genRandomChars(1);
30
- expect(result.length).toBe(1);
31
- expect(result).toMatch(/^[a-z0-9]$/);
32
- });
33
- it('should be consistent with its character set across multiple runs', () => {
34
- // Generate multiple strings and ensure they all follow the same pattern
35
- const results = Array.from({ length: 10 }, () => genRandomChars(10));
36
- results.forEach((result) => {
37
- expect(result).toMatch(/^[a-z0-9]+$/);
38
- expect(result.length).toBe(10);
39
- });
40
- });
41
- it('should not include special characters or uppercase letters', () => {
42
- // Run multiple times to increase confidence
43
- for (let i = 0; i < 20; i++) {
44
- const result = genRandomChars(15);
45
- // Should not contain uppercase letters, special characters, or whitespace
46
- expect(result).not.toMatch(/[A-Z]/);
47
- expect(result).not.toMatch(/[^a-z0-9]/);
48
- }
49
- });
50
- });
51
- //# sourceMappingURL=string.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"string.spec.js","sourceRoot":"","sources":["../../../utilities/__tests__/string.spec.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=time.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time.spec.d.ts","sourceRoot":"","sources":["../../../utilities/__tests__/time.spec.ts"],"names":[],"mappings":""}
@@ -1,61 +0,0 @@
1
- import { relativeTime } from '../time';
2
- describe('relativeTime', () => {
3
- it('should convert milliseconds to minutes and seconds', () => {
4
- expect(relativeTime(102, 30)).toBe('Just now');
5
- });
6
- it('should print ago if the current time is less than the previous', () => {
7
- expect(relativeTime(62000, 1)).toBe('1 minute ago');
8
- });
9
- it('should print in if the elapsed time is less than 0', () => {
10
- expect(relativeTime(1, 700000)).toBe('in 12 minutes');
11
- });
12
- it('should print in if the elapsed time is less than 0', () => {
13
- expect(relativeTime(1, 62000)).toBe('in 1 minute');
14
- });
15
- it('should return just now when previous is NaN', () => {
16
- expect(relativeTime(1000, NaN)).toBe('Just now');
17
- });
18
- it('should return just now if elapsed is less than 0', () => {
19
- expect(relativeTime(1000, 2000)).toBe('Just now');
20
- });
21
- it('should return formatted time in minutes when elapsed time is less than an hour', () => {
22
- const current = 1708976688173;
23
- const previous = current - 30 * 60 * 1000; // 30 minutes ago
24
- expect(relativeTime(current, previous)).toBe('30 minutes ago');
25
- });
26
- it('should return formatted time in hours when elapsed time is less than a day', () => {
27
- const current = 1708976688173;
28
- const previous = current - 6 * 60 * 60 * 1000; // 6 hours ago
29
- expect(relativeTime(current, previous)).toBe('6 hours ago');
30
- });
31
- it('should return formatted time in days when elapsed time is less than a month', () => {
32
- const current = 1708976688173;
33
- const previous = current - 2 * 24 * 60 * 60 * 1000; // 2 days ago
34
- expect(relativeTime(current, previous)).toBe('2 days ago');
35
- });
36
- it('should return formatted time in months when elapsed time is less than a year', () => {
37
- const current = 1708976688173;
38
- const previous = current - 2 * 30 * 24 * 60 * 60 * 1000; // 2 months ago
39
- expect(relativeTime(current, previous)).toBe('2 months ago');
40
- });
41
- it('should return formatted date when elapsed time is more than a year', () => {
42
- const current = 1708976688173;
43
- const previous = current - 2 * 365 * 24 * 60 * 60 * 1000; // 2 years ago
44
- expect(relativeTime(current, previous)).toMatch(/\d{1,2} [A-Za-z]+ \d{4}/); // Matches "01 Jan 2022" format
45
- });
46
- it('should get the correct month', () => {
47
- expect(relativeTime(2500, 1610859600000).split(' ')[1]).toBe('Jan');
48
- expect(relativeTime(2500, 1613538000000).split(' ')[1]).toBe('Feb');
49
- expect(relativeTime(2500, 1615953600000).split(' ')[1]).toBe('Mar');
50
- expect(relativeTime(2500, 1618632000000).split(' ')[1]).toBe('April');
51
- expect(relativeTime(2500, 1621224000000).split(' ')[1]).toBe('May');
52
- expect(relativeTime(2500, 1623902400000).split(' ')[1]).toBe('June');
53
- expect(relativeTime(2500, 1626494400000).split(' ')[1]).toBe('July');
54
- expect(relativeTime(2500, 1629172800000).split(' ')[1]).toBe('August');
55
- expect(relativeTime(2500, 1631851200000).split(' ')[1]).toBe('Sept');
56
- expect(relativeTime(2500, 1634443200000).split(' ')[1]).toBe('Oct');
57
- expect(relativeTime(2500, 1637125200000).split(' ')[1]).toBe('Nov');
58
- expect(relativeTime(2500, 1639717200000).split(' ')[1]).toBe('Dec');
59
- });
60
- });
61
- //# sourceMappingURL=time.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"time.spec.js","sourceRoot":"","sources":["../../../utilities/__tests__/time.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,iBAAiB;QAC5D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,cAAc;QAC7D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;QACjE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,eAAe;QACxE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,cAAc;QACxE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC,+BAA+B;IAC7G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}