@shohojdhara/atomix 0.3.13 → 0.3.15
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.
- package/CHANGELOG.md +39 -0
- package/README.md +2 -0
- package/build-tools/EXAMPLES.md +372 -0
- package/build-tools/README.md +242 -0
- package/build-tools/__tests__/error-handler.test.js +230 -0
- package/build-tools/__tests__/index.test.js +141 -0
- package/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/build-tools/__tests__/utils.test.js +161 -0
- package/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/build-tools/error-handler.js +308 -0
- package/build-tools/index.d.ts +43 -0
- package/build-tools/index.js +88 -0
- package/build-tools/package.json +67 -0
- package/build-tools/rollup-plugin.js +236 -0
- package/build-tools/types.d.ts +163 -0
- package/build-tools/utils.js +203 -0
- package/build-tools/vite-plugin.js +161 -0
- package/build-tools/webpack-loader.js +123 -0
- package/dist/atomix.css +298 -167
- package/dist/atomix.css.map +1 -1
- package/dist/atomix.min.css +3 -3
- package/dist/atomix.min.css.map +1 -1
- package/dist/build-tools/EXAMPLES.md +372 -0
- package/dist/build-tools/README.md +242 -0
- package/dist/build-tools/__tests__/error-handler.test.js +230 -0
- package/dist/build-tools/__tests__/index.test.js +141 -0
- package/dist/build-tools/__tests__/rollup-plugin.test.js +194 -0
- package/dist/build-tools/__tests__/utils.test.js +161 -0
- package/dist/build-tools/__tests__/vite-plugin.test.js +129 -0
- package/dist/build-tools/__tests__/webpack-loader.test.js +190 -0
- package/dist/build-tools/error-handler.js +308 -0
- package/dist/build-tools/index.d.ts +43 -0
- package/dist/build-tools/index.js +88 -0
- package/dist/build-tools/package.json +67 -0
- package/dist/build-tools/rollup-plugin.js +236 -0
- package/dist/build-tools/types.d.ts +163 -0
- package/dist/build-tools/utils.js +203 -0
- package/dist/build-tools/vite-plugin.js +161 -0
- package/dist/build-tools/webpack-loader.js +123 -0
- package/dist/charts.d.ts +2 -2
- package/dist/charts.js +87 -58
- package/dist/charts.js.map +1 -1
- package/dist/core.d.ts +42 -12
- package/dist/core.js +175 -135
- package/dist/core.js.map +1 -1
- package/dist/forms.d.ts +30 -16
- package/dist/forms.js +146 -131
- package/dist/forms.js.map +1 -1
- package/dist/heavy.d.ts +2 -2
- package/dist/heavy.js +151 -118
- package/dist/heavy.js.map +1 -1
- package/dist/index.d.ts +130 -106
- package/dist/index.esm.js +1083 -465
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1102 -483
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/theme.d.ts +27 -2
- package/dist/theme.js +721 -108
- package/dist/theme.js.map +1 -1
- package/package.json +23 -8
- package/scripts/atomix-cli.js +749 -1153
- package/scripts/cli/__tests__/README.md +81 -0
- package/scripts/cli/__tests__/basic.test.js +115 -0
- package/scripts/cli/__tests__/component-generator.test.js +332 -0
- package/scripts/cli/__tests__/integration.test.js +327 -0
- package/scripts/cli/__tests__/test-setup.js +133 -0
- package/scripts/cli/__tests__/token-manager.test.js +251 -0
- package/scripts/cli/__tests__/utils.test.js +78 -118
- package/scripts/cli/component-generator.js +564 -0
- package/scripts/cli/dependency-checker.js +355 -0
- package/scripts/cli/documentation-sync.js +542 -0
- package/scripts/cli/interactive-init.js +129 -292
- package/scripts/cli/mappings.js +211 -0
- package/scripts/cli/migration-tools.js +95 -288
- package/scripts/cli/template-manager.js +105 -0
- package/scripts/cli/templates/README.md +123 -0
- package/scripts/cli/templates/common-templates.js +636 -0
- package/scripts/cli/templates/composable-templates.js +171 -0
- package/scripts/cli/templates/config-templates.js +126 -0
- package/scripts/cli/templates/index.js +102 -0
- package/scripts/cli/templates/project-templates.js +342 -0
- package/scripts/cli/templates/react-templates.js +331 -0
- package/scripts/cli/templates/scss-templates.js +155 -0
- package/scripts/cli/templates/storybook-templates.js +236 -0
- package/scripts/cli/templates/testing-templates.js +224 -0
- package/scripts/cli/templates/testing-utils.js +278 -0
- package/scripts/cli/templates/token-templates.js +447 -0
- package/scripts/cli/templates/types-templates.js +147 -0
- package/scripts/cli/templates.js +35 -0
- package/scripts/cli/theme-bridge.js +28 -16
- package/scripts/cli/token-manager.js +432 -247
- package/scripts/cli/utils.js +37 -26
- package/src/components/Accordion/Accordion.stories.tsx +369 -870
- package/src/components/Accordion/Accordion.test.tsx +57 -0
- package/src/components/Accordion/Accordion.tsx +4 -0
- package/src/components/AtomixGlass/AtomixGlass.tsx +80 -39
- package/src/components/AtomixGlass/AtomixGlassContainer.tsx +103 -81
- package/src/components/AtomixGlass/__snapshots__/AtomixGlass.test.tsx.snap +8 -7
- package/src/components/AtomixGlass/glass-utils.ts +2 -2
- package/src/components/AtomixGlass/shader-utils.ts +5 -0
- package/src/components/AtomixGlass/stories/Customization.stories.tsx +131 -0
- package/src/components/AtomixGlass/stories/Examples.stories.tsx +2965 -2861
- package/src/components/AtomixGlass/stories/Modes.stories.tsx +1 -1
- package/src/components/AtomixGlass/stories/Overview.stories.tsx +348 -0
- package/src/components/AtomixGlass/stories/Performance.stories.tsx +103 -0
- package/src/components/AtomixGlass/stories/Playground.stories.tsx +73 -59
- package/src/components/AtomixGlass/stories/{ShaderVariants.stories.tsx → Shaders.stories.tsx} +1 -1
- package/src/components/AtomixGlass/stories/shared-components.tsx +90 -190
- package/src/components/Avatar/Avatar.stories.tsx +239 -27
- package/src/components/Badge/Badge.stories.tsx +132 -373
- package/src/components/Badge/Badge.test.tsx +51 -0
- package/src/components/Badge/Badge.tsx +20 -1
- package/src/components/Block/Block.stories.tsx +26 -17
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +141 -23
- package/src/components/Breadcrumb/Breadcrumb.tsx +2 -2
- package/src/components/Button/Button.stories.tsx +463 -1126
- package/src/components/Button/Button.test.tsx +107 -0
- package/src/components/Button/Button.tsx +50 -54
- package/src/components/Button/ButtonGroup.stories.tsx +373 -217
- package/src/components/Button/README.md +5 -0
- package/src/components/Callout/Callout.stories.tsx +299 -644
- package/src/components/Callout/Callout.test.tsx +10 -10
- package/src/components/Callout/Callout.tsx +7 -7
- package/src/components/Callout/README.md +9 -8
- package/src/components/Card/Card.stories.tsx +248 -68
- package/src/components/Card/Card.tsx +2 -2
- package/src/components/Chart/Chart.stories.tsx +156 -14
- package/src/components/Chart/Chart.tsx +1 -1
- package/src/components/ColorModeToggle/ColorModeToggle.stories.tsx +151 -69
- package/src/components/Countdown/Countdown.stories.tsx +115 -8
- package/src/components/DataTable/DataTable.stories.tsx +346 -146
- package/src/components/DataTable/DataTable.tsx +14 -12
- package/src/components/DatePicker/DatePicker.stories.tsx +325 -1066
- package/src/components/Dropdown/Dropdown.stories.tsx +157 -37
- package/src/components/EdgePanel/EdgePanel.stories.tsx +230 -21
- package/src/components/Footer/Footer.stories.tsx +392 -328
- package/src/components/Form/Checkbox.stories.tsx +143 -9
- package/src/components/Form/Checkbox.test.tsx +63 -0
- package/src/components/Form/Checkbox.tsx +90 -52
- package/src/components/Form/Form.stories.tsx +121 -22
- package/src/components/Form/FormGroup.stories.tsx +128 -5
- package/src/components/Form/Input.stories.tsx +28 -16
- package/src/components/Form/Input.test.tsx +59 -0
- package/src/components/Form/Input.tsx +97 -95
- package/src/components/Form/Radio.stories.tsx +232 -97
- package/src/components/Form/Radio.tsx +2 -2
- package/src/components/Form/Select.stories.tsx +144 -12
- package/src/components/Form/Select.tsx +2 -2
- package/src/components/Form/Textarea.stories.tsx +171 -13
- package/src/components/Form/Textarea.test.tsx +45 -0
- package/src/components/Form/Textarea.tsx +88 -86
- package/src/components/Hero/Hero.stories.tsx +333 -32
- package/src/components/List/List.stories.tsx +143 -5
- package/src/components/Modal/Modal.stories.tsx +185 -46
- package/src/components/Navigation/Navbar/Navbar.stories.tsx +5 -5
- package/src/components/Navigation/Navbar/Navbar.tsx +1 -1
- package/src/components/Navigation/README.md +1 -1
- package/src/components/Pagination/Pagination.stories.tsx +5 -2
- package/src/components/Pagination/Pagination.tsx +1 -1
- package/src/components/PhotoViewer/PhotoViewer.stories.tsx +10 -10
- package/src/components/Popover/Popover.stories.tsx +449 -99
- package/src/components/ProductReview/ProductReview.tsx +1 -1
- package/src/components/Progress/Progress.stories.tsx +167 -5
- package/src/components/Progress/Progress.tsx +46 -46
- package/src/components/Rating/Rating.stories.tsx +4 -4
- package/src/components/Rating/Rating.tsx +8 -8
- package/src/components/River/River.stories.tsx +1 -1
- package/src/components/SectionIntro/SectionIntro.stories.tsx +240 -48
- package/src/components/Slider/Slider.stories.tsx +63 -63
- package/src/components/Spinner/Spinner.stories.tsx +104 -10
- package/src/components/Spinner/Spinner.test.tsx +35 -0
- package/src/components/Spinner/Spinner.tsx +9 -2
- package/src/components/Steps/Steps.stories.tsx +172 -43
- package/src/components/Tabs/Tabs.stories.tsx +136 -10
- package/src/components/Testimonial/Testimonial.stories.tsx +121 -4
- package/src/components/Todo/Todo.stories.tsx +198 -9
- package/src/components/Toggle/Toggle.stories.tsx +153 -43
- package/src/components/Toggle/Toggle.test.tsx +91 -0
- package/src/components/Toggle/Toggle.tsx +44 -27
- package/src/components/Tooltip/Tooltip.stories.tsx +194 -104
- package/src/components/Tooltip/Tooltip.tsx +1 -1
- package/src/components/Upload/Upload.stories.tsx +113 -24
- package/src/layouts/Grid/Grid.stories.tsx +49 -49
- package/src/layouts/MasonryGrid/MasonryGrid.stories.tsx +2 -2
- package/src/lib/README.md +2 -2
- package/src/lib/__tests__/theme-tools.test.ts +193 -0
- package/src/lib/composables/index.ts +2 -2
- package/src/lib/composables/useAccordion.ts +12 -3
- package/src/lib/composables/useAtomixGlass.ts +28 -56
- package/src/lib/composables/useBreadcrumb.ts +2 -2
- package/src/lib/composables/useCallout.ts +7 -7
- package/src/lib/composables/useChartExport.ts +2 -7
- package/src/lib/composables/useDataTable.ts +46 -29
- package/src/lib/composables/useNavbar.ts +1 -1
- package/src/lib/constants/components.ts +10 -33
- package/src/lib/storybook/InteractiveDemo.tsx +113 -0
- package/src/lib/storybook/PreviewContainer.tsx +36 -0
- package/src/lib/storybook/VariantsGrid.tsx +21 -0
- package/src/lib/storybook/index.ts +3 -0
- package/src/lib/theme/core/createThemeObject.ts +9 -5
- package/src/lib/theme/devtools/CLI.ts +155 -0
- package/src/lib/theme/devtools/DesignTokensCustomizer.stories.tsx +213 -0
- package/src/lib/theme/devtools/DesignTokensCustomizer.tsx +566 -0
- package/src/lib/theme/devtools/LiveEditor.tsx +2 -1
- package/src/lib/theme/devtools/index.ts +3 -0
- package/src/lib/theme/errors/errors.ts +8 -0
- package/src/lib/theme/runtime/ThemeProvider.tsx +117 -57
- package/src/lib/theme/runtime/__tests__/ThemeProvider.integration.test.tsx +305 -0
- package/src/lib/theme/runtime/__tests__/ThemeProvider.test.tsx +588 -0
- package/src/lib/theme/utils/__tests__/themeValidation.test.ts +264 -0
- package/src/lib/theme/utils/index.ts +1 -0
- package/src/lib/theme/utils/themeValidation.ts +501 -0
- package/src/lib/theme-tools.ts +32 -3
- package/src/lib/types/components.ts +82 -27
- package/src/lib/utils/__tests__/csv.test.ts +45 -0
- package/src/lib/utils/csv.ts +17 -0
- package/src/lib/utils/dataTableExport.ts +1 -10
- package/src/lib/utils/themeNaming.ts +1 -1
- package/src/styles/01-settings/_index.scss +2 -1
- package/src/styles/01-settings/_settings.accordion.scss +28 -7
- package/src/styles/01-settings/_settings.colors.scss +11 -11
- package/src/styles/01-settings/_settings.typography.scss +5 -5
- package/src/styles/02-tools/_tools.utility-api.scss +14 -0
- package/src/styles/06-components/_components.accordion.scss +56 -14
- package/src/styles/06-components/_components.callout.scss +29 -33
- package/src/styles/06-components/_components.checkbox.scss +23 -17
- package/src/styles/06-components/_index.scss +1 -1
- package/src/styles/99-utilities/_index.scss +2 -0
- package/src/styles/99-utilities/_utilities.display.scss +14 -3
- package/src/styles/99-utilities/_utilities.flex.scss +10 -10
- package/src/styles/99-utilities/_utilities.scss +3 -1
- package/src/styles/99-utilities/_utilities.text-gradient.scss +45 -0
- package/src/styles/99-utilities/_utilities.text.scss +28 -8
- package/themes/dark-complementary/README.md +98 -0
- package/themes/dark-complementary/index.scss +158 -0
- package/themes/default-light/README.md +81 -0
- package/themes/default-light/index.scss +154 -0
- package/themes/high-contrast/README.md +105 -0
- package/themes/high-contrast/index.scss +172 -0
- package/themes/test-theme/README.md +38 -0
- package/themes/test-theme/index.scss +47 -0
- package/scripts/cli/__tests__/cli-commands.test.js +0 -204
- package/scripts/cli/__tests__/vitest.config.js +0 -26
- package/src/components/AtomixGlass/stories/AtomixGlass.stories.tsx +0 -1438
- package/src/lib/composables/useButton.ts +0 -93
- package/src/lib/composables/useCheckbox.ts +0 -70
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Error handling utilities for Atomix build tools
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Custom error class for Atomix build tool errors
|
|
7
|
+
* @extends Error
|
|
8
|
+
*/
|
|
9
|
+
export class AtomixBuildError extends Error {
|
|
10
|
+
/**
|
|
11
|
+
* @param {string} message - Error message
|
|
12
|
+
* @param {string} code - Error code
|
|
13
|
+
* @param {Object} [details] - Additional error details
|
|
14
|
+
* @param {string[]} [suggestions] - Suggested solutions
|
|
15
|
+
*/
|
|
16
|
+
constructor(message, code, details = {}, suggestions = []) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = 'AtomixBuildError';
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.details = details;
|
|
21
|
+
this.suggestions = suggestions;
|
|
22
|
+
this.timestamp = new Date().toISOString();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get formatted error message
|
|
27
|
+
* @returns {string} Formatted error message
|
|
28
|
+
*/
|
|
29
|
+
toString() {
|
|
30
|
+
let msg = `[AtomixBuildError:${this.code}] ${this.message}`;
|
|
31
|
+
|
|
32
|
+
if (this.details && Object.keys(this.details).length > 0) {
|
|
33
|
+
msg += `\nDetails: ${JSON.stringify(this.details, null, 2)}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (this.suggestions && this.suggestions.length > 0) {
|
|
37
|
+
msg += `\nSuggestions:\n${this.suggestions.map((s, i) => ` ${i + 1}. ${s}`).join('\n')}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return msg;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Validation utilities
|
|
46
|
+
*/
|
|
47
|
+
export class Validator {
|
|
48
|
+
/**
|
|
49
|
+
* Validate theme name
|
|
50
|
+
* @param {string} theme - Theme name to validate
|
|
51
|
+
* @param {string[]} [availableThemes] - List of available themes
|
|
52
|
+
* @throws {AtomixBuildError} If validation fails
|
|
53
|
+
*/
|
|
54
|
+
static validateTheme(theme, availableThemes = []) {
|
|
55
|
+
if (typeof theme !== 'string') {
|
|
56
|
+
throw new AtomixBuildError(
|
|
57
|
+
'Theme must be a string',
|
|
58
|
+
'INVALID_THEME_TYPE',
|
|
59
|
+
{ theme, type: typeof theme },
|
|
60
|
+
['Provide a string value for theme option']
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (theme.trim() === '') {
|
|
65
|
+
throw new AtomixBuildError(
|
|
66
|
+
'Theme cannot be empty',
|
|
67
|
+
'EMPTY_THEME',
|
|
68
|
+
{ theme },
|
|
69
|
+
['Provide a valid theme name']
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (availableThemes.length > 0 && !availableThemes.includes(theme)) {
|
|
74
|
+
throw new AtomixBuildError(
|
|
75
|
+
`Theme '${theme}' not found`,
|
|
76
|
+
'THEME_NOT_FOUND',
|
|
77
|
+
{ theme, availableThemes },
|
|
78
|
+
[
|
|
79
|
+
`Available themes: ${availableThemes.join(', ')}`,
|
|
80
|
+
'Check if the theme name is spelled correctly',
|
|
81
|
+
'Verify the theme exists in your Atomix installation'
|
|
82
|
+
]
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Validate components array
|
|
89
|
+
* @param {any} components - Components to validate
|
|
90
|
+
* @param {string[]} [availableComponents] - List of available components
|
|
91
|
+
* @throws {AtomixBuildError} If validation fails
|
|
92
|
+
*/
|
|
93
|
+
static validateComponents(components, availableComponents = []) {
|
|
94
|
+
if (!Array.isArray(components)) {
|
|
95
|
+
throw new AtomixBuildError(
|
|
96
|
+
'Components must be an array',
|
|
97
|
+
'INVALID_COMPONENTS_TYPE',
|
|
98
|
+
{ components, type: typeof components },
|
|
99
|
+
['Provide an array of component names']
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const invalidItems = components.filter(item => typeof item !== 'string');
|
|
104
|
+
if (invalidItems.length > 0) {
|
|
105
|
+
throw new AtomixBuildError(
|
|
106
|
+
'All component names must be strings',
|
|
107
|
+
'INVALID_COMPONENT_NAMES',
|
|
108
|
+
{ invalidItems },
|
|
109
|
+
['Ensure all component names are string values']
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (availableComponents.length > 0) {
|
|
114
|
+
const missingComponents = components.filter(comp => !availableComponents.includes(comp));
|
|
115
|
+
if (missingComponents.length > 0) {
|
|
116
|
+
throw new AtomixBuildError(
|
|
117
|
+
`Some requested components not found: ${missingComponents.join(', ')}`,
|
|
118
|
+
'COMPONENTS_NOT_FOUND',
|
|
119
|
+
{ missingComponents, availableComponents },
|
|
120
|
+
[
|
|
121
|
+
`Available components: ${availableComponents.slice(0, 10).join(', ')}${availableComponents.length > 10 ? '...' : ''}`,
|
|
122
|
+
'Check component names for typos',
|
|
123
|
+
'Verify components exist in your Atomix version'
|
|
124
|
+
]
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Validate boolean options
|
|
132
|
+
* @param {any} value - Value to validate
|
|
133
|
+
* @param {string} optionName - Name of the option
|
|
134
|
+
* @throws {AtomixBuildError} If validation fails
|
|
135
|
+
*/
|
|
136
|
+
static validateBoolean(value, optionName) {
|
|
137
|
+
if (typeof value !== 'boolean') {
|
|
138
|
+
throw new AtomixBuildError(
|
|
139
|
+
`${optionName} must be a boolean`,
|
|
140
|
+
'INVALID_BOOLEAN_OPTION',
|
|
141
|
+
{ optionName, value, type: typeof value },
|
|
142
|
+
[`Provide true or false for ${optionName} option`]
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Validate string options
|
|
149
|
+
* @param {any} value - Value to validate
|
|
150
|
+
* @param {string} optionName - Name of the option
|
|
151
|
+
* @param {boolean} [allowEmpty=false] - Whether empty strings are allowed
|
|
152
|
+
* @throws {AtomixBuildError} If validation fails
|
|
153
|
+
*/
|
|
154
|
+
static validateString(value, optionName, allowEmpty = false) {
|
|
155
|
+
if (typeof value !== 'string') {
|
|
156
|
+
throw new AtomixBuildError(
|
|
157
|
+
`${optionName} must be a string`,
|
|
158
|
+
'INVALID_STRING_OPTION',
|
|
159
|
+
{ optionName, value, type: typeof value },
|
|
160
|
+
[`Provide a string value for ${optionName} option`]
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (!allowEmpty && value.trim() === '') {
|
|
165
|
+
throw new AtomixBuildError(
|
|
166
|
+
`${optionName} cannot be empty`,
|
|
167
|
+
'EMPTY_STRING_OPTION',
|
|
168
|
+
{ optionName, value },
|
|
169
|
+
[`Provide a non-empty string for ${optionName} option`]
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Validate plugin options object
|
|
176
|
+
* @param {Object} options - Options to validate
|
|
177
|
+
* @param {string[]} [availableThemes] - Available themes
|
|
178
|
+
* @param {string[]} [availableComponents] - Available components
|
|
179
|
+
* @throws {AtomixBuildError} If validation fails
|
|
180
|
+
*/
|
|
181
|
+
static validateOptions(options, availableThemes = [], availableComponents = []) {
|
|
182
|
+
if (typeof options !== 'object' || options === null) {
|
|
183
|
+
throw new AtomixBuildError(
|
|
184
|
+
'Options must be an object',
|
|
185
|
+
'INVALID_OPTIONS_OBJECT',
|
|
186
|
+
{ options, type: typeof options },
|
|
187
|
+
['Provide a valid options object']
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Validate individual options
|
|
192
|
+
if ('theme' in options) {
|
|
193
|
+
this.validateTheme(options.theme, availableThemes);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if ('components' in options) {
|
|
197
|
+
this.validateComponents(options.components, availableComponents);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if ('optimizeCss' in options) {
|
|
201
|
+
this.validateBoolean(options.optimizeCss, 'optimizeCss');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if ('includeAtoms' in options) {
|
|
205
|
+
this.validateBoolean(options.includeAtoms, 'includeAtoms');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if ('verbose' in options) {
|
|
209
|
+
this.validateBoolean(options.verbose, 'verbose');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if ('optimize' in options) {
|
|
213
|
+
this.validateBoolean(options.optimize, 'optimize');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Check for unknown options
|
|
217
|
+
const knownOptions = ['theme', 'components', 'optimizeCss', 'includeAtoms', 'verbose', 'optimize'];
|
|
218
|
+
const unknownOptions = Object.keys(options).filter(key => !knownOptions.includes(key));
|
|
219
|
+
|
|
220
|
+
if (unknownOptions.length > 0) {
|
|
221
|
+
console.warn(`[AtomixBuildWarning] Unknown options provided: ${unknownOptions.join(', ')}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Error handling utilities
|
|
228
|
+
*/
|
|
229
|
+
export class ErrorHandler {
|
|
230
|
+
/**
|
|
231
|
+
* Wrap a function with error handling
|
|
232
|
+
* @param {Function} fn - Function to wrap
|
|
233
|
+
* @param {string} context - Context/error prefix
|
|
234
|
+
* @returns {Function} Wrapped function
|
|
235
|
+
*/
|
|
236
|
+
static withErrorHandling(fn, context) {
|
|
237
|
+
return (...args) => {
|
|
238
|
+
try {
|
|
239
|
+
return fn(...args);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
if (error instanceof AtomixBuildError) {
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
throw new AtomixBuildError(
|
|
246
|
+
`${context}: ${error.message}`,
|
|
247
|
+
'UNEXPECTED_ERROR',
|
|
248
|
+
{ originalError: error.message, stack: error.stack },
|
|
249
|
+
['Check the error details above', 'Review your configuration', 'Consult the documentation']
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Create a safe validator function
|
|
257
|
+
* @param {Function} validator - Validator function
|
|
258
|
+
* @param {string} context - Context for error messages
|
|
259
|
+
* @returns {Function} Safe validator function
|
|
260
|
+
*/
|
|
261
|
+
static createSafeValidator(validator, context) {
|
|
262
|
+
return (...args) => {
|
|
263
|
+
try {
|
|
264
|
+
return validator(...args);
|
|
265
|
+
} catch (error) {
|
|
266
|
+
if (error instanceof AtomixBuildError) {
|
|
267
|
+
throw error;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
throw new AtomixBuildError(
|
|
271
|
+
`${context}: Validation failed`,
|
|
272
|
+
'VALIDATION_ERROR',
|
|
273
|
+
{ args, originalError: error.message },
|
|
274
|
+
['Check the validation rules', 'Review your input data']
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Log error with proper formatting
|
|
282
|
+
* @param {Error|AtomixBuildError} error - Error to log
|
|
283
|
+
* @param {boolean} [verbose=false] - Whether to show verbose output
|
|
284
|
+
*/
|
|
285
|
+
static logError(error, verbose = false) {
|
|
286
|
+
if (error instanceof AtomixBuildError) {
|
|
287
|
+
console.error(error.toString());
|
|
288
|
+
} else {
|
|
289
|
+
console.error(`[Error] ${error.message}`);
|
|
290
|
+
if (verbose && error.stack) {
|
|
291
|
+
console.error('Stack trace:', error.stack);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Get error code from error
|
|
298
|
+
* @param {Error} error - Error object
|
|
299
|
+
* @returns {string|null} Error code or null
|
|
300
|
+
*/
|
|
301
|
+
static getErrorCode(error) {
|
|
302
|
+
if (error instanceof AtomixBuildError) {
|
|
303
|
+
return error.code;
|
|
304
|
+
}
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Import types
|
|
2
|
+
import type {
|
|
3
|
+
AtomixBuildToolOptions,
|
|
4
|
+
BuildTool,
|
|
5
|
+
AtomixVitePluginOptions,
|
|
6
|
+
AtomixLoaderOptions,
|
|
7
|
+
AtomixRollupPluginOptions,
|
|
8
|
+
VitePluginResult,
|
|
9
|
+
RollupPluginResult,
|
|
10
|
+
} from './types.js';
|
|
11
|
+
|
|
12
|
+
// ─── Plugin Exports ──────────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
/** Vite plugin for Atomix integration */
|
|
15
|
+
export declare function vitePlugin(options?: AtomixVitePluginOptions): VitePluginResult;
|
|
16
|
+
|
|
17
|
+
/** Webpack loader for Atomix integration (exported as the loader function itself) */
|
|
18
|
+
export declare const webpackLoader: (source: string) => string;
|
|
19
|
+
|
|
20
|
+
/** Rollup plugin for Atomix integration */
|
|
21
|
+
export declare function rollupPlugin(options?: AtomixRollupPluginOptions): RollupPluginResult;
|
|
22
|
+
|
|
23
|
+
// ─── Utility Exports ─────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Gets the appropriate plugin/loader based on the detected build tool.
|
|
27
|
+
* Returns the instantiated plugin for Vite/Rollup, or the loader function for Webpack.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getIntegration(
|
|
30
|
+
buildTool: BuildTool,
|
|
31
|
+
options?: AtomixBuildToolOptions
|
|
32
|
+
): VitePluginResult | RollupPluginResult | typeof webpackLoader | null;
|
|
33
|
+
|
|
34
|
+
/** Detects the build tool used in the current project by reading package.json */
|
|
35
|
+
export declare function detectBuildTool(): BuildTool;
|
|
36
|
+
|
|
37
|
+
/** Initialize the appropriate integration based on detected build tool */
|
|
38
|
+
export declare function initAutoIntegration(
|
|
39
|
+
options?: AtomixBuildToolOptions
|
|
40
|
+
): VitePluginResult | RollupPluginResult | typeof webpackLoader | null;
|
|
41
|
+
|
|
42
|
+
/** Get available themes from Atomix installation */
|
|
43
|
+
export declare function getAvailableThemes(atomixPath?: string | null): string[];
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Entry point for Atomix Build Tool Integrations
|
|
3
|
+
* Provides a unified way to access build tool plugins/loaders
|
|
4
|
+
* @module @shohojdhara/atomix/build-tools
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import fs from 'fs';
|
|
8
|
+
import path from 'path';
|
|
9
|
+
|
|
10
|
+
/** @typedef {import('./types').AtomixBuildToolOptions} AtomixBuildToolOptions */
|
|
11
|
+
/** @typedef {import('./types').BuildTool} BuildTool */
|
|
12
|
+
|
|
13
|
+
import vitePluginFn from './vite-plugin.js';
|
|
14
|
+
import webpackLoaderFn from './webpack-loader.js';
|
|
15
|
+
import rollupPluginFn from './rollup-plugin.js';
|
|
16
|
+
|
|
17
|
+
// Named re-exports
|
|
18
|
+
export { default as vitePlugin } from './vite-plugin.js';
|
|
19
|
+
export { default as webpackLoader } from './webpack-loader.js';
|
|
20
|
+
export { default as rollupPlugin } from './rollup-plugin.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Gets the appropriate plugin/loader based on the detected build tool
|
|
24
|
+
* @param {BuildTool} buildTool - Name of the build tool ('vite', 'webpack', 'rollup')
|
|
25
|
+
* @param {AtomixBuildToolOptions} [options={}] - Options to pass to the plugin/loader
|
|
26
|
+
* @returns {Function|null} The appropriate plugin/loader function or null if not found
|
|
27
|
+
*/
|
|
28
|
+
export function getIntegration(buildTool, options = {}) {
|
|
29
|
+
switch (buildTool?.toLowerCase()) {
|
|
30
|
+
case 'vite':
|
|
31
|
+
return vitePluginFn(options);
|
|
32
|
+
case 'webpack':
|
|
33
|
+
// Webpack loaders work differently — return the loader function itself
|
|
34
|
+
return webpackLoaderFn;
|
|
35
|
+
case 'rollup':
|
|
36
|
+
return rollupPluginFn(options);
|
|
37
|
+
default:
|
|
38
|
+
console.warn(`[Atomix Build Tools] Unsupported build tool: ${buildTool}`);
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Detects the build tool used in the current project
|
|
45
|
+
* @returns {BuildTool} Detected build tool or null if not found
|
|
46
|
+
*/
|
|
47
|
+
export function detectBuildTool() {
|
|
48
|
+
try {
|
|
49
|
+
const pkgPath = path.join(process.cwd(), 'package.json');
|
|
50
|
+
if (!fs.existsSync(pkgPath)) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
55
|
+
const allDeps = {
|
|
56
|
+
...pkg.dependencies,
|
|
57
|
+
...pkg.devDependencies,
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
if (allDeps.vite) return 'vite';
|
|
61
|
+
if (allDeps.webpack) return 'webpack';
|
|
62
|
+
if (allDeps.rollup) return 'rollup';
|
|
63
|
+
|
|
64
|
+
return null;
|
|
65
|
+
} catch (e) {
|
|
66
|
+
console.error('[Atomix Build Tools] Error detecting build tool:', e.message);
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Initialize the appropriate integration based on detected build tool
|
|
73
|
+
* @param {AtomixBuildToolOptions} [options={}] - Options to pass to the plugin/loader
|
|
74
|
+
* @returns {Function|null} The appropriate plugin/loader function or null if not found
|
|
75
|
+
*/
|
|
76
|
+
export function initAutoIntegration(options = {}) {
|
|
77
|
+
const buildTool = detectBuildTool();
|
|
78
|
+
if (!buildTool) {
|
|
79
|
+
console.warn('[Atomix Build Tools] Could not detect build tool, please use specific integration');
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
console.log(`[Atomix Build Tools] Detected build tool: ${buildTool}, initializing integration...`);
|
|
84
|
+
return getIntegration(buildTool, options);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Export helpers
|
|
88
|
+
export { getAvailableThemes } from './utils.js';
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shohojdhara/atomix-build-tools",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Build tool integrations for the Atomix design system",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./index.js",
|
|
7
|
+
"types": "./index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./index.d.ts",
|
|
11
|
+
"import": "./index.js"
|
|
12
|
+
},
|
|
13
|
+
"./vite-plugin": {
|
|
14
|
+
"types": "./index.d.ts",
|
|
15
|
+
"import": "./vite-plugin.js"
|
|
16
|
+
},
|
|
17
|
+
"./rollup-plugin": {
|
|
18
|
+
"types": "./index.d.ts",
|
|
19
|
+
"import": "./rollup-plugin.js"
|
|
20
|
+
},
|
|
21
|
+
"./webpack-loader": {
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"import": "./webpack-loader.js"
|
|
24
|
+
},
|
|
25
|
+
"./types": {
|
|
26
|
+
"types": "./types.d.ts"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"test": "vitest run __tests__/"
|
|
34
|
+
},
|
|
35
|
+
"peerDependencies": {
|
|
36
|
+
"vite": "^4.0.0 || ^5.0.0 || ^6.0.0",
|
|
37
|
+
"webpack": "^5.0.0",
|
|
38
|
+
"rollup": "^3.0.0 || ^4.0.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependenciesMeta": {
|
|
41
|
+
"vite": { "optional": true },
|
|
42
|
+
"webpack": { "optional": true },
|
|
43
|
+
"rollup": { "optional": true }
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"atomix",
|
|
47
|
+
"design-system",
|
|
48
|
+
"vite",
|
|
49
|
+
"webpack",
|
|
50
|
+
"rollup",
|
|
51
|
+
"plugin",
|
|
52
|
+
"loader",
|
|
53
|
+
"ui",
|
|
54
|
+
"framework"
|
|
55
|
+
],
|
|
56
|
+
"author": "Limon Khan",
|
|
57
|
+
"license": "MIT",
|
|
58
|
+
"repository": {
|
|
59
|
+
"type": "git",
|
|
60
|
+
"url": "https://github.com/Shohojdhara/atomix.git",
|
|
61
|
+
"directory": "build-tools"
|
|
62
|
+
},
|
|
63
|
+
"bugs": {
|
|
64
|
+
"url": "https://github.com/Shohojdhara/atomix/issues"
|
|
65
|
+
},
|
|
66
|
+
"homepage": "https://github.com/Shohojdhara/atomix#readme"
|
|
67
|
+
}
|