@fremtind/jokul 5.0.0-next.9 → 5.0.1
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/build/build-stats.html +1 -1
- package/build/cjs/components/autosuggest/BaseAutosuggest.cjs +1 -1
- package/build/cjs/components/autosuggest/BaseAutosuggest.cjs.map +1 -1
- package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs +1 -1
- package/build/cjs/components/checkbox-panel/CheckboxPanel.cjs.map +1 -1
- package/build/cjs/components/checkbox-panel/CheckboxPanel.d.cts +1 -1
- package/build/cjs/components/expander/Accordion.cjs +2 -0
- package/build/cjs/components/expander/Accordion.cjs.map +1 -0
- package/build/cjs/components/expander/Accordion.d.cts +2 -0
- package/build/cjs/components/expander/ExpandablePanel.cjs +1 -1
- package/build/cjs/components/expander/ExpandablePanel.cjs.map +1 -1
- package/build/cjs/components/expander/ExpandablePanelContent.cjs +1 -1
- package/build/cjs/components/expander/ExpandablePanelContent.cjs.map +1 -1
- package/build/cjs/components/expander/Expander.cjs +1 -1
- package/build/cjs/components/expander/Expander.cjs.map +1 -1
- package/build/cjs/components/expander/index.cjs +1 -1
- package/build/cjs/components/expander/index.d.cts +2 -1
- package/build/cjs/components/expander/types.d.cts +5 -2
- package/build/cjs/components/icon/Icon.cjs +1 -1
- package/build/cjs/components/icon/Icon.cjs.map +1 -1
- package/build/cjs/components/icon/Icon.d.cts +2 -2
- package/build/cjs/components/icon/icons/GreenCheckIcon.cjs +1 -1
- package/build/cjs/components/icon/icons/GreenCheckIcon.cjs.map +1 -1
- package/build/cjs/components/icon/icons/GreenCheckIcon.d.cts +2 -3
- package/build/cjs/components/icon/icons/RedCrossIcon.cjs +1 -1
- package/build/cjs/components/icon/icons/RedCrossIcon.cjs.map +1 -1
- package/build/cjs/components/icon/icons/RedCrossIcon.d.cts +2 -3
- package/build/cjs/components/input-panel/InputPanel.cjs +1 -1
- package/build/cjs/components/input-panel/InputPanel.cjs.map +1 -1
- package/build/cjs/components/input-panel/InputPanel.d.cts +1 -1
- package/build/cjs/components/input-panel/types.d.cts +2 -1
- package/build/cjs/components/link-list/LinkList.cjs +1 -1
- package/build/cjs/components/link-list/LinkList.cjs.map +1 -1
- package/build/cjs/components/link-list/LinkList.d.cts +1 -1
- package/build/cjs/components/link-list/types.d.cts +1 -0
- package/build/cjs/components/message/Message.cjs +1 -1
- package/build/cjs/components/message/Message.cjs.map +1 -1
- package/build/cjs/components/number-input/NumberInput.cjs +2 -0
- package/build/cjs/components/number-input/NumberInput.cjs.map +1 -0
- package/build/cjs/components/number-input/NumberInput.d.cts +7 -0
- package/build/cjs/components/number-input/index.cjs +2 -0
- package/build/cjs/components/number-input/index.cjs.map +1 -0
- package/build/cjs/components/number-input/index.d.cts +2 -0
- package/build/cjs/components/number-input/types.cjs +2 -0
- package/build/cjs/components/number-input/types.cjs.map +1 -0
- package/build/cjs/components/number-input/types.d.cts +20 -0
- package/build/cjs/components/popover/Popover.cjs +1 -1
- package/build/cjs/components/popover/Popover.cjs.map +1 -1
- package/build/cjs/components/popover/types.d.cts +8 -1
- package/build/cjs/components/radio-panel/RadioPanel.cjs +1 -1
- package/build/cjs/components/radio-panel/RadioPanel.cjs.map +1 -1
- package/build/cjs/components/select/Select.cjs +1 -1
- package/build/cjs/components/select/Select.cjs.map +1 -1
- package/build/cjs/components/system-message/types.d.cts +7 -2
- package/build/cjs/components/toast/Toast.cjs +1 -1
- package/build/cjs/components/toast/Toast.cjs.map +1 -1
- package/build/cjs/components/typography/Title.cjs +1 -1
- package/build/cjs/components/typography/Title.cjs.map +1 -1
- package/build/cjs/hooks/useListNavigation/useListNavigation.cjs +1 -1
- package/build/cjs/hooks/useListNavigation/useListNavigation.cjs.map +1 -1
- package/build/cjs/hooks/useListNavigation/useListNavigation.d.cts +11 -2
- package/build/cjs/tokens.cjs +1 -1
- package/build/cjs/tokens.cjs.map +1 -1
- package/build/cjs/utilities/index.cjs +1 -1
- package/build/cjs/utilities/types.cjs +1 -1
- package/build/cjs/utilities/types.cjs.map +1 -1
- package/build/cjs/utilities/types.d.cts +13 -1
- package/build/es/components/autosuggest/BaseAutosuggest.js +1 -1
- package/build/es/components/autosuggest/BaseAutosuggest.js.map +1 -1
- package/build/es/components/checkbox-panel/CheckboxPanel.d.ts +1 -1
- package/build/es/components/checkbox-panel/CheckboxPanel.js +1 -1
- package/build/es/components/checkbox-panel/CheckboxPanel.js.map +1 -1
- package/build/es/components/datepicker/DatePicker.js +1 -1
- package/build/es/components/datepicker/internal/Calendar.js +1 -1
- package/build/es/components/datepicker/internal/useCalendar.js +1 -1
- package/build/es/components/datepicker/internal/utils.js +1 -1
- package/build/es/components/expander/Accordion.d.ts +2 -0
- package/build/es/components/expander/Accordion.js +2 -0
- package/build/es/components/expander/Accordion.js.map +1 -0
- package/build/es/components/expander/ExpandablePanel.js +1 -1
- package/build/es/components/expander/ExpandablePanel.js.map +1 -1
- package/build/es/components/expander/ExpandablePanelContent.js +1 -1
- package/build/es/components/expander/ExpandablePanelContent.js.map +1 -1
- package/build/es/components/expander/Expander.js +1 -1
- package/build/es/components/expander/Expander.js.map +1 -1
- package/build/es/components/expander/index.d.ts +2 -1
- package/build/es/components/expander/index.js +1 -1
- package/build/es/components/expander/types.d.ts +5 -2
- package/build/es/components/icon/Icon.d.ts +2 -2
- package/build/es/components/icon/Icon.js +1 -1
- package/build/es/components/icon/Icon.js.map +1 -1
- package/build/es/components/icon/icons/GreenCheckIcon.d.ts +2 -3
- package/build/es/components/icon/icons/GreenCheckIcon.js +1 -1
- package/build/es/components/icon/icons/GreenCheckIcon.js.map +1 -1
- package/build/es/components/icon/icons/RedCrossIcon.d.ts +2 -3
- package/build/es/components/icon/icons/RedCrossIcon.js +1 -1
- package/build/es/components/icon/icons/RedCrossIcon.js.map +1 -1
- package/build/es/components/input-panel/InputPanel.d.ts +1 -1
- package/build/es/components/input-panel/InputPanel.js +1 -1
- package/build/es/components/input-panel/InputPanel.js.map +1 -1
- package/build/es/components/input-panel/types.d.ts +2 -1
- package/build/es/components/link-list/LinkList.d.ts +1 -1
- package/build/es/components/link-list/LinkList.js +1 -1
- package/build/es/components/link-list/LinkList.js.map +1 -1
- package/build/es/components/link-list/types.d.ts +1 -0
- package/build/es/components/menu/Menu.js +1 -1
- package/build/es/components/message/Message.js +1 -1
- package/build/es/components/message/Message.js.map +1 -1
- package/build/es/components/number-input/NumberInput.d.ts +7 -0
- package/build/es/components/number-input/NumberInput.js +2 -0
- package/build/es/components/number-input/NumberInput.js.map +1 -0
- package/build/es/components/number-input/index.d.ts +2 -0
- package/build/es/components/number-input/index.js +2 -0
- package/build/es/components/number-input/index.js.map +1 -0
- package/build/es/components/number-input/types.d.ts +20 -0
- package/build/es/components/number-input/types.js +2 -0
- package/build/es/components/number-input/types.js.map +1 -0
- package/build/es/components/popover/Popover.js +1 -1
- package/build/es/components/popover/Popover.js.map +1 -1
- package/build/es/components/popover/types.d.ts +8 -1
- package/build/es/components/radio-panel/RadioPanel.js +1 -1
- package/build/es/components/radio-panel/RadioPanel.js.map +1 -1
- package/build/es/components/select/Select.js +1 -1
- package/build/es/components/select/Select.js.map +1 -1
- package/build/es/components/system-message/types.d.ts +7 -2
- package/build/es/components/toast/Toast.js +1 -1
- package/build/es/components/toast/Toast.js.map +1 -1
- package/build/es/components/toast/toastContext.js +1 -1
- package/build/es/components/tooltip/Tooltip.js +1 -1
- package/build/es/components/typography/Title.js +1 -1
- package/build/es/components/typography/Title.js.map +1 -1
- package/build/es/hooks/stories/content.js +1 -1
- package/build/es/hooks/useListNavigation/useListNavigation.d.ts +11 -2
- package/build/es/hooks/useListNavigation/useListNavigation.js +1 -1
- package/build/es/hooks/useListNavigation/useListNavigation.js.map +1 -1
- package/build/es/tokens.js +1 -1
- package/build/es/tokens.js.map +1 -1
- package/build/es/utilities/constants/index.js +1 -1
- package/build/es/utilities/constants/unicode.js +1 -1
- package/build/es/utilities/formatters/bytes/formatBytes.js +1 -1
- package/build/es/utilities/formatters/fodselsnummer/formatFodselsnummer.js +1 -1
- package/build/es/utilities/formatters/kontonummer/formatKontonummer.js +1 -1
- package/build/es/utilities/formatters/kortnummer/formatKortnummer.js +1 -1
- package/build/es/utilities/formatters/organisasjonsnummer/formatOrganisasjonsnummer.js +1 -1
- package/build/es/utilities/formatters/telefonnummer/formatTelefonnummer.js +1 -1
- package/build/es/utilities/formatters/valuta/formatValuta.js +1 -1
- package/build/es/utilities/index.js +1 -1
- package/build/es/utilities/types.d.ts +13 -1
- package/build/es/utilities/types.js +1 -1
- package/build/es/utilities/types.js.map +1 -1
- package/build/{index-CWRMnfcx.js → index-C1iqmqvT.js} +2 -2
- package/build/{index-CWRMnfcx.js.map → index-C1iqmqvT.js.map} +1 -1
- package/build/{utils-CcE6HjQp.js → utils-CtwpNW4I.js} +2 -2
- package/build/{utils-CcE6HjQp.js.map → utils-CtwpNW4I.js.map} +1 -1
- package/codemods/CODEMODS.md +133 -0
- package/codemods/__tests__/import-paths.test.mjs +568 -94
- package/codemods/import-paths.mjs +34 -339
- package/codemods/transforms/color-tokens.mjs +102 -0
- package/codemods/transforms/expandable-panel.mjs +41 -0
- package/codemods/transforms/font-family.mjs +23 -0
- package/codemods/transforms/import-specifiers.mjs +226 -0
- package/codemods/transforms/warnings.mjs +41 -0
- package/codemods/utils.mjs +35 -0
- package/package.json +8 -4
- package/styles/base.css +183 -805
- package/styles/base.min.css +1 -1
- package/styles/components/autosuggest/autosuggest.css +4 -3
- package/styles/components/autosuggest/autosuggest.min.css +1 -1
- package/styles/components/autosuggest/autosuggest.scss +4 -3
- package/styles/components/breadcrumb/breadcrumb.css +0 -1
- package/styles/components/breadcrumb/breadcrumb.min.css +1 -1
- package/styles/components/breadcrumb/breadcrumb.scss +0 -1
- package/styles/components/button/button.css +9 -4
- package/styles/components/button/button.min.css +1 -1
- package/styles/components/button/button.scss +11 -5
- package/styles/components/checkbox/checkbox.css +1 -1
- package/styles/components/checkbox/checkbox.min.css +1 -1
- package/styles/components/checkbox/checkbox.scss +1 -1
- package/styles/components/checkbox-panel/checkbox-panel.css +1 -1
- package/styles/components/checkbox-panel/checkbox-panel.min.css +1 -1
- package/styles/components/chip/chip.css +0 -1
- package/styles/components/chip/chip.min.css +1 -1
- package/styles/components/chip/chip.scss +0 -1
- package/styles/components/combobox/combobox.css +4 -5
- package/styles/components/combobox/combobox.min.css +1 -1
- package/styles/components/combobox/combobox.scss +4 -5
- package/styles/components/countdown/countdown.css +2 -2
- package/styles/components/countdown/countdown.min.css +1 -1
- package/styles/components/datepicker/_calendar-date-button.scss +0 -2
- package/styles/components/datepicker/datepicker.css +0 -2
- package/styles/components/datepicker/datepicker.min.css +1 -1
- package/styles/components/expander/_index.scss +1 -0
- package/styles/components/expander/accordion.css +21 -0
- package/styles/components/expander/accordion.min.css +1 -0
- package/styles/components/expander/accordion.scss +24 -0
- package/styles/components/expander/expandable.css +32 -37
- package/styles/components/expander/expandable.min.css +1 -1
- package/styles/components/expander/expandable.scss +27 -36
- package/styles/components/feedback/feedback.css +2 -2
- package/styles/components/feedback/feedback.min.css +1 -1
- package/styles/components/feedback/feedback.scss +0 -1
- package/styles/components/file/file.css +4 -1
- package/styles/components/file/file.min.css +1 -1
- package/styles/components/file/file.scss +5 -1
- package/styles/components/file-input/file-input.css +36 -21
- package/styles/components/file-input/file-input.min.css +1 -1
- package/styles/components/icon/icon.scss +1 -1
- package/styles/components/icon-button/icon-button.css +0 -1
- package/styles/components/icon-button/icon-button.min.css +1 -1
- package/styles/components/icon-button/icon-button.scss +0 -1
- package/styles/components/input-group/input-group.css +2 -2
- package/styles/components/input-group/input-group.min.css +1 -1
- package/styles/components/link/link.css +14 -7
- package/styles/components/link/link.min.css +1 -1
- package/styles/components/link/link.scss +18 -10
- package/styles/components/link-list/link-list.css +7 -2
- package/styles/components/link-list/link-list.min.css +1 -1
- package/styles/components/link-list/link-list.scss +10 -3
- package/styles/components/list/list.css +33 -21
- package/styles/components/list/list.min.css +1 -1
- package/styles/components/list/list.scss +24 -24
- package/styles/components/loader/loader.css +6 -6
- package/styles/components/loader/loader.min.css +1 -1
- package/styles/components/loader/skeleton-loader.css +3 -3
- package/styles/components/loader/skeleton-loader.min.css +1 -1
- package/styles/components/menu/_menu-item.scss +1 -2
- package/styles/components/menu/menu.css +1 -2
- package/styles/components/menu/menu.min.css +1 -1
- package/styles/components/message/message.css +9 -10
- package/styles/components/message/message.min.css +1 -1
- package/styles/components/message/message.scss +7 -8
- package/styles/components/modal/_index.scss +7 -0
- package/styles/components/modal/_overlay.scss +4 -0
- package/styles/components/modal/modal.css +32 -116
- package/styles/components/modal/modal.min.css +1 -1
- package/styles/components/modal/modal.scss +96 -6
- package/styles/components/number-input/_index.scss +2 -0
- package/styles/components/number-input/number-input.css +214 -0
- package/styles/components/number-input/number-input.min.css +1 -0
- package/styles/components/number-input/number-input.scss +115 -0
- package/styles/components/pagination/pagination.css +1 -1
- package/styles/components/pagination/pagination.scss +1 -1
- package/styles/components/progress-bar/progress-bar.css +1 -1
- package/styles/components/progress-bar/progress-bar.min.css +1 -1
- package/styles/components/radio-button/radio-button.css +1 -5
- package/styles/components/radio-button/radio-button.min.css +1 -1
- package/styles/components/radio-button/radio-button.scss +2 -7
- package/styles/components/search/search.css +0 -1
- package/styles/components/search/search.min.css +1 -1
- package/styles/components/search/search.scss +0 -1
- package/styles/components/segmented-control/segmented-control.css +3 -7
- package/styles/components/segmented-control/segmented-control.min.css +1 -1
- package/styles/components/select/select.css +65 -7
- package/styles/components/select/select.min.css +1 -1
- package/styles/components/select/select.scss +129 -18
- package/styles/components/system-message/system-message.css +9 -14
- package/styles/components/system-message/system-message.min.css +1 -1
- package/styles/components/system-message/system-message.scss +113 -121
- package/styles/components/table/_table-pagination.scss +0 -1
- package/styles/components/table/table.css +0 -1
- package/styles/components/table/table.min.css +1 -1
- package/styles/components/tabs/tabs.css +0 -1
- package/styles/components/tabs/tabs.min.css +1 -1
- package/styles/components/tabs/tabs.scss +0 -1
- package/styles/components/tag/tag.css +4 -4
- package/styles/components/tag/tag.min.css +1 -1
- package/styles/components/tag/tag.scss +4 -4
- package/styles/components/toast/toast.css +34 -9
- package/styles/components/toast/toast.min.css +1 -1
- package/styles/components/toast/toast.scss +44 -9
- package/styles/components/toggle-switch/toggle-switch.css +0 -1
- package/styles/components/toggle-switch/toggle-switch.min.css +1 -1
- package/styles/components/toggle-switch/toggle-switch.scss +0 -1
- package/styles/components/typography/text.css +2 -2
- package/styles/components/typography/text.min.css +1 -1
- package/styles/components/typography/text.scss +4 -4
- package/styles/components/typography/title.css +8 -30
- package/styles/components/typography/title.min.css +1 -1
- package/styles/components/typography/title.scss +8 -31
- package/styles/components.css +582 -189
- package/styles/components.min.css +1 -1
- package/styles/components.scss +2 -1
- package/styles/global/_base-class.scss +4 -0
- package/styles/jkl/_convert.scss +15 -6
- package/styles/jkl/_tokens.scss +4 -4
- package/styles/tailwind.css +97 -97
- package/styles/theme/_color-scheme.scss +95 -95
- package/styles/theme/_dynamic-spacing.scss +21 -15
- package/styles/theme/_fonts.scss +3 -12
- package/styles/theme/_index.scss +0 -4
- package/styles/theme/_size.scss +20 -20
- package/styles/theme/_tokens.scss +11 -11
- package/styles/core/utility/_paragraphs.scss +0 -39
- package/styles/theme/brands/dnb/_color-scheme.scss +0 -121
- package/styles/theme/brands/dnb/_fonts.scss +0 -46
- package/styles/theme/brands/dnb/_index.scss +0 -2
- package/styles/theme/brands/eika/_color-scheme.scss +0 -121
- package/styles/theme/brands/eika/_fonts.scss +0 -46
- package/styles/theme/brands/eika/_index.scss +0 -2
- package/styles/theme/brands/fremtind/_color-scheme.scss +0 -121
- package/styles/theme/brands/fremtind/_fonts.scss +0 -30
- package/styles/theme/brands/fremtind/_index.scss +0 -2
- package/styles/theme/brands/sparebank1/_color-scheme.scss +0 -121
- package/styles/theme/brands/sparebank1/_fonts.scss +0 -38
- package/styles/theme/brands/sparebank1/_index.scss +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import test from "node:test";
|
|
2
1
|
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
3
|
import { transformImportPaths } from "../import-paths.mjs";
|
|
4
4
|
|
|
5
5
|
test("migrates core, styles and utilities imports", () => {
|
|
@@ -16,7 +16,9 @@ import type { WithChildren } from "@fremtind/jokul/core";
|
|
|
16
16
|
true,
|
|
17
17
|
);
|
|
18
18
|
assert.equal(
|
|
19
|
-
result.text.includes(
|
|
19
|
+
result.text.includes(
|
|
20
|
+
'import "@fremtind/jokul/styles/components.scss";',
|
|
21
|
+
),
|
|
20
22
|
true,
|
|
21
23
|
);
|
|
22
24
|
assert.equal(
|
|
@@ -58,71 +60,40 @@ test("migrates internal relative core jkl imports", () => {
|
|
|
58
60
|
test("rewrites beta style imports when the beta component is used in the same file", () => {
|
|
59
61
|
const source = `
|
|
60
62
|
import { BETA_Select } from "@fremtind/jokul/select";
|
|
61
|
-
import "@fremtind/jokul/styles/components/select
|
|
63
|
+
import "@fremtind/jokul/styles/components/select";
|
|
62
64
|
`;
|
|
63
65
|
|
|
64
|
-
const result = transformImportPaths(source, "/tmp/
|
|
66
|
+
const result = transformImportPaths(source, "/tmp/MyForm.tsx");
|
|
65
67
|
|
|
66
68
|
assert.equal(
|
|
67
|
-
result.text.includes(
|
|
68
|
-
'@fremtind/jokul/styles/components/beta/select/_index.scss',
|
|
69
|
-
),
|
|
69
|
+
result.text.includes("@fremtind/jokul/styles/components/beta/select"),
|
|
70
70
|
true,
|
|
71
71
|
);
|
|
72
72
|
assert.deepEqual(result.warnings, []);
|
|
73
73
|
});
|
|
74
74
|
|
|
75
|
-
test("warns when beta style
|
|
75
|
+
test("warns when beta style import is ambiguous (no beta identifier in file)", () => {
|
|
76
76
|
const source = `
|
|
77
|
-
import "@fremtind/jokul/styles/components/
|
|
77
|
+
import "@fremtind/jokul/styles/components/select";
|
|
78
78
|
`;
|
|
79
79
|
|
|
80
|
-
const result = transformImportPaths(source, "/tmp/
|
|
80
|
+
const result = transformImportPaths(source, "/tmp/global.scss");
|
|
81
81
|
|
|
82
|
-
assert.equal(result.changed, false);
|
|
83
82
|
assert.equal(result.warnings.length, 1);
|
|
83
|
+
assert.match(result.warnings[0], /Select/);
|
|
84
84
|
});
|
|
85
85
|
|
|
86
|
-
test("removes
|
|
87
|
-
const source = `import "@fremtind/jokul/styles/
|
|
88
|
-
import "@fremtind/jokul/styles/core/core.css";
|
|
86
|
+
test("removes esm webfonts.css import when base or components css is present", () => {
|
|
87
|
+
const source = `import "@fremtind/jokul/styles/base.css";
|
|
89
88
|
import "@fremtind/jokul/styles/fonts/webfonts.css";
|
|
90
89
|
`;
|
|
91
90
|
|
|
92
91
|
const result = transformImportPaths(source, "/tmp/main.tsx");
|
|
93
92
|
|
|
94
|
-
assert.equal(
|
|
95
|
-
result.text.includes("@fremtind/jokul/styles/fonts/webfonts.css"),
|
|
96
|
-
false,
|
|
97
|
-
);
|
|
98
|
-
assert.equal(
|
|
99
|
-
result.text.includes('import "@fremtind/jokul/styles/components.css";'),
|
|
100
|
-
true,
|
|
101
|
-
);
|
|
102
|
-
assert.equal(
|
|
103
|
-
result.text.includes('import "@fremtind/jokul/styles/base.css";'),
|
|
104
|
-
true,
|
|
105
|
-
);
|
|
93
|
+
assert.equal(result.text.includes("webfonts"), false);
|
|
106
94
|
assert.deepEqual(result.warnings, []);
|
|
107
95
|
});
|
|
108
96
|
|
|
109
|
-
test("removes minified webfonts.css imports as well", () => {
|
|
110
|
-
const source = `import "@fremtind/jokul/styles/core/core.min.css";
|
|
111
|
-
import "@fremtind/jokul/styles/fonts/webfonts.min.css";
|
|
112
|
-
`;
|
|
113
|
-
|
|
114
|
-
const result = transformImportPaths(source, "/tmp/main.ts");
|
|
115
|
-
|
|
116
|
-
assert.equal(
|
|
117
|
-
result.text.includes("webfonts"),
|
|
118
|
-
false,
|
|
119
|
-
);
|
|
120
|
-
assert.equal(
|
|
121
|
-
result.text.includes('import "@fremtind/jokul/styles/base.min.css";'),
|
|
122
|
-
true,
|
|
123
|
-
);
|
|
124
|
-
});
|
|
125
|
-
|
|
126
97
|
test("warns when webfonts.css is removed without a base or components import", () => {
|
|
127
98
|
const source = `import "@fremtind/jokul/styles/fonts/webfonts.css";
|
|
128
99
|
`;
|
|
@@ -143,127 +114,574 @@ test("removes css @import of webfonts.css", () => {
|
|
|
143
114
|
|
|
144
115
|
assert.equal(result.text.includes("webfonts"), false);
|
|
145
116
|
assert.equal(
|
|
146
|
-
result.text.includes(
|
|
117
|
+
result.text.includes(
|
|
118
|
+
'@import "@fremtind/jokul/styles/components.css";',
|
|
119
|
+
),
|
|
147
120
|
true,
|
|
148
121
|
);
|
|
149
122
|
assert.deepEqual(result.warnings, []);
|
|
150
123
|
});
|
|
151
124
|
|
|
152
|
-
test("
|
|
153
|
-
const source =
|
|
154
|
-
|
|
155
|
-
.banner {
|
|
156
|
-
background: jkl.$color-granitt;
|
|
157
|
-
color: jkl.$color-snohvit;
|
|
125
|
+
test("renames Fremtind Material Symbols font-family", () => {
|
|
126
|
+
const source = `.icon {
|
|
127
|
+
font-family: "Fremtind Material Symbols", "Fremtind Material Symbols Fallback", sans-serif;
|
|
158
128
|
}
|
|
159
129
|
`;
|
|
160
130
|
|
|
161
|
-
const result = transformImportPaths(source, "/tmp/
|
|
131
|
+
const result = transformImportPaths(source, "/tmp/icons.scss");
|
|
162
132
|
|
|
133
|
+
assert.equal(result.text.includes("Fremtind Material Symbols"), false);
|
|
163
134
|
assert.equal(
|
|
164
|
-
result.
|
|
165
|
-
|
|
135
|
+
result.text.includes(
|
|
136
|
+
'"Jokul Icons", "Jokul Icons Fallback", sans-serif',
|
|
166
137
|
),
|
|
167
138
|
true,
|
|
168
139
|
);
|
|
169
|
-
|
|
140
|
+
assert.equal(result.replacements, 2);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("renames Fremtind Material Symbols inside CSS files too", () => {
|
|
144
|
+
const source = `.icon {
|
|
145
|
+
font-family: 'Fremtind Material Symbols';
|
|
146
|
+
}
|
|
147
|
+
`;
|
|
148
|
+
|
|
149
|
+
const result = transformImportPaths(source, "/tmp/icons.css");
|
|
150
|
+
|
|
151
|
+
assert.equal(result.text.includes("Fremtind Material Symbols"), false);
|
|
152
|
+
assert.equal(result.text.includes("'Jokul Icons'"), true);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("renames CSS background-action token", () => {
|
|
156
|
+
const source = `.btn {
|
|
157
|
+
background: var(--jkl-color-background-action);
|
|
158
|
+
color: var(--jkl-color-text-on-action);
|
|
159
|
+
}
|
|
160
|
+
`;
|
|
161
|
+
|
|
162
|
+
const result = transformImportPaths(source, "/tmp/button.css");
|
|
163
|
+
|
|
164
|
+
assert.equal(result.text.includes("--jkl-color-background-action"), false);
|
|
165
|
+
assert.equal(result.text.includes("--jkl-color-text-on-action"), false);
|
|
166
|
+
assert.equal(result.text.includes("--jkl-color-background-contrast"), true);
|
|
167
|
+
assert.equal(result.text.includes("--jkl-color-text-on-contrast"), true);
|
|
168
|
+
assert.equal(result.changed, true);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
test("renames CSS text-inverted token to text-on-contrast", () => {
|
|
172
|
+
const source = `.inverted {
|
|
173
|
+
color: var(--jkl-color-text-inverted);
|
|
174
|
+
}
|
|
175
|
+
`;
|
|
176
|
+
|
|
177
|
+
const result = transformImportPaths(source, "/tmp/theme.css");
|
|
178
|
+
|
|
179
|
+
assert.equal(result.text.includes("--jkl-color-text-inverted"), false);
|
|
180
|
+
assert.equal(result.text.includes("--jkl-color-text-on-contrast"), true);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
test("renames CSS container-high and container-low tokens", () => {
|
|
184
|
+
const source = `.card-high {
|
|
185
|
+
background: var(--jkl-color-background-container-high);
|
|
186
|
+
}
|
|
187
|
+
.card-low {
|
|
188
|
+
background: var(--jkl-color-background-container-low);
|
|
189
|
+
}
|
|
190
|
+
`;
|
|
191
|
+
|
|
192
|
+
const result = transformImportPaths(source, "/tmp/card.css");
|
|
193
|
+
|
|
170
194
|
assert.equal(
|
|
171
|
-
result.
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
195
|
+
result.text.includes("--jkl-color-background-container-high"),
|
|
196
|
+
false,
|
|
197
|
+
);
|
|
198
|
+
assert.equal(
|
|
199
|
+
result.text.includes("--jkl-color-background-container-low"),
|
|
200
|
+
false,
|
|
201
|
+
);
|
|
202
|
+
assert.equal(
|
|
203
|
+
result.text.split("--jkl-color-background-container").length - 1,
|
|
204
|
+
2,
|
|
205
|
+
"should have two occurrences of the new token",
|
|
175
206
|
);
|
|
176
207
|
});
|
|
177
208
|
|
|
178
|
-
test("
|
|
179
|
-
const source =
|
|
209
|
+
test("renames CSS alert tokens to feedback tokens", () => {
|
|
210
|
+
const source = `.info { background: var(--jkl-color-background-alert-info); }
|
|
211
|
+
.warning { background: var(--jkl-color-background-alert-warning); }
|
|
212
|
+
.error { background: var(--jkl-color-background-alert-error); }
|
|
213
|
+
.success { background: var(--jkl-color-background-alert-success); }
|
|
214
|
+
`;
|
|
180
215
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
216
|
+
const result = transformImportPaths(source, "/tmp/alerts.css");
|
|
217
|
+
|
|
218
|
+
assert.equal(result.text.includes("--jkl-color-background-alert-"), false);
|
|
219
|
+
assert.equal(
|
|
220
|
+
result.text.includes("--jkl-color-info-background-container"),
|
|
221
|
+
true,
|
|
222
|
+
);
|
|
223
|
+
assert.equal(
|
|
224
|
+
result.text.includes("--jkl-color-warning-background-container"),
|
|
225
|
+
true,
|
|
226
|
+
);
|
|
227
|
+
assert.equal(
|
|
228
|
+
result.text.includes("--jkl-color-error-background-container"),
|
|
229
|
+
true,
|
|
230
|
+
);
|
|
231
|
+
assert.equal(
|
|
232
|
+
result.text.includes("--jkl-color-success-background-container"),
|
|
233
|
+
true,
|
|
234
|
+
);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test("warns about removed interactive tokens", () => {
|
|
238
|
+
const source = `.item {
|
|
239
|
+
background: var(--jkl-color-background-interactive);
|
|
240
|
+
color: var(--jkl-color-text-interactive);
|
|
186
241
|
}
|
|
187
242
|
`;
|
|
188
243
|
|
|
189
|
-
const result = transformImportPaths(source, "/tmp/
|
|
244
|
+
const result = transformImportPaths(source, "/tmp/interactive.css");
|
|
190
245
|
|
|
191
246
|
assert.equal(
|
|
192
|
-
result.warnings.some((
|
|
193
|
-
/light-mode-variables/.test(warning),
|
|
194
|
-
),
|
|
247
|
+
result.warnings.some((w) => /interactive/.test(w)),
|
|
195
248
|
true,
|
|
196
249
|
);
|
|
250
|
+
assert.equal(
|
|
251
|
+
result.warnings.filter((w) => /interactive/.test(w)).length,
|
|
252
|
+
1,
|
|
253
|
+
"should produce one warning for both interactive tokens",
|
|
254
|
+
);
|
|
197
255
|
});
|
|
198
256
|
|
|
199
|
-
test("warns about
|
|
200
|
-
const source =
|
|
257
|
+
test("warns about removed text-on-alert tokens", () => {
|
|
258
|
+
const source = `.info { color: var(--jkl-color-text-on-alert-info); }
|
|
259
|
+
`;
|
|
201
260
|
|
|
202
|
-
.
|
|
203
|
-
@include jkl.text-style("body");
|
|
204
|
-
}
|
|
261
|
+
const result = transformImportPaths(source, "/tmp/alerts.css");
|
|
205
262
|
|
|
206
|
-
.
|
|
207
|
-
|
|
208
|
-
|
|
263
|
+
assert.equal(
|
|
264
|
+
result.warnings.some((w) => /text-on-alert/.test(w)),
|
|
265
|
+
true,
|
|
266
|
+
);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test("warns about Card variant prop", () => {
|
|
270
|
+
const source = `<Card variant="outlined">
|
|
271
|
+
<p>Innhold</p>
|
|
272
|
+
</Card>
|
|
209
273
|
`;
|
|
210
274
|
|
|
211
|
-
const result = transformImportPaths(source, "/tmp/
|
|
275
|
+
const result = transformImportPaths(source, "/tmp/MyCard.tsx");
|
|
212
276
|
|
|
213
277
|
assert.equal(
|
|
214
|
-
result.warnings.some((
|
|
215
|
-
/paragraph-large\/medium\/small/.test(warning),
|
|
216
|
-
),
|
|
278
|
+
result.warnings.some((w) => /variant/.test(w) && /Card/.test(w)),
|
|
217
279
|
true,
|
|
218
280
|
);
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
test("warns about Card variant high and low", () => {
|
|
284
|
+
const source = `function Page() {
|
|
285
|
+
return (
|
|
286
|
+
<>
|
|
287
|
+
<Card variant="high">Høy</Card>
|
|
288
|
+
<Card variant="low">Lav</Card>
|
|
289
|
+
</>
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
`;
|
|
293
|
+
|
|
294
|
+
const result = transformImportPaths(source, "/tmp/Page.tsx");
|
|
295
|
+
|
|
219
296
|
assert.equal(
|
|
220
|
-
result.warnings.some((
|
|
297
|
+
result.warnings.some((w) => /variant/.test(w)),
|
|
221
298
|
true,
|
|
222
299
|
);
|
|
300
|
+
assert.equal(
|
|
301
|
+
result.warnings.filter((w) => /variant/.test(w)).length,
|
|
302
|
+
1,
|
|
303
|
+
"should produce one warning even with multiple variant usages",
|
|
304
|
+
);
|
|
223
305
|
});
|
|
224
306
|
|
|
225
|
-
test("renames
|
|
226
|
-
const source = `.
|
|
227
|
-
|
|
307
|
+
test("renames container-inverted to background-contrast", () => {
|
|
308
|
+
const source = `.inverted { background: var(--jkl-color-background-container-inverted); }
|
|
309
|
+
`;
|
|
310
|
+
|
|
311
|
+
const result = transformImportPaths(source, "/tmp/inverted.css");
|
|
312
|
+
|
|
313
|
+
assert.equal(
|
|
314
|
+
result.text.includes("--jkl-color-background-container-inverted"),
|
|
315
|
+
false,
|
|
316
|
+
);
|
|
317
|
+
assert.equal(result.text.includes("--jkl-color-background-contrast"), true);
|
|
318
|
+
assert.deepEqual(result.warnings, []);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
// --- idempotency ---
|
|
322
|
+
|
|
323
|
+
test("is idempotent — running twice gives same result", () => {
|
|
324
|
+
const source = `import "@fremtind/jokul/styles/core/core.scss";
|
|
325
|
+
|
|
326
|
+
.btn { background: var(--jkl-color-background-action); }
|
|
327
|
+
`;
|
|
328
|
+
|
|
329
|
+
const first = transformImportPaths(source, "/tmp/page.scss");
|
|
330
|
+
const second = transformImportPaths(first.text, "/tmp/page.scss");
|
|
331
|
+
|
|
332
|
+
assert.equal(second.changed, false);
|
|
333
|
+
assert.equal(second.replacements, 0);
|
|
334
|
+
assert.equal(second.text, first.text);
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// --- no-op ---
|
|
338
|
+
|
|
339
|
+
test("returns changed: false for an already-migrated file", () => {
|
|
340
|
+
const source = `import "@fremtind/jokul/styles/base.scss";
|
|
341
|
+
|
|
342
|
+
.btn { background: var(--jkl-color-background-contrast); }
|
|
343
|
+
`;
|
|
344
|
+
|
|
345
|
+
const result = transformImportPaths(source, "/tmp/page.ts");
|
|
346
|
+
|
|
347
|
+
assert.equal(result.changed, false);
|
|
348
|
+
assert.equal(result.replacements, 0);
|
|
349
|
+
assert.deepEqual(result.warnings, []);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
// --- token boundary safety ---
|
|
353
|
+
|
|
354
|
+
test("does not rename token that is a prefix of a longer token", () => {
|
|
355
|
+
// --jkl-color-text-inverted should not match inside --jkl-color-text-inverted-extra
|
|
356
|
+
const source = ".x { color: var(--jkl-color-text-inverted-extra); }";
|
|
357
|
+
|
|
358
|
+
const result = transformImportPaths(source, "/tmp/x.css");
|
|
359
|
+
|
|
360
|
+
assert.equal(result.text.includes("--jkl-color-text-inverted-extra"), true);
|
|
361
|
+
assert.equal(result.changed, false);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
test("does not rename --jkl-color-background-container (base token, not a v4 token)", () => {
|
|
365
|
+
const source = ".x { background: var(--jkl-color-background-container); }";
|
|
366
|
+
|
|
367
|
+
const result = transformImportPaths(source, "/tmp/x.css");
|
|
368
|
+
|
|
369
|
+
assert.equal(result.text, source);
|
|
370
|
+
assert.equal(result.changed, false);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
test("renames container-high but leaves sibling container-low and base container intact in same rule", () => {
|
|
374
|
+
const source = `.x {
|
|
375
|
+
--high: var(--jkl-color-background-container-high);
|
|
376
|
+
--low: var(--jkl-color-background-container-low);
|
|
377
|
+
--base: var(--jkl-color-background-container);
|
|
228
378
|
}
|
|
229
379
|
`;
|
|
230
380
|
|
|
231
|
-
const result = transformImportPaths(source, "/tmp/
|
|
381
|
+
const result = transformImportPaths(source, "/tmp/x.css");
|
|
232
382
|
|
|
233
383
|
assert.equal(
|
|
234
|
-
result.text.includes("
|
|
384
|
+
result.text.includes("--jkl-color-background-container-high"),
|
|
235
385
|
false,
|
|
236
386
|
);
|
|
237
387
|
assert.equal(
|
|
238
|
-
result.text.includes(
|
|
239
|
-
|
|
240
|
-
|
|
388
|
+
result.text.includes("--jkl-color-background-container-low"),
|
|
389
|
+
false,
|
|
390
|
+
);
|
|
391
|
+
assert.equal(
|
|
392
|
+
result.text.includes("var(--jkl-color-background-container)"),
|
|
241
393
|
true,
|
|
394
|
+
"base container token must survive unchanged",
|
|
242
395
|
);
|
|
243
396
|
assert.equal(result.replacements, 2);
|
|
244
397
|
});
|
|
245
398
|
|
|
246
|
-
test("
|
|
399
|
+
test("does not rename alert-info token that has a longer suffix", () => {
|
|
400
|
+
const source =
|
|
401
|
+
".x { background: var(--jkl-color-background-alert-info-extra); }";
|
|
402
|
+
|
|
403
|
+
const result = transformImportPaths(source, "/tmp/x.css");
|
|
404
|
+
|
|
405
|
+
assert.equal(result.changed, false);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
// --- CSS token as custom property definition ---
|
|
409
|
+
|
|
410
|
+
test("renames token used as a custom property definition, not just inside var()", () => {
|
|
411
|
+
const source = `:root {
|
|
412
|
+
--jkl-color-background-action: #005aa4;
|
|
413
|
+
--jkl-color-text-inverted: #fff;
|
|
414
|
+
}
|
|
415
|
+
`;
|
|
416
|
+
|
|
417
|
+
const result = transformImportPaths(source, "/tmp/overrides.css");
|
|
418
|
+
|
|
419
|
+
assert.equal(result.text.includes("--jkl-color-background-action:"), false);
|
|
420
|
+
assert.equal(result.text.includes("--jkl-color-text-inverted:"), false);
|
|
421
|
+
assert.equal(
|
|
422
|
+
result.text.includes("--jkl-color-background-contrast:"),
|
|
423
|
+
true,
|
|
424
|
+
);
|
|
425
|
+
assert.equal(result.text.includes("--jkl-color-text-on-contrast:"), true);
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// --- webfonts edge cases ---
|
|
429
|
+
|
|
430
|
+
test("removes webfonts.min.css import", () => {
|
|
431
|
+
const source = `import "@fremtind/jokul/styles/base.css";
|
|
432
|
+
import "@fremtind/jokul/styles/fonts/webfonts.min.css";
|
|
433
|
+
`;
|
|
434
|
+
|
|
435
|
+
const result = transformImportPaths(source, "/tmp/main.tsx");
|
|
436
|
+
|
|
437
|
+
assert.equal(result.text.includes("webfonts"), false);
|
|
438
|
+
assert.deepEqual(result.warnings, []);
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
test("removes webfonts.css when imported with require()", () => {
|
|
442
|
+
const source = `require("@fremtind/jokul/styles/base.css");
|
|
443
|
+
require("@fremtind/jokul/styles/fonts/webfonts.css");
|
|
444
|
+
`;
|
|
445
|
+
|
|
446
|
+
const result = transformImportPaths(source, "/tmp/main.cjs");
|
|
447
|
+
|
|
448
|
+
assert.equal(result.text.includes("webfonts"), false);
|
|
449
|
+
assert.deepEqual(result.warnings, []);
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
// --- font family edge cases ---
|
|
453
|
+
|
|
454
|
+
test("renames only the fallback font-family if primary is absent", () => {
|
|
247
455
|
const source = `.icon {
|
|
248
|
-
font-family:
|
|
456
|
+
font-family: "Fremtind Material Symbols Fallback";
|
|
249
457
|
}
|
|
250
458
|
`;
|
|
251
459
|
|
|
252
460
|
const result = transformImportPaths(source, "/tmp/icons.css");
|
|
253
461
|
|
|
254
462
|
assert.equal(
|
|
255
|
-
result.text.includes("Fremtind Material Symbols"),
|
|
463
|
+
result.text.includes("Fremtind Material Symbols Fallback"),
|
|
256
464
|
false,
|
|
257
465
|
);
|
|
258
|
-
assert.equal(result.text.includes("
|
|
466
|
+
assert.equal(result.text.includes("Jokul Icons Fallback"), true);
|
|
467
|
+
assert.equal(result.replacements, 1);
|
|
259
468
|
});
|
|
260
469
|
|
|
470
|
+
// --- combined transforms ---
|
|
471
|
+
|
|
472
|
+
test("applies import path and token rename in one pass", () => {
|
|
473
|
+
const source = `import "@fremtind/jokul/styles/core/core.scss";
|
|
474
|
+
|
|
475
|
+
.inverted {
|
|
476
|
+
background: var(--jkl-color-background-action);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export default function Page() {
|
|
480
|
+
return <section />;
|
|
481
|
+
}
|
|
482
|
+
`;
|
|
483
|
+
|
|
484
|
+
const result = transformImportPaths(source, "/tmp/page.tsx");
|
|
485
|
+
|
|
486
|
+
assert.equal(result.text.includes("styles/core/core"), false);
|
|
487
|
+
assert.equal(result.text.includes("--jkl-color-background-action"), false);
|
|
488
|
+
assert.equal(result.text.includes("styles/base.scss"), true);
|
|
489
|
+
assert.equal(result.text.includes("--jkl-color-background-contrast"), true);
|
|
490
|
+
assert.equal(result.replacements, 2);
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
// --- SCSS-only transforms ---
|
|
494
|
+
|
|
495
|
+
test("does not reorder font import in a .css file", () => {
|
|
496
|
+
const source = `@import "@fremtind/jokul/styles/base.css";
|
|
497
|
+
@import "@fremtind/jokul/styles/theme/fonts";
|
|
498
|
+
`;
|
|
499
|
+
|
|
500
|
+
const result = transformImportPaths(source, "/tmp/global.css");
|
|
501
|
+
|
|
502
|
+
assert.equal(result.reordered, false);
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
// --- Tailwind color class renames ---
|
|
506
|
+
|
|
507
|
+
test("renames bg-background-action to bg-background-contrast", () => {
|
|
508
|
+
const source = `<div className="bg-background-action text-white">Innhold</div>`;
|
|
509
|
+
|
|
510
|
+
const result = transformImportPaths(source, "/tmp/component.tsx");
|
|
511
|
+
|
|
512
|
+
assert.equal(result.text.includes("bg-background-action"), false);
|
|
513
|
+
assert.equal(result.text.includes("bg-background-contrast"), true);
|
|
514
|
+
assert.equal(result.replacements, 1);
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
test("renames text-text-inverted to text-text-on-contrast", () => {
|
|
518
|
+
const source = `<p className="text-text-inverted">Tekst</p>`;
|
|
519
|
+
|
|
520
|
+
const result = transformImportPaths(source, "/tmp/page.tsx");
|
|
521
|
+
|
|
522
|
+
assert.equal(result.text.includes("text-text-inverted"), false);
|
|
523
|
+
assert.equal(result.text.includes("text-text-on-contrast"), true);
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
test("renames text-text-on-action to text-text-on-contrast", () => {
|
|
527
|
+
const source = `<button className="bg-background-contrast text-text-on-action">Knapp</button>`;
|
|
528
|
+
|
|
529
|
+
const result = transformImportPaths(source, "/tmp/button.tsx");
|
|
530
|
+
|
|
531
|
+
assert.equal(result.text.includes("text-text-on-action"), false);
|
|
532
|
+
assert.equal(result.text.includes("text-text-on-contrast"), true);
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
test("renames bg-background-container-high and -low", () => {
|
|
536
|
+
const source = `<div className="bg-background-container-high md:bg-background-container-low">
|
|
537
|
+
Innhold
|
|
538
|
+
</div>`;
|
|
539
|
+
|
|
540
|
+
const result = transformImportPaths(source, "/tmp/card.tsx");
|
|
541
|
+
|
|
542
|
+
assert.equal(result.text.includes("bg-background-container-high"), false);
|
|
543
|
+
assert.equal(result.text.includes("bg-background-container-low"), false);
|
|
544
|
+
assert.equal(result.text.includes("bg-background-container"), true);
|
|
545
|
+
assert.equal(result.replacements, 2);
|
|
546
|
+
});
|
|
547
|
+
|
|
548
|
+
test("does not rename bg-background-container (base Tailwind class)", () => {
|
|
549
|
+
const source = `<div className="bg-background-container">Innhold</div>`;
|
|
550
|
+
|
|
551
|
+
const result = transformImportPaths(source, "/tmp/card.tsx");
|
|
552
|
+
|
|
553
|
+
assert.equal(result.text, source);
|
|
554
|
+
assert.equal(result.changed, false);
|
|
555
|
+
});
|
|
556
|
+
|
|
557
|
+
test("renames bg-background-alert-info to bg-info-background-container", () => {
|
|
558
|
+
const source = `<div className="bg-background-alert-info border-border-subdued">
|
|
559
|
+
Info
|
|
560
|
+
</div>`;
|
|
561
|
+
|
|
562
|
+
const result = transformImportPaths(source, "/tmp/alert.tsx");
|
|
563
|
+
|
|
564
|
+
assert.equal(result.text.includes("bg-background-alert-info"), false);
|
|
565
|
+
assert.equal(result.text.includes("bg-info-background-container"), true);
|
|
566
|
+
assert.equal(result.replacements, 1);
|
|
567
|
+
});
|
|
568
|
+
|
|
569
|
+
test("renames all four alert color classes", () => {
|
|
570
|
+
const source = `className="bg-background-alert-info bg-background-alert-warning bg-background-alert-error bg-background-alert-success"`;
|
|
571
|
+
|
|
572
|
+
const result = transformImportPaths(source, "/tmp/alerts.tsx");
|
|
573
|
+
|
|
574
|
+
assert.equal(result.text.includes("bg-background-alert-"), false);
|
|
575
|
+
assert.equal(result.text.includes("bg-info-background-container"), true);
|
|
576
|
+
assert.equal(result.text.includes("bg-warning-background-container"), true);
|
|
577
|
+
assert.equal(result.text.includes("bg-error-background-container"), true);
|
|
578
|
+
assert.equal(result.text.includes("bg-success-background-container"), true);
|
|
579
|
+
assert.equal(result.replacements, 4);
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
test("renames Tailwind class with hover: modifier", () => {
|
|
583
|
+
const source = `<div className="hover:bg-background-action focus:bg-background-action">X</div>`;
|
|
584
|
+
|
|
585
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
586
|
+
|
|
587
|
+
assert.equal(result.text.includes("bg-background-action"), false);
|
|
588
|
+
assert.equal(result.text.includes("hover:bg-background-contrast"), true);
|
|
589
|
+
assert.equal(result.text.includes("focus:bg-background-contrast"), true);
|
|
590
|
+
assert.equal(result.replacements, 2);
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
test("renames Tailwind class with opacity modifier (/50)", () => {
|
|
594
|
+
const source = `<div className="bg-background-action/50">X</div>`;
|
|
595
|
+
|
|
596
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
597
|
+
|
|
598
|
+
assert.equal(result.text.includes("bg-background-action/50"), false);
|
|
599
|
+
assert.equal(result.text.includes("bg-background-contrast/50"), true);
|
|
600
|
+
assert.equal(result.replacements, 1);
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
test("renames Tailwind class in @apply rule", () => {
|
|
604
|
+
const source = `.btn {
|
|
605
|
+
@apply bg-background-action text-text-inverted;
|
|
606
|
+
}
|
|
607
|
+
`;
|
|
608
|
+
|
|
609
|
+
const result = transformImportPaths(source, "/tmp/styles.css");
|
|
610
|
+
|
|
611
|
+
assert.equal(result.text.includes("bg-background-action"), false);
|
|
612
|
+
assert.equal(result.text.includes("text-text-inverted"), false);
|
|
613
|
+
assert.equal(result.text.includes("bg-background-contrast"), true);
|
|
614
|
+
assert.equal(result.text.includes("text-text-on-contrast"), true);
|
|
615
|
+
assert.equal(result.replacements, 2);
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
test("renames non-bg prefix: border-background-action", () => {
|
|
619
|
+
const source = `<div className="border-background-action">X</div>`;
|
|
620
|
+
|
|
621
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
622
|
+
|
|
623
|
+
assert.equal(result.text.includes("border-background-action"), false);
|
|
624
|
+
assert.equal(result.text.includes("border-background-contrast"), true);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
test("does not rename longer Tailwind class that shares a prefix", () => {
|
|
628
|
+
// bg-background-container-inverted-extra must not match bg-background-container-inverted
|
|
629
|
+
const source = `<div className="bg-background-container-inverted-extra">X</div>`;
|
|
630
|
+
|
|
631
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
632
|
+
|
|
633
|
+
assert.equal(result.text, source);
|
|
634
|
+
assert.equal(result.changed, false);
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
test("Tailwind renames are idempotent", () => {
|
|
638
|
+
const source = `<div className="bg-background-contrast text-text-on-contrast">X</div>`;
|
|
639
|
+
|
|
640
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
641
|
+
|
|
642
|
+
assert.equal(result.changed, false);
|
|
643
|
+
assert.equal(result.replacements, 0);
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
// --- Tailwind warnings ---
|
|
647
|
+
|
|
648
|
+
test("warns about bg-background-interactive Tailwind class", () => {
|
|
649
|
+
const source = `<div className="bg-background-interactive hover:bg-background-interactive-hover">X</div>`;
|
|
650
|
+
|
|
651
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
652
|
+
|
|
653
|
+
assert.equal(
|
|
654
|
+
result.warnings.some((w) => /background-interactive/.test(w)),
|
|
655
|
+
true,
|
|
656
|
+
);
|
|
657
|
+
assert.equal(
|
|
658
|
+
result.warnings.filter((w) => /background-interactive/.test(w)).length,
|
|
659
|
+
1,
|
|
660
|
+
);
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
test("warns about border-border-separator Tailwind class", () => {
|
|
664
|
+
const source = `<div className="border border-border-separator">X</div>`;
|
|
665
|
+
|
|
666
|
+
const result = transformImportPaths(source, "/tmp/cmp.tsx");
|
|
667
|
+
|
|
668
|
+
assert.equal(
|
|
669
|
+
result.warnings.some(
|
|
670
|
+
(w) => /border-border-separator/.test(w) || /kantklasser/.test(w),
|
|
671
|
+
),
|
|
672
|
+
true,
|
|
673
|
+
);
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
// --- does not warn about valid 5.0 patterns ---
|
|
677
|
+
|
|
261
678
|
test("does not warn about valid 5.0 patterns", () => {
|
|
262
679
|
const source = `@use "@fremtind/jokul/styles/jkl";
|
|
263
680
|
|
|
264
681
|
.title {
|
|
265
682
|
@include jkl.text-style("heading-1");
|
|
266
683
|
color: var(--jkl-color-text-default);
|
|
684
|
+
background: var(--jkl-color-background-contrast);
|
|
267
685
|
}
|
|
268
686
|
`;
|
|
269
687
|
|
|
@@ -271,3 +689,59 @@ test("does not warn about valid 5.0 patterns", () => {
|
|
|
271
689
|
|
|
272
690
|
assert.deepEqual(result.warnings, []);
|
|
273
691
|
});
|
|
692
|
+
|
|
693
|
+
test('ExpandablePanel: fjerner variant="fill" prop (fill er nå default)', () => {
|
|
694
|
+
const source = `<ExpandablePanel variant="fill" open={open}>`;
|
|
695
|
+
const result = transformImportPaths(source, "/tmp/MyPage.tsx");
|
|
696
|
+
assert.equal(result.text, "<ExpandablePanel open={open}>");
|
|
697
|
+
assert.equal(result.changed, true);
|
|
698
|
+
});
|
|
699
|
+
|
|
700
|
+
test("ExpandablePanel: fjerner variant={'fill'} prop", () => {
|
|
701
|
+
const source = `<ExpandablePanel variant={'fill'}>`;
|
|
702
|
+
const result = transformImportPaths(source, "/tmp/MyPage.tsx");
|
|
703
|
+
assert.equal(result.text, "<ExpandablePanel>");
|
|
704
|
+
assert.equal(result.changed, true);
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
test('ExpandablePanel: endrer variant="stroke" til outlined', () => {
|
|
708
|
+
const source = `<ExpandablePanel variant="stroke" className="my-panel">`;
|
|
709
|
+
const result = transformImportPaths(source, "/tmp/MyPage.tsx");
|
|
710
|
+
assert.equal(
|
|
711
|
+
result.text,
|
|
712
|
+
`<ExpandablePanel outlined className="my-panel">`,
|
|
713
|
+
);
|
|
714
|
+
assert.equal(result.changed, true);
|
|
715
|
+
});
|
|
716
|
+
|
|
717
|
+
test("ExpandablePanel: endrer variant={'stroke'} til outlined", () => {
|
|
718
|
+
const source = `<ExpandablePanel variant={'stroke'}>`;
|
|
719
|
+
const result = transformImportPaths(source, "/tmp/MyPage.tsx");
|
|
720
|
+
assert.equal(result.text, "<ExpandablePanel outlined>");
|
|
721
|
+
assert.equal(result.changed, true);
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
test("ExpandablePanel: endrer CSS-klasse jkl-expandable--stroke til jkl-expandable-panel--outlined", () => {
|
|
725
|
+
const source = ".jkl-expandable--stroke { border-color: red; }";
|
|
726
|
+
const result = transformImportPaths(source, "/tmp/custom.scss");
|
|
727
|
+
assert.equal(
|
|
728
|
+
result.text,
|
|
729
|
+
".jkl-expandable-panel--outlined { border-color: red; }",
|
|
730
|
+
);
|
|
731
|
+
assert.equal(result.changed, true);
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
test("ExpandablePanel: håndterer flerlinjet JSX korrekt", () => {
|
|
735
|
+
const source = `<ExpandablePanel
|
|
736
|
+
variant="fill"
|
|
737
|
+
open={open}
|
|
738
|
+
>`;
|
|
739
|
+
const result = transformImportPaths(source, "/tmp/MyPage.tsx");
|
|
740
|
+
assert.equal(
|
|
741
|
+
result.text,
|
|
742
|
+
`<ExpandablePanel
|
|
743
|
+
open={open}
|
|
744
|
+
>`,
|
|
745
|
+
);
|
|
746
|
+
assert.equal(result.changed, true);
|
|
747
|
+
});
|