@dialpad/dialtone-css 8.80.0-next.1 → 8.80.0-next.3
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/lib/build/js/dialtone_migrate_link_rendering/button-nav-test-examples.vue +92 -0
- package/lib/build/js/dialtone_migrate_link_rendering/button-nav.test.mjs +272 -0
- package/lib/build/js/dialtone_migrate_link_rendering/helpers.mjs +25 -0
- package/lib/build/js/dialtone_migrate_link_rendering/index.mjs +1041 -0
- package/lib/build/js/dialtone_migrate_link_rendering/link-nav-test-examples.vue +97 -0
- package/lib/build/js/dialtone_migrate_link_rendering/link-nav.test.mjs +194 -0
- package/lib/build/js/dialtone_migrate_link_rendering/underline-test-examples.vue +57 -0
- package/lib/build/js/dialtone_migrate_link_rendering/underline.test.mjs +161 -0
- package/lib/build/js/dialtone_migrate_props/index.mjs +794 -0
- package/lib/build/js/dialtone_migrate_props/test.mjs +959 -0
- package/lib/build/js/dialtone_migration_helper/configs/base-to-semantic.mjs +8 -8
- package/lib/build/js/dialtone_migration_helper/configs/size-to-layout.mjs +10 -0
- package/lib/build/js/dialtone_migration_helper/configs/success-to-positive.mjs +73 -0
- package/lib/build/js/dialtone_migration_helper/configs/utility-class-to-token-stops.mjs +92 -12
- package/lib/build/js/dialtone_migration_helper/tests/base-to-semantic-test-examples.vue +10 -10
- package/lib/build/js/dialtone_migration_helper/tests/base-to-semantic.test.mjs +8 -8
- package/lib/build/js/dialtone_migration_helper/tests/size-to-layout-test-examples.vue +16 -0
- package/lib/build/js/dialtone_migration_helper/tests/size-to-layout.test.mjs +87 -0
- package/lib/build/js/dialtone_migration_helper/tests/success-to-positive-test-examples.vue +166 -0
- package/lib/build/js/dialtone_migration_helper/tests/success-to-positive.test.mjs +287 -0
- package/lib/build/js/dialtone_migration_helper/tests/utility-class-to-token-stops-radius-examples.vue +66 -0
- package/lib/build/js/dialtone_migration_helper/tests/utility-class-to-token-stops.test.mjs +170 -0
- package/lib/build/less/components/badge.less +1 -1
- package/lib/build/less/components/banner.less +1 -1
- package/lib/build/less/components/box.less +228 -0
- package/lib/build/less/components/description-list.less +4 -0
- package/lib/build/less/components/forms.less +4 -2
- package/lib/build/less/components/input.less +2 -2
- package/lib/build/less/components/link.less +18 -4
- package/lib/build/less/components/modal.less +1 -1
- package/lib/build/less/components/notice.less +3 -3
- package/lib/build/less/components/progress_circle.less +10 -2
- package/lib/build/less/components/prose.less +512 -0
- package/lib/build/less/components/rich-text-editor.less +7 -0
- package/lib/build/less/components/selects.less +1 -1
- package/lib/build/less/components/text.less +2 -2
- package/lib/build/less/components/toast.less +1 -1
- package/lib/build/less/dialtone.less +2 -0
- package/lib/build/less/recipes/leftbar_row.less +1 -0
- package/lib/build/less/recipes/settings_menu_button.less +1 -1
- package/lib/build/less/recipes/top_banner_info.less +1 -1
- package/lib/build/less/utilities/backgrounds.less +12 -0
- package/lib/build/less/utilities/borders.less +56 -89
- package/lib/build/less/utilities/colors.less +8 -0
- package/lib/build/less/utilities/effects.less +1 -0
- package/lib/build/less/utilities/flex.less +145 -18
- package/lib/build/less/utilities/grid.less +40 -152
- package/lib/build/less/utilities/layout.less +19 -7
- package/lib/build/less/utilities/sizing.less +148 -143
- package/lib/build/less/variables/visual-styles.less +2 -1
- package/lib/dist/dialtone-default-theme.css +4364 -1756
- package/lib/dist/dialtone-default-theme.min.css +1 -1
- package/lib/dist/dialtone-docs.json +1 -1
- package/lib/dist/dialtone.css +4271 -1705
- package/lib/dist/dialtone.min.css +1 -1
- package/lib/dist/js/dialtone_migrate_link_rendering/button-nav-test-examples.vue +92 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/button-nav.test.mjs +272 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/helpers.mjs +25 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/index.mjs +1041 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/link-nav-test-examples.vue +97 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/link-nav.test.mjs +194 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/underline-test-examples.vue +57 -0
- package/lib/dist/js/dialtone_migrate_link_rendering/underline.test.mjs +161 -0
- package/lib/dist/js/dialtone_migrate_props/index.mjs +794 -0
- package/lib/dist/js/dialtone_migrate_props/test.mjs +959 -0
- package/lib/dist/js/dialtone_migration_helper/configs/base-to-semantic.mjs +8 -8
- package/lib/dist/js/dialtone_migration_helper/configs/size-to-layout.mjs +10 -0
- package/lib/dist/js/dialtone_migration_helper/configs/success-to-positive.mjs +73 -0
- package/lib/dist/js/dialtone_migration_helper/configs/utility-class-to-token-stops.mjs +92 -12
- package/lib/dist/js/dialtone_migration_helper/tests/base-to-semantic-test-examples.vue +10 -10
- package/lib/dist/js/dialtone_migration_helper/tests/base-to-semantic.test.mjs +8 -8
- package/lib/dist/js/dialtone_migration_helper/tests/size-to-layout-test-examples.vue +16 -0
- package/lib/dist/js/dialtone_migration_helper/tests/size-to-layout.test.mjs +87 -0
- package/lib/dist/js/dialtone_migration_helper/tests/success-to-positive-test-examples.vue +166 -0
- package/lib/dist/js/dialtone_migration_helper/tests/success-to-positive.test.mjs +287 -0
- package/lib/dist/js/dialtone_migration_helper/tests/utility-class-to-token-stops-radius-examples.vue +66 -0
- package/lib/dist/js/dialtone_migration_helper/tests/utility-class-to-token-stops.test.mjs +170 -0
- package/lib/dist/tokens/tokens-101-dark.css +81 -45
- package/lib/dist/tokens/tokens-101-light.css +75 -39
- package/lib/dist/tokens/tokens-102-dark.css +81 -45
- package/lib/dist/tokens/tokens-102-light.css +75 -39
- package/lib/dist/tokens/tokens-103-dark.css +81 -45
- package/lib/dist/tokens/tokens-103-light.css +75 -39
- package/lib/dist/tokens/tokens-104-dark.css +81 -45
- package/lib/dist/tokens/tokens-104-light.css +75 -39
- package/lib/dist/tokens/tokens-105-dark.css +81 -45
- package/lib/dist/tokens/tokens-105-light.css +75 -39
- package/lib/dist/tokens/tokens-106-dark.css +81 -45
- package/lib/dist/tokens/tokens-106-light.css +75 -39
- package/lib/dist/tokens/tokens-107-dark.css +81 -45
- package/lib/dist/tokens/tokens-107-light.css +75 -39
- package/lib/dist/tokens/tokens-108-dark.css +81 -45
- package/lib/dist/tokens/tokens-108-light.css +75 -39
- package/lib/dist/tokens/tokens-109-dark.css +81 -45
- package/lib/dist/tokens/tokens-109-light.css +75 -39
- package/lib/dist/tokens/tokens-110-dark.css +81 -45
- package/lib/dist/tokens/tokens-110-light.css +75 -39
- package/lib/dist/tokens/tokens-111-dark.css +81 -45
- package/lib/dist/tokens/tokens-111-light.css +75 -39
- package/lib/dist/tokens/tokens-112-dark.css +81 -45
- package/lib/dist/tokens/tokens-112-light.css +75 -39
- package/lib/dist/tokens/tokens-113-dark.css +81 -45
- package/lib/dist/tokens/tokens-113-light.css +75 -39
- package/lib/dist/tokens/tokens-114-dark.css +81 -45
- package/lib/dist/tokens/tokens-114-light.css +75 -39
- package/lib/dist/tokens/tokens-115-dark.css +81 -45
- package/lib/dist/tokens/tokens-115-light.css +75 -39
- package/lib/dist/tokens/tokens-116-dark.css +81 -45
- package/lib/dist/tokens/tokens-116-light.css +75 -39
- package/lib/dist/tokens/tokens-117-dark.css +81 -45
- package/lib/dist/tokens/tokens-117-light.css +75 -39
- package/lib/dist/tokens/tokens-118-dark.css +81 -45
- package/lib/dist/tokens/tokens-118-light.css +75 -39
- package/lib/dist/tokens/tokens-119-dark.css +81 -45
- package/lib/dist/tokens/tokens-119-light.css +75 -39
- package/lib/dist/tokens/tokens-120-dark.css +81 -45
- package/lib/dist/tokens/tokens-120-light.css +75 -39
- package/lib/dist/tokens/tokens-121-dark.css +81 -45
- package/lib/dist/tokens/tokens-121-light.css +75 -39
- package/lib/dist/tokens/tokens-122-dark.css +81 -45
- package/lib/dist/tokens/tokens-122-light.css +75 -39
- package/lib/dist/tokens/tokens-123-dark.css +81 -45
- package/lib/dist/tokens/tokens-123-light.css +75 -39
- package/lib/dist/tokens/tokens-124-dark.css +81 -45
- package/lib/dist/tokens/tokens-124-light.css +75 -39
- package/lib/dist/tokens/tokens-125-dark.css +81 -45
- package/lib/dist/tokens/tokens-125-light.css +75 -39
- package/lib/dist/tokens/tokens-126-dark.css +81 -45
- package/lib/dist/tokens/tokens-126-light.css +75 -39
- package/lib/dist/tokens/tokens-127-dark.css +81 -45
- package/lib/dist/tokens/tokens-127-light.css +75 -39
- package/lib/dist/tokens/tokens-128-dark.css +81 -45
- package/lib/dist/tokens/tokens-128-light.css +75 -39
- package/lib/dist/tokens/tokens-129-dark.css +81 -45
- package/lib/dist/tokens/tokens-129-light.css +75 -39
- package/lib/dist/tokens/tokens-130-dark.css +81 -45
- package/lib/dist/tokens/tokens-130-light.css +75 -39
- package/lib/dist/tokens/tokens-131-dark.css +81 -45
- package/lib/dist/tokens/tokens-131-light.css +75 -39
- package/lib/dist/tokens/tokens-132-dark.css +81 -45
- package/lib/dist/tokens/tokens-132-light.css +75 -39
- package/lib/dist/tokens/tokens-133-dark.css +81 -45
- package/lib/dist/tokens/tokens-133-light.css +75 -39
- package/lib/dist/tokens/tokens-134-dark.css +81 -45
- package/lib/dist/tokens/tokens-134-light.css +75 -39
- package/lib/dist/tokens/tokens-135-dark.css +81 -45
- package/lib/dist/tokens/tokens-135-light.css +75 -39
- package/lib/dist/tokens/tokens-136-dark.css +81 -45
- package/lib/dist/tokens/tokens-136-light.css +75 -39
- package/lib/dist/tokens/tokens-137-dark.css +81 -45
- package/lib/dist/tokens/tokens-137-light.css +75 -39
- package/lib/dist/tokens/tokens-aegean-dark.css +81 -45
- package/lib/dist/tokens/tokens-aegean-light.css +75 -39
- package/lib/dist/tokens/tokens-base-dark.css +18 -12
- package/lib/dist/tokens/tokens-base-light.css +18 -12
- package/lib/dist/tokens/tokens-botany-dark.css +81 -45
- package/lib/dist/tokens/tokens-botany-light.css +75 -39
- package/lib/dist/tokens/tokens-buttercream-dark.css +81 -45
- package/lib/dist/tokens/tokens-buttercream-light.css +75 -39
- package/lib/dist/tokens/tokens-ceruleo-dark.css +81 -45
- package/lib/dist/tokens/tokens-ceruleo-light.css +75 -39
- package/lib/dist/tokens/tokens-debug-base.css +6 -0
- package/lib/dist/tokens/tokens-debug-dp.css +39 -3
- package/lib/dist/tokens/tokens-dp-dark.css +81 -45
- package/lib/dist/tokens/tokens-dp-light.css +75 -39
- package/lib/dist/tokens/tokens-expressive-dark.css +81 -45
- package/lib/dist/tokens/tokens-expressive-light.css +75 -39
- package/lib/dist/tokens/tokens-expressive-sm-dark.css +81 -45
- package/lib/dist/tokens/tokens-expressive-sm-light.css +75 -39
- package/lib/dist/tokens/tokens-high-desert-dark.css +81 -45
- package/lib/dist/tokens/tokens-high-desert-light.css +75 -39
- package/lib/dist/tokens/tokens-melon-dark.css +81 -45
- package/lib/dist/tokens/tokens-melon-light.css +75 -39
- package/lib/dist/tokens/tokens-plum-dark.css +81 -45
- package/lib/dist/tokens/tokens-plum-light.css +75 -39
- package/lib/dist/tokens/tokens-prota-deuter-dark.css +79 -43
- package/lib/dist/tokens/tokens-prota-deuter-light.css +74 -38
- package/lib/dist/tokens/tokens-sunflower-dark.css +81 -45
- package/lib/dist/tokens/tokens-sunflower-light.css +75 -39
- package/lib/dist/tokens/tokens-tmo-dark.css +81 -45
- package/lib/dist/tokens/tokens-tmo-light.css +75 -39
- package/lib/dist/tokens/tokens-trita-dark.css +81 -45
- package/lib/dist/tokens/tokens-trita-light.css +75 -39
- package/lib/dist/tokens/tokens-verdant-haze-dark.css +81 -45
- package/lib/dist/tokens/tokens-verdant-haze-light.css +75 -39
- package/lib/dist/tokens-docs.json +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,959 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Tests for dialtone-migrate-props codemod.
|
|
5
|
+
* Run: node packages/dialtone-css/lib/build/js/dialtone_migrate_props/test.mjs
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import assert from 'node:assert/strict';
|
|
9
|
+
import { describe, it } from 'node:test';
|
|
10
|
+
import { transformContent } from './index.mjs';
|
|
11
|
+
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// DLT-3161 — avatar: clickable → interactive
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
|
|
16
|
+
describe('clickable → interactive (dt-avatar)', () => {
|
|
17
|
+
it('renames clickable prop', () => {
|
|
18
|
+
const input = '<dt-avatar clickable />';
|
|
19
|
+
const { transformed, count } = transformContent(input);
|
|
20
|
+
assert.equal(transformed, '<dt-avatar interactive />');
|
|
21
|
+
assert.equal(count, 1);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('renames :clickable binding', () => {
|
|
25
|
+
const { transformed } = transformContent('<dt-avatar :clickable="true" />');
|
|
26
|
+
assert.equal(transformed, '<dt-avatar :interactive="true" />');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('does not rename clickable on other components', () => {
|
|
30
|
+
const input = '<dt-button clickable />';
|
|
31
|
+
const { transformed, count } = transformContent(input);
|
|
32
|
+
assert.equal(transformed, input);
|
|
33
|
+
assert.equal(count, 0);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('handles PascalCase DtAvatar', () => {
|
|
37
|
+
const { transformed } = transformContent('<DtAvatar :clickable="isClickable" />');
|
|
38
|
+
assert.equal(transformed, '<DtAvatar :interactive="isClickable" />');
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('renames bare boolean clickable on non-self-closing tag', () => {
|
|
42
|
+
const { transformed } = transformContent('<dt-avatar clickable>Profile</dt-avatar>');
|
|
43
|
+
assert.equal(transformed, '<dt-avatar interactive>Profile</dt-avatar>');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// DLT-3282 — show → open (modal, toast, tooltip)
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
describe('show → open (modal, toast, tooltip)', () => {
|
|
52
|
+
it('renames :show on dt-modal', () => {
|
|
53
|
+
const { transformed } = transformContent('<dt-modal :show="isOpen" />');
|
|
54
|
+
assert.equal(transformed, '<dt-modal :open="isOpen" />');
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('renames :show on dt-toast', () => {
|
|
58
|
+
const { transformed } = transformContent('<dt-toast :show="visible" />');
|
|
59
|
+
assert.equal(transformed, '<dt-toast :open="visible" />');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('renames :show on dt-tooltip', () => {
|
|
63
|
+
const { transformed } = transformContent('<dt-tooltip :show="hovered" />');
|
|
64
|
+
assert.equal(transformed, '<dt-tooltip :open="hovered" />');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('renames @update:show event', () => {
|
|
68
|
+
const { transformed } = transformContent('<dt-modal :show="open" @update:show="close" />');
|
|
69
|
+
assert.equal(transformed, '<dt-modal :open="open" @update:open="close" />');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('renames v-model:show', () => {
|
|
73
|
+
const { transformed } = transformContent('<dt-modal v-model:show="isOpen" />');
|
|
74
|
+
assert.equal(transformed, '<dt-modal v-model:open="isOpen" />');
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('does not rename show on non-overlay components', () => {
|
|
78
|
+
const input = '<dt-avatar :show="true" />';
|
|
79
|
+
const { transformed, count } = transformContent(input);
|
|
80
|
+
assert.equal(transformed, input);
|
|
81
|
+
assert.equal(count, 0);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('does not rename show-close when renaming show', () => {
|
|
85
|
+
const input = '<dt-modal :show="isOpen" :show-close="false" />';
|
|
86
|
+
const { transformed } = transformContent(input);
|
|
87
|
+
assert.equal(transformed, '<dt-modal :open="isOpen" :show-close="false" />');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// DLT-3284 — title/titleId → headerText/headerId (banner, notice, toast, modal)
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
describe('title → header-text (banner, notice, toast, modal)', () => {
|
|
96
|
+
it('renames title on dt-banner', () => {
|
|
97
|
+
const { transformed } = transformContent('<dt-banner title="Alert" />');
|
|
98
|
+
assert.equal(transformed, '<dt-banner header-text="Alert" />');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('renames title-id on dt-banner', () => {
|
|
102
|
+
const { transformed } = transformContent('<dt-banner title-id="hdr" />');
|
|
103
|
+
assert.equal(transformed, '<dt-banner header-id="hdr" />');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('renames title on dt-notice', () => {
|
|
107
|
+
const { transformed } = transformContent('<dt-notice title="Info" />');
|
|
108
|
+
assert.equal(transformed, '<dt-notice header-text="Info" />');
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('renames title-id on dt-notice', () => {
|
|
112
|
+
const { transformed } = transformContent('<dt-notice title-id="notice-hdr" />');
|
|
113
|
+
assert.equal(transformed, '<dt-notice header-id="notice-hdr" />');
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('renames title on dt-toast', () => {
|
|
117
|
+
const { transformed } = transformContent('<dt-toast title="Done!" />');
|
|
118
|
+
assert.equal(transformed, '<dt-toast header-text="Done!" />');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('renames title on dt-modal', () => {
|
|
122
|
+
const { transformed } = transformContent('<dt-modal title="Confirm" />');
|
|
123
|
+
assert.equal(transformed, '<dt-modal header-text="Confirm" />');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('renames banner-title on dt-modal', () => {
|
|
127
|
+
const { transformed } = transformContent('<dt-modal banner-title="Warning" />');
|
|
128
|
+
assert.equal(transformed, '<dt-modal banner-header-text="Warning" />');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('renames bound :title on dt-banner', () => {
|
|
132
|
+
const { transformed } = transformContent('<dt-banner :title="alertTitle" />');
|
|
133
|
+
assert.equal(transformed, '<dt-banner :header-text="alertTitle" />');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it('does not rename title on unrelated components', () => {
|
|
137
|
+
const input = '<dt-avatar title="Profile" />';
|
|
138
|
+
const { transformed, count } = transformContent(input);
|
|
139
|
+
assert.equal(transformed, input);
|
|
140
|
+
assert.equal(count, 0);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// DLT-3159 — label-visible → show-label
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
describe('label-visible → show-label', () => {
|
|
149
|
+
it('renames on dt-input', () => {
|
|
150
|
+
const { transformed } = transformContent('<dt-input label-visible="false" />');
|
|
151
|
+
assert.equal(transformed, '<dt-input show-label="false" />');
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('renames on dt-checkbox', () => {
|
|
155
|
+
const { transformed } = transformContent('<dt-checkbox label-visible="true" />');
|
|
156
|
+
assert.equal(transformed, '<dt-checkbox show-label="true" />');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('renames on dt-combobox', () => {
|
|
160
|
+
const { transformed } = transformContent('<dt-combobox :label-visible="showLabel" />');
|
|
161
|
+
assert.equal(transformed, '<dt-combobox :show-label="showLabel" />');
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('renames on dt-toggle', () => {
|
|
165
|
+
const { transformed } = transformContent('<dt-toggle label-visible="false" />');
|
|
166
|
+
assert.equal(transformed, '<dt-toggle show-label="false" />');
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it('renames on dt-select-menu', () => {
|
|
170
|
+
const { transformed } = transformContent('<dt-select-menu label-visible="false" />');
|
|
171
|
+
assert.equal(transformed, '<dt-select-menu show-label="false" />');
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('does not rename on components without this prop', () => {
|
|
175
|
+
const input = '<dt-badge label-visible="false" />';
|
|
176
|
+
const { transformed, count } = transformContent(input);
|
|
177
|
+
assert.equal(transformed, input);
|
|
178
|
+
assert.equal(count, 0);
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// DLT-3159 — Inverted boolean props (hide-X → :show-X="false")
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
describe('hide-close → :show-close="false"', () => {
|
|
187
|
+
it('converts bare boolean hide-close on dt-banner', () => {
|
|
188
|
+
const { transformed } = transformContent('<dt-banner hide-close />');
|
|
189
|
+
assert.equal(transformed, '<dt-banner :show-close="false" />');
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('converts :hide-close="true" on dt-chip', () => {
|
|
193
|
+
const { transformed } = transformContent('<dt-chip :hide-close="true" />');
|
|
194
|
+
assert.equal(transformed, '<dt-chip :show-close="false" />');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('removes :hide-close="false" on dt-modal (default is show)', () => {
|
|
198
|
+
const { transformed } = transformContent('<dt-modal :hide-close="false" />');
|
|
199
|
+
assert.equal(transformed, '<dt-modal />');
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('converts bare hide-close on dt-notice', () => {
|
|
203
|
+
const { transformed } = transformContent('<dt-notice hide-close />');
|
|
204
|
+
assert.equal(transformed, '<dt-notice :show-close="false" />');
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it('converts bare hide-close on dt-toast', () => {
|
|
208
|
+
const { transformed } = transformContent('<dt-toast hide-close />');
|
|
209
|
+
assert.equal(transformed, '<dt-toast :show-close="false" />');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('emits a warning for dynamic :hide-close expressions', () => {
|
|
213
|
+
const { warnings } = transformContent('<dt-banner :hide-close="someVar" />');
|
|
214
|
+
assert.ok(warnings.some(w => w.includes('Cannot auto-invert')));
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('emits a warning for dynamic camelCase :hideClose expressions', () => {
|
|
218
|
+
const { warnings } = transformContent('<dt-banner :hideClose="someVar" />');
|
|
219
|
+
assert.ok(warnings.some(w => w.includes('Cannot auto-invert') && w.includes('hideClose')));
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('converts bare hide-close on a non-self-closing tag', () => {
|
|
223
|
+
const { transformed } = transformContent('<dt-banner hide-close>Content</dt-banner>');
|
|
224
|
+
assert.equal(transformed, '<dt-banner :show-close="false">Content</dt-banner>');
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
describe('hide-icon → :show-icon="false"', () => {
|
|
229
|
+
it('converts bare hide-icon on dt-banner', () => {
|
|
230
|
+
const { transformed } = transformContent('<dt-banner hide-icon />');
|
|
231
|
+
assert.equal(transformed, '<dt-banner :show-icon="false" />');
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('converts :hide-icon="true" on dt-notice', () => {
|
|
235
|
+
const { transformed } = transformContent('<dt-notice :hide-icon="true" />');
|
|
236
|
+
assert.equal(transformed, '<dt-notice :show-icon="false" />');
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('does not apply hide-icon rename to dt-chip (not in map)', () => {
|
|
240
|
+
const input = '<dt-chip hide-icon />';
|
|
241
|
+
const { transformed, count } = transformContent(input);
|
|
242
|
+
assert.equal(transformed, input);
|
|
243
|
+
assert.equal(count, 0);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
describe('hide-action → :show-action="false"', () => {
|
|
248
|
+
it('converts bare hide-action on dt-toast', () => {
|
|
249
|
+
const { transformed } = transformContent('<dt-toast hide-action />');
|
|
250
|
+
assert.equal(transformed, '<dt-toast :show-action="false" />');
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
describe('dt-notice-action hide-close / hide-action (DLT-3159 gap)', () => {
|
|
255
|
+
it('converts bare hide-close on dt-notice-action', () => {
|
|
256
|
+
const { transformed } = transformContent('<dt-notice-action hide-close />');
|
|
257
|
+
assert.equal(transformed, '<dt-notice-action :show-close="false" />');
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('converts bare hide-action on dt-notice-action', () => {
|
|
261
|
+
const { transformed } = transformContent('<dt-notice-action hide-action />');
|
|
262
|
+
assert.equal(transformed, '<dt-notice-action :show-action="false" />');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
describe('DLT-3159 additional inverted bool props', () => {
|
|
267
|
+
it('dt-pagination: converts bare hide-edges', () => {
|
|
268
|
+
const { transformed } = transformContent('<dt-pagination hide-edges />');
|
|
269
|
+
assert.equal(transformed, '<dt-pagination :show-edges="false" />');
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('dt-pagination: removes :hide-edges="false"', () => {
|
|
273
|
+
const { transformed } = transformContent('<dt-pagination :hide-edges="false" />');
|
|
274
|
+
assert.equal(transformed, '<dt-pagination />');
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('dt-segmented-control: converts bare hide-divider', () => {
|
|
278
|
+
const { transformed } = transformContent('<dt-segmented-control hide-divider />');
|
|
279
|
+
assert.equal(transformed, '<dt-segmented-control :show-divider="false" />');
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
it('dt-rich-text-editor: converts bare prevent-typing', () => {
|
|
283
|
+
const { transformed } = transformContent('<dt-rich-text-editor prevent-typing />');
|
|
284
|
+
assert.equal(transformed, '<dt-rich-text-editor :allow-typing="false" />');
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('dt-rich-text-editor: converts :prevent-typing="true"', () => {
|
|
288
|
+
const { transformed } = transformContent('<dt-rich-text-editor :prevent-typing="true" />');
|
|
289
|
+
assert.equal(transformed, '<dt-rich-text-editor :allow-typing="false" />');
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
it('dt-rich-text-editor: removes :prevent-typing="false"', () => {
|
|
293
|
+
const { transformed } = transformContent('<dt-rich-text-editor :prevent-typing="false" />');
|
|
294
|
+
assert.equal(transformed, '<dt-rich-text-editor />');
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('dt-rich-text-editor: converts bare hide-link-bubble-menu', () => {
|
|
298
|
+
const { transformed } = transformContent('<dt-rich-text-editor hide-link-bubble-menu />');
|
|
299
|
+
assert.equal(transformed, '<dt-rich-text-editor :show-link-bubble-menu="false" />');
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it('dt-recipe-message-input: converts bare prevent-typing', () => {
|
|
303
|
+
const { transformed } = transformContent('<dt-recipe-message-input prevent-typing />');
|
|
304
|
+
assert.equal(transformed, '<dt-recipe-message-input :allow-typing="false" />');
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('dt-recipe-message-input: does not migrate hide-link-bubble-menu (internal data, not a prop)', () => {
|
|
308
|
+
const input = '<dt-recipe-message-input hide-link-bubble-menu />';
|
|
309
|
+
const { transformed, count } = transformContent(input);
|
|
310
|
+
assert.equal(transformed, input);
|
|
311
|
+
assert.equal(count, 0);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it('dt-recipe-contact-centers-row: converts bare hide-actions', () => {
|
|
315
|
+
const { transformed } = transformContent('<dt-recipe-contact-centers-row hide-actions />');
|
|
316
|
+
assert.equal(transformed, '<dt-recipe-contact-centers-row :show-actions="false" />');
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
describe('dt-popover hideOnClick → closeOnClick (same semantics, DLT-3159)', () => {
|
|
321
|
+
it('renames hide-on-click prop', () => {
|
|
322
|
+
const { transformed } = transformContent('<dt-popover hide-on-click />');
|
|
323
|
+
assert.equal(transformed, '<dt-popover close-on-click />');
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it('renames :hideOnClick binding', () => {
|
|
327
|
+
const { transformed } = transformContent('<dt-popover :hideOnClick="shouldClose" />');
|
|
328
|
+
assert.equal(transformed, '<dt-popover :closeOnClick="shouldClose" />');
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
it('renames :hide-on-click binding', () => {
|
|
332
|
+
const { transformed } = transformContent('<dt-popover :hide-on-click="val" />');
|
|
333
|
+
assert.equal(transformed, '<dt-popover :close-on-click="val" />');
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
describe('hide-clear → :show-clear="false" (dt-filter-pill)', () => {
|
|
338
|
+
it('converts bare hide-clear', () => {
|
|
339
|
+
const { transformed } = transformContent('<dt-filter-pill hide-clear />');
|
|
340
|
+
assert.equal(transformed, '<dt-filter-pill :show-clear="false" />');
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it('removes :hide-clear="false"', () => {
|
|
344
|
+
const { transformed } = transformContent('<dt-filter-pill :hide-clear="false" />');
|
|
345
|
+
assert.equal(transformed, '<dt-filter-pill />');
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// ---------------------------------------------------------------------------
|
|
350
|
+
// DLT-3157 — kind and validation-state value renames
|
|
351
|
+
// ---------------------------------------------------------------------------
|
|
352
|
+
|
|
353
|
+
describe('kind value renames', () => {
|
|
354
|
+
it('renames kind="danger" → kind="critical"', () => {
|
|
355
|
+
const { transformed } = transformContent('<dt-button kind="danger" />');
|
|
356
|
+
assert.equal(transformed, '<dt-button kind="critical" />');
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
it('renames kind="error" → kind="critical"', () => {
|
|
360
|
+
const { transformed } = transformContent('<dt-banner kind="error" />');
|
|
361
|
+
assert.equal(transformed, '<dt-banner kind="critical" />');
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
it('renames kind="success" → kind="positive"', () => {
|
|
365
|
+
const { transformed } = transformContent('<dt-badge kind="success" />');
|
|
366
|
+
assert.equal(transformed, '<dt-badge kind="positive" />');
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
it('renames bound :kind="\'danger\'" on a non-link component', () => {
|
|
370
|
+
const { transformed } = transformContent('<dt-button :kind="\'danger\'" />');
|
|
371
|
+
assert.equal(transformed, '<dt-button :kind="\'critical\'" />');
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it('does not alter kind="muted"', () => {
|
|
375
|
+
const input = '<dt-button kind="muted" />';
|
|
376
|
+
const { transformed, count } = transformContent(input);
|
|
377
|
+
assert.equal(transformed, input);
|
|
378
|
+
assert.equal(count, 0);
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
it('does not alter kind="default"', () => {
|
|
382
|
+
const input = '<dt-badge kind="default" />';
|
|
383
|
+
const { transformed, count } = transformContent(input);
|
|
384
|
+
assert.equal(transformed, input);
|
|
385
|
+
assert.equal(count, 0);
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
describe('DtBadge type value renames (DLT-3157)', () => {
|
|
390
|
+
it('renames type="success" → type="positive" on dt-badge', () => {
|
|
391
|
+
const { transformed } = transformContent('<dt-badge type="success" />');
|
|
392
|
+
assert.equal(transformed, '<dt-badge type="positive" />');
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
it('renames :type="\'success\'" bound value on dt-badge', () => {
|
|
396
|
+
const { transformed } = transformContent('<dt-badge :type="\'success\'" />');
|
|
397
|
+
assert.equal(transformed, '<dt-badge :type="\'positive\'" />');
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
it('does not alter type="warning"', () => {
|
|
401
|
+
const input = '<dt-badge type="warning" />';
|
|
402
|
+
const { transformed, count } = transformContent(input);
|
|
403
|
+
assert.equal(transformed, input);
|
|
404
|
+
assert.equal(count, 0);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
describe('DtLink kind → tone prop rename (DLT-3157)', () => {
|
|
409
|
+
it('renames kind prop to tone on dt-link', () => {
|
|
410
|
+
const { transformed } = transformContent('<dt-link kind="muted" />');
|
|
411
|
+
assert.equal(transformed, '<dt-link tone="muted" />');
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
it('renames kind="danger" and prop to tone="critical"', () => {
|
|
415
|
+
const { transformed, count } = transformContent('<dt-link kind="danger" />');
|
|
416
|
+
assert.equal(transformed, '<dt-link tone="critical" />');
|
|
417
|
+
assert.equal(count, 2);
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
it('renames kind="success" and prop to tone="positive"', () => {
|
|
421
|
+
const { transformed } = transformContent('<dt-link kind="success" />');
|
|
422
|
+
assert.equal(transformed, '<dt-link tone="positive" />');
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
it('renames :kind bound binding to :tone', () => {
|
|
426
|
+
const { transformed } = transformContent('<dt-link :kind="linkTone" />');
|
|
427
|
+
assert.equal(transformed, '<dt-link :tone="linkTone" />');
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
it('does not rename kind on non-link components', () => {
|
|
431
|
+
const input = '<dt-button kind="critical" />';
|
|
432
|
+
const { transformed, count } = transformContent(input);
|
|
433
|
+
assert.equal(transformed, input);
|
|
434
|
+
assert.equal(count, 0);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
describe('DtModal banner-kind value renames (DLT-3157)', () => {
|
|
439
|
+
it('renames banner-kind="error" → banner-kind="critical"', () => {
|
|
440
|
+
const { transformed } = transformContent('<dt-modal banner-kind="error" />');
|
|
441
|
+
assert.equal(transformed, '<dt-modal banner-kind="critical" />');
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
it('renames banner-kind="success" → banner-kind="positive"', () => {
|
|
445
|
+
const { transformed } = transformContent('<dt-modal banner-kind="success" />');
|
|
446
|
+
assert.equal(transformed, '<dt-modal banner-kind="positive" />');
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
it('renames camelCase bannerKind="error"', () => {
|
|
450
|
+
const { transformed } = transformContent('<dt-modal bannerKind="error" />');
|
|
451
|
+
assert.equal(transformed, '<dt-modal bannerKind="critical" />');
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
it('does not alter banner-kind="info"', () => {
|
|
455
|
+
const input = '<dt-modal banner-kind="info" />';
|
|
456
|
+
const { transformed, count } = transformContent(input);
|
|
457
|
+
assert.equal(transformed, input);
|
|
458
|
+
assert.equal(count, 0);
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
describe('DtText / DtLink tone="success" → tone="positive" (DLT-3157)', () => {
|
|
463
|
+
it('renames tone="success" on dt-text', () => {
|
|
464
|
+
const { transformed } = transformContent('<dt-text tone="success">x</dt-text>');
|
|
465
|
+
assert.equal(transformed, '<dt-text tone="positive">x</dt-text>');
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
it('renames tone="success" on dt-link', () => {
|
|
469
|
+
const { transformed } = transformContent('<dt-link tone="success" />');
|
|
470
|
+
assert.equal(transformed, '<dt-link tone="positive" />');
|
|
471
|
+
});
|
|
472
|
+
|
|
473
|
+
it('renames :tone="\'success\'" bound value', () => {
|
|
474
|
+
const { transformed } = transformContent('<dt-text :tone="\'success\'">x</dt-text>');
|
|
475
|
+
assert.equal(transformed, '<dt-text :tone="\'positive\'">x</dt-text>');
|
|
476
|
+
});
|
|
477
|
+
|
|
478
|
+
it('renames camelCase tone="success" on PascalCase DtText', () => {
|
|
479
|
+
const { transformed } = transformContent('<DtText tone="success">x</DtText>');
|
|
480
|
+
assert.equal(transformed, '<DtText tone="positive">x</DtText>');
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('does not alter tone="primary"', () => {
|
|
484
|
+
const input = '<dt-text tone="primary">x</dt-text>';
|
|
485
|
+
const { transformed, count } = transformContent(input);
|
|
486
|
+
assert.equal(transformed, input);
|
|
487
|
+
assert.equal(count, 0);
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
it('renames tone="success-strong" on dt-text', () => {
|
|
491
|
+
const { transformed } = transformContent('<dt-text tone="success-strong">x</dt-text>');
|
|
492
|
+
assert.equal(transformed, '<dt-text tone="positive-strong">x</dt-text>');
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
describe('DtBox surface / bc value renames (DLT-3331)', () => {
|
|
497
|
+
it('renames surface="success" → surface="positive"', () => {
|
|
498
|
+
const { transformed } = transformContent('<dt-box surface="success" />');
|
|
499
|
+
assert.equal(transformed, '<dt-box surface="positive" />');
|
|
500
|
+
});
|
|
501
|
+
|
|
502
|
+
it('renames variant suffix surface="success-subtle" → surface="positive-subtle"', () => {
|
|
503
|
+
const { transformed } = transformContent('<dt-box surface="success-subtle" />');
|
|
504
|
+
assert.equal(transformed, '<dt-box surface="positive-subtle" />');
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
it('renames bc="success" → bc="positive"', () => {
|
|
508
|
+
const { transformed } = transformContent('<dt-box bc="success" />');
|
|
509
|
+
assert.equal(transformed, '<dt-box bc="positive" />');
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
it('renames :surface="\'success\'" bound value on PascalCase DtBox', () => {
|
|
513
|
+
const { transformed } = transformContent('<DtBox :surface="\'success\'" />');
|
|
514
|
+
assert.equal(transformed, '<DtBox :surface="\'positive\'" />');
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
it('does not alter surface="primary"', () => {
|
|
518
|
+
const input = '<dt-box surface="primary" />';
|
|
519
|
+
const { transformed, count } = transformContent(input);
|
|
520
|
+
assert.equal(transformed, input);
|
|
521
|
+
assert.equal(count, 0);
|
|
522
|
+
});
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
describe('DtButton link-kind value renames (DLT-3157)', () => {
|
|
526
|
+
it('renames link-kind="success" → link-kind="positive"', () => {
|
|
527
|
+
const { transformed } = transformContent('<dt-button link link-kind="success" />');
|
|
528
|
+
assert.equal(transformed, '<dt-button link link-kind="positive" />');
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
it('renames link-kind="danger" → link-kind="critical"', () => {
|
|
532
|
+
const { transformed } = transformContent('<dt-button link link-kind="danger" />');
|
|
533
|
+
assert.equal(transformed, '<dt-button link link-kind="critical" />');
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
it('renames camelCase linkKind="success" → linkKind="positive"', () => {
|
|
537
|
+
const { transformed } = transformContent('<dt-button link linkKind="success" />');
|
|
538
|
+
assert.equal(transformed, '<dt-button link linkKind="positive" />');
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it('renames :link-kind="\'success\'" bound value', () => {
|
|
542
|
+
const { transformed } = transformContent('<dt-button link :link-kind="\'success\'" />');
|
|
543
|
+
assert.equal(transformed, '<dt-button link :link-kind="\'positive\'" />');
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
it('does not alter link-kind="muted"', () => {
|
|
547
|
+
const input = '<dt-button link link-kind="muted" />';
|
|
548
|
+
const { transformed, count } = transformContent(input);
|
|
549
|
+
assert.equal(transformed, input);
|
|
550
|
+
assert.equal(count, 0);
|
|
551
|
+
});
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
describe('validation-state value renames', () => {
|
|
555
|
+
it('renames validation-state="error" → "critical"', () => {
|
|
556
|
+
const { transformed } = transformContent('<dt-input validation-state="error" />');
|
|
557
|
+
assert.equal(transformed, '<dt-input validation-state="critical" />');
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
it('renames validation-state="success" → "positive"', () => {
|
|
561
|
+
const { transformed } = transformContent('<dt-checkbox validation-state="success" />');
|
|
562
|
+
assert.equal(transformed, '<dt-checkbox validation-state="positive" />');
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it('does not alter validation-state="warning"', () => {
|
|
566
|
+
const input = '<dt-input validation-state="warning" />';
|
|
567
|
+
const { transformed, count } = transformContent(input);
|
|
568
|
+
assert.equal(transformed, input);
|
|
569
|
+
assert.equal(count, 0);
|
|
570
|
+
});
|
|
571
|
+
});
|
|
572
|
+
|
|
573
|
+
// ---------------------------------------------------------------------------
|
|
574
|
+
// DLT-3283 — Slot renames
|
|
575
|
+
// ---------------------------------------------------------------------------
|
|
576
|
+
|
|
577
|
+
describe('slot renames', () => {
|
|
578
|
+
it('renames #titleOverride → #header', () => {
|
|
579
|
+
const { transformed } = transformContent('<template #titleOverride>Custom</template>');
|
|
580
|
+
assert.equal(transformed, '<template #header>Custom</template>');
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
it('renames v-slot:titleOverride → v-slot:header', () => {
|
|
584
|
+
const { transformed } = transformContent('<template v-slot:titleOverride>Custom</template>');
|
|
585
|
+
assert.equal(transformed, '<template v-slot:header>Custom</template>');
|
|
586
|
+
});
|
|
587
|
+
|
|
588
|
+
it('renames slot="titleOverride" → slot="header"', () => {
|
|
589
|
+
const { transformed } = transformContent('<span slot="titleOverride">Custom</span>');
|
|
590
|
+
assert.equal(transformed, '<span slot="header">Custom</span>');
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
it('renames #labelSlot → #label', () => {
|
|
594
|
+
const { transformed } = transformContent('<template #labelSlot>Label text</template>');
|
|
595
|
+
assert.equal(transformed, '<template #label>Label text</template>');
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
it('renames v-slot:labelSlot → v-slot:label', () => {
|
|
599
|
+
const { transformed } = transformContent('<template v-slot:labelSlot>Label</template>');
|
|
600
|
+
assert.equal(transformed, '<template v-slot:label>Label</template>');
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
it('renames #headingSlot → #heading', () => {
|
|
604
|
+
const { transformed } = transformContent('<template #headingSlot>Group name</template>');
|
|
605
|
+
assert.equal(transformed, '<template #heading>Group name</template>');
|
|
606
|
+
});
|
|
607
|
+
});
|
|
608
|
+
|
|
609
|
+
// ---------------------------------------------------------------------------
|
|
610
|
+
// DLT-3100 — rootClass removal warning
|
|
611
|
+
// ---------------------------------------------------------------------------
|
|
612
|
+
|
|
613
|
+
describe('rootClass removal warning', () => {
|
|
614
|
+
it('emits a warning for root-class on dt-avatar', () => {
|
|
615
|
+
const { warnings } = transformContent('<dt-avatar root-class="d-w300" />');
|
|
616
|
+
assert.ok(warnings.some(w => w.includes('root-class')));
|
|
617
|
+
assert.ok(warnings.some(w => w.includes('dt-avatar')));
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
it('auto-migrates :rootClass on dt-input instead of warning', () => {
|
|
621
|
+
const { transformed, warnings } = transformContent('<dt-input :rootClass="myClass" />');
|
|
622
|
+
assert.equal(transformed, '<dt-input :class="myClass" />');
|
|
623
|
+
assert.equal(warnings.filter(w => w.includes('rootClass')).length, 0);
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
it('does not alter the tag content for rootClass', () => {
|
|
627
|
+
const input = '<dt-avatar root-class="d-w300" />';
|
|
628
|
+
const { transformed } = transformContent(input);
|
|
629
|
+
assert.equal(transformed, input);
|
|
630
|
+
});
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
// ---------------------------------------------------------------------------
|
|
634
|
+
// DLT-3100 — rootClass / wrapperClass / containerClass auto-migration
|
|
635
|
+
// ---------------------------------------------------------------------------
|
|
636
|
+
|
|
637
|
+
describe('root-class auto-migration', () => {
|
|
638
|
+
it('renames root-class to class on dt-input', () => {
|
|
639
|
+
const { transformed, count } = transformContent('<dt-input root-class="d-w100p" />');
|
|
640
|
+
assert.equal(transformed, '<dt-input class="d-w100p" />');
|
|
641
|
+
assert.equal(count, 1);
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
it('renames rootClass (camelCase) to class on dt-checkbox', () => {
|
|
645
|
+
const { transformed } = transformContent('<dt-checkbox rootClass="d-ml8" />');
|
|
646
|
+
assert.equal(transformed, '<dt-checkbox class="d-ml8" />');
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
it('renames :root-class dynamic binding to :class on dt-radio', () => {
|
|
650
|
+
const { transformed } = transformContent('<dt-radio :root-class="myClass" />');
|
|
651
|
+
assert.equal(transformed, '<dt-radio :class="myClass" />');
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
it('renames :rootClass camelCase dynamic binding to :class on dt-select-menu', () => {
|
|
655
|
+
const { transformed } = transformContent('<dt-select-menu :rootClass="myClass" />');
|
|
656
|
+
assert.equal(transformed, '<dt-select-menu :class="myClass" />');
|
|
657
|
+
});
|
|
658
|
+
|
|
659
|
+
it('merges root-class into existing class on dt-input', () => {
|
|
660
|
+
const { transformed } = transformContent('<dt-input class="d-mt8" root-class="d-w100p" />');
|
|
661
|
+
assert.equal(transformed, '<dt-input class="d-mt8 d-w100p" />');
|
|
662
|
+
});
|
|
663
|
+
|
|
664
|
+
it('warns and leaves tag unchanged when :root-class clashes with existing :class', () => {
|
|
665
|
+
const input = '<dt-input :class="baseClass" :root-class="extraClass" />';
|
|
666
|
+
const { transformed, warnings } = transformContent(input);
|
|
667
|
+
assert.equal(transformed, input);
|
|
668
|
+
assert.ok(warnings.some(w => w.includes('Cannot auto-merge')));
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
it('renames wrapper-class to class on dt-toggle', () => {
|
|
672
|
+
const { transformed } = transformContent('<dt-toggle wrapper-class="d-w100p" />');
|
|
673
|
+
assert.equal(transformed, '<dt-toggle class="d-w100p" />');
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
it('renames wrapper-class to class on dt-feed-item-pill', () => {
|
|
677
|
+
const { transformed } = transformContent('<dt-feed-item-pill wrapper-class="d-p8" />');
|
|
678
|
+
assert.equal(transformed, '<dt-feed-item-pill class="d-p8" />');
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
it('renames container-class to class on dt-card', () => {
|
|
682
|
+
const { transformed } = transformContent('<dt-card container-class="d-bgc-primary" />');
|
|
683
|
+
assert.equal(transformed, '<dt-card class="d-bgc-primary" />');
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
it('renames root-class on dt-breadcrumb-item', () => {
|
|
687
|
+
const { transformed } = transformContent('<dt-breadcrumb-item root-class="d-fw-bold" />');
|
|
688
|
+
assert.equal(transformed, '<dt-breadcrumb-item class="d-fw-bold" />');
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
it('renames root-class on dt-split-button', () => {
|
|
692
|
+
const { transformed } = transformContent('<dt-split-button root-class="d-mt16" />');
|
|
693
|
+
assert.equal(transformed, '<dt-split-button class="d-mt16" />');
|
|
694
|
+
});
|
|
695
|
+
|
|
696
|
+
it('still warns for root-class on components not in the migration map', () => {
|
|
697
|
+
const { warnings } = transformContent('<dt-avatar root-class="d-w300" />');
|
|
698
|
+
assert.ok(warnings.some(w => w.includes('root-class')));
|
|
699
|
+
assert.ok(warnings.some(w => w.includes('dt-avatar')));
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
it('handles PascalCase DtInput', () => {
|
|
703
|
+
const { transformed } = transformContent('<DtInput root-class="d-w100p" />');
|
|
704
|
+
assert.equal(transformed, '<DtInput class="d-w100p" />');
|
|
705
|
+
});
|
|
706
|
+
});
|
|
707
|
+
|
|
708
|
+
// ---------------------------------------------------------------------------
|
|
709
|
+
// DLT-3160 — dt-checkbox-group: selectedValues → modelValue
|
|
710
|
+
// ---------------------------------------------------------------------------
|
|
711
|
+
|
|
712
|
+
describe('selectedValues → modelValue (dt-checkbox-group)', () => {
|
|
713
|
+
it('renames :selected-values binding', () => {
|
|
714
|
+
const { transformed } = transformContent('<dt-checkbox-group :selected-values="myArr" />');
|
|
715
|
+
assert.equal(transformed, '<dt-checkbox-group :model-value="myArr" />');
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
it('renames :selectedValues camelCase binding', () => {
|
|
719
|
+
const { transformed } = transformContent('<dt-checkbox-group :selectedValues="myArr" />');
|
|
720
|
+
assert.equal(transformed, '<dt-checkbox-group :modelValue="myArr" />');
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
it('converts v-model:selected-values to plain v-model', () => {
|
|
724
|
+
const { transformed } = transformContent('<dt-checkbox-group v-model:selected-values="myArr" />');
|
|
725
|
+
assert.equal(transformed, '<dt-checkbox-group v-model="myArr" />');
|
|
726
|
+
});
|
|
727
|
+
|
|
728
|
+
it('converts v-model:selectedValues to plain v-model', () => {
|
|
729
|
+
const { transformed } = transformContent('<dt-checkbox-group v-model:selectedValues="myArr" />');
|
|
730
|
+
assert.equal(transformed, '<dt-checkbox-group v-model="myArr" />');
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
it('renames @update:selected-values event', () => {
|
|
734
|
+
const { transformed } = transformContent('<dt-checkbox-group @update:selected-values="onUpdate" />');
|
|
735
|
+
assert.equal(transformed, '<dt-checkbox-group @update:model-value="onUpdate" />');
|
|
736
|
+
});
|
|
737
|
+
|
|
738
|
+
it('renames @update:selectedValues event', () => {
|
|
739
|
+
const { transformed } = transformContent('<dt-checkbox-group @update:selectedValues="onUpdate" />');
|
|
740
|
+
assert.equal(transformed, '<dt-checkbox-group @update:modelValue="onUpdate" />');
|
|
741
|
+
});
|
|
742
|
+
|
|
743
|
+
it('does not rename selected-values on other components', () => {
|
|
744
|
+
const input = '<dt-input :selected-values="myArr" />';
|
|
745
|
+
const { transformed, count } = transformContent(input);
|
|
746
|
+
assert.equal(transformed, input);
|
|
747
|
+
assert.equal(count, 0);
|
|
748
|
+
});
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
// ---------------------------------------------------------------------------
|
|
752
|
+
// DLT-3160 — @input / @change event renames
|
|
753
|
+
// ---------------------------------------------------------------------------
|
|
754
|
+
|
|
755
|
+
describe('@input → @update:model-value on form inputs', () => {
|
|
756
|
+
it('renames @input on dt-input', () => {
|
|
757
|
+
const { transformed } = transformContent('<dt-input @input="handleInput" />');
|
|
758
|
+
assert.equal(transformed, '<dt-input @update:model-value="handleInput" />');
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
it('renames @input on dt-radio', () => {
|
|
762
|
+
const { transformed } = transformContent('<dt-radio @input="onSelect" />');
|
|
763
|
+
assert.equal(transformed, '<dt-radio @update:model-value="onSelect" />');
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
it('renames @input on dt-radio-group', () => {
|
|
767
|
+
const { transformed } = transformContent('<dt-radio-group @input="onChange" />');
|
|
768
|
+
assert.equal(transformed, '<dt-radio-group @update:model-value="onChange" />');
|
|
769
|
+
});
|
|
770
|
+
|
|
771
|
+
it('renames @input on dt-combobox-multi-select', () => {
|
|
772
|
+
const { transformed } = transformContent('<dt-combobox-multi-select @input="onSearch" />');
|
|
773
|
+
assert.equal(transformed, '<dt-combobox-multi-select @update:model-value="onSearch" />');
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
it('renames @input on dt-rich-text-editor', () => {
|
|
777
|
+
const { transformed } = transformContent('<dt-rich-text-editor @input="onEdit" />');
|
|
778
|
+
assert.equal(transformed, '<dt-rich-text-editor @update:model-value="onEdit" />');
|
|
779
|
+
});
|
|
780
|
+
|
|
781
|
+
it('renames @input on dt-input-group', () => {
|
|
782
|
+
const { transformed } = transformContent('<dt-input-group @input="onGroup" />');
|
|
783
|
+
assert.equal(transformed, '<dt-input-group @update:model-value="onGroup" />');
|
|
784
|
+
});
|
|
785
|
+
|
|
786
|
+
it('does not rename @input on components not in the map', () => {
|
|
787
|
+
const input = '<dt-avatar @input="handler" />';
|
|
788
|
+
const { transformed, count } = transformContent(input);
|
|
789
|
+
assert.equal(transformed, input);
|
|
790
|
+
assert.equal(count, 0);
|
|
791
|
+
});
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
describe('@change → @update:model-value on toggle and select-menu', () => {
|
|
795
|
+
it('renames @change on dt-toggle', () => {
|
|
796
|
+
const { transformed } = transformContent('<dt-toggle @change="onToggle" />');
|
|
797
|
+
assert.equal(transformed, '<dt-toggle @update:model-value="onToggle" />');
|
|
798
|
+
});
|
|
799
|
+
|
|
800
|
+
it('renames @change on dt-select-menu', () => {
|
|
801
|
+
const { transformed } = transformContent('<dt-select-menu @change="onSelect" />');
|
|
802
|
+
assert.equal(transformed, '<dt-select-menu @update:model-value="onSelect" />');
|
|
803
|
+
});
|
|
804
|
+
|
|
805
|
+
it('renames both @input and @change on dt-select-menu', () => {
|
|
806
|
+
const input = '<dt-select-menu @input="onInput" @change="onChange" />';
|
|
807
|
+
const { transformed, count } = transformContent(input);
|
|
808
|
+
assert.equal(transformed, '<dt-select-menu @update:model-value="onInput" />');
|
|
809
|
+
assert.equal(count, 1);
|
|
810
|
+
});
|
|
811
|
+
|
|
812
|
+
it('does not rename @change on components not in the map', () => {
|
|
813
|
+
const input = '<dt-banner @change="handler" />';
|
|
814
|
+
const { transformed, count } = transformContent(input);
|
|
815
|
+
assert.equal(transformed, input);
|
|
816
|
+
assert.equal(count, 0);
|
|
817
|
+
});
|
|
818
|
+
});
|
|
819
|
+
|
|
820
|
+
// ---------------------------------------------------------------------------
|
|
821
|
+
// Non-Dialtone components are not transformed
|
|
822
|
+
// ---------------------------------------------------------------------------
|
|
823
|
+
|
|
824
|
+
describe('does not transform non-Dialtone components', () => {
|
|
825
|
+
it('ignores bare HTML elements', () => {
|
|
826
|
+
const input = '<div kind="error">text</div>';
|
|
827
|
+
const { transformed, count } = transformContent(input);
|
|
828
|
+
assert.equal(transformed, input);
|
|
829
|
+
assert.equal(count, 0);
|
|
830
|
+
});
|
|
831
|
+
|
|
832
|
+
it('ignores components without dt- prefix', () => {
|
|
833
|
+
const input = '<my-modal :show="open" />';
|
|
834
|
+
const { transformed, count } = transformContent(input);
|
|
835
|
+
assert.equal(transformed, input);
|
|
836
|
+
assert.equal(count, 0);
|
|
837
|
+
});
|
|
838
|
+
|
|
839
|
+
it('ignores app-prefixed components', () => {
|
|
840
|
+
const input = '<app-banner kind="error" />';
|
|
841
|
+
const { transformed, count } = transformContent(input);
|
|
842
|
+
assert.equal(transformed, input);
|
|
843
|
+
assert.equal(count, 0);
|
|
844
|
+
});
|
|
845
|
+
});
|
|
846
|
+
|
|
847
|
+
// ---------------------------------------------------------------------------
|
|
848
|
+
// PascalCase component names
|
|
849
|
+
// ---------------------------------------------------------------------------
|
|
850
|
+
|
|
851
|
+
describe('PascalCase component names', () => {
|
|
852
|
+
it('transforms DtModal :show → :open', () => {
|
|
853
|
+
const { transformed } = transformContent('<DtModal :show="isOpen" />');
|
|
854
|
+
assert.equal(transformed, '<DtModal :open="isOpen" />');
|
|
855
|
+
});
|
|
856
|
+
|
|
857
|
+
it('transforms DtBanner title → header-text', () => {
|
|
858
|
+
const { transformed } = transformContent('<DtBanner title="Alert" />');
|
|
859
|
+
assert.equal(transformed, '<DtBanner header-text="Alert" />');
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
it('transforms DtButton kind="danger"', () => {
|
|
863
|
+
const { transformed } = transformContent('<DtButton kind="danger" />');
|
|
864
|
+
assert.equal(transformed, '<DtButton kind="critical" />');
|
|
865
|
+
});
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
// ---------------------------------------------------------------------------
|
|
869
|
+
// Multiple transforms in one tag / file
|
|
870
|
+
// ---------------------------------------------------------------------------
|
|
871
|
+
|
|
872
|
+
describe('multiple transforms', () => {
|
|
873
|
+
it('applies several renames in a single tag', () => {
|
|
874
|
+
const input = '<dt-banner title="Oops" kind="error" hide-close />';
|
|
875
|
+
const { transformed, count } = transformContent(input);
|
|
876
|
+
assert.equal(transformed, '<dt-banner header-text="Oops" kind="critical" :show-close="false" />');
|
|
877
|
+
assert.ok(count >= 3);
|
|
878
|
+
});
|
|
879
|
+
|
|
880
|
+
it('transforms multiple components in one template', () => {
|
|
881
|
+
const input = `<template>
|
|
882
|
+
<dt-avatar clickable />
|
|
883
|
+
<dt-modal :show="open" @update:show="close" />
|
|
884
|
+
<dt-badge kind="success" />
|
|
885
|
+
</template>`;
|
|
886
|
+
const expected = `<template>
|
|
887
|
+
<dt-avatar interactive />
|
|
888
|
+
<dt-modal :open="open" @update:open="close" />
|
|
889
|
+
<dt-badge kind="positive" />
|
|
890
|
+
</template>`;
|
|
891
|
+
const { transformed } = transformContent(input);
|
|
892
|
+
assert.equal(transformed, expected);
|
|
893
|
+
});
|
|
894
|
+
|
|
895
|
+
it('handles multiline component tags', () => {
|
|
896
|
+
const input = `<dt-banner
|
|
897
|
+
title="Alert"
|
|
898
|
+
kind="error"
|
|
899
|
+
hide-icon
|
|
900
|
+
/>`;
|
|
901
|
+
const expected = `<dt-banner
|
|
902
|
+
header-text="Alert"
|
|
903
|
+
kind="critical"
|
|
904
|
+
:show-icon="false"
|
|
905
|
+
/>`;
|
|
906
|
+
const { transformed } = transformContent(input);
|
|
907
|
+
assert.equal(transformed, expected);
|
|
908
|
+
});
|
|
909
|
+
});
|
|
910
|
+
|
|
911
|
+
// ---------------------------------------------------------------------------
|
|
912
|
+
// Edge cases
|
|
913
|
+
// ---------------------------------------------------------------------------
|
|
914
|
+
|
|
915
|
+
describe('edge cases', () => {
|
|
916
|
+
it('returns count 0 for content with no matches', () => {
|
|
917
|
+
const input = '<div><span>No Dialtone here</span></div>';
|
|
918
|
+
const { count } = transformContent(input);
|
|
919
|
+
assert.equal(count, 0);
|
|
920
|
+
});
|
|
921
|
+
|
|
922
|
+
it('handles empty string', () => {
|
|
923
|
+
const { transformed, count } = transformContent('');
|
|
924
|
+
assert.equal(transformed, '');
|
|
925
|
+
assert.equal(count, 0);
|
|
926
|
+
});
|
|
927
|
+
|
|
928
|
+
it('does not change already-migrated props', () => {
|
|
929
|
+
const input = '<dt-modal :open="isOpen" @update:open="close" />';
|
|
930
|
+
const { transformed, count } = transformContent(input);
|
|
931
|
+
assert.equal(transformed, input);
|
|
932
|
+
assert.equal(count, 0);
|
|
933
|
+
});
|
|
934
|
+
|
|
935
|
+
it('does not change already-migrated kind="critical"', () => {
|
|
936
|
+
const input = '<dt-badge kind="critical" />';
|
|
937
|
+
const { transformed, count } = transformContent(input);
|
|
938
|
+
assert.equal(transformed, input);
|
|
939
|
+
assert.equal(count, 0);
|
|
940
|
+
});
|
|
941
|
+
|
|
942
|
+
it('does not change kind inside text content of a tag', () => {
|
|
943
|
+
const input = '<dt-text>Use kind="error" on inputs</dt-text>';
|
|
944
|
+
const { transformed, count } = transformContent(input);
|
|
945
|
+
assert.equal(transformed, input);
|
|
946
|
+
assert.equal(count, 0);
|
|
947
|
+
});
|
|
948
|
+
|
|
949
|
+
it('handles > inside a quoted attribute value (arrow function)', () => {
|
|
950
|
+
const { transformed } = transformContent('<dt-modal :show="v => set(v)" />');
|
|
951
|
+
assert.equal(transformed, '<dt-modal :open="v => set(v)" />');
|
|
952
|
+
});
|
|
953
|
+
|
|
954
|
+
it('renames static camelCase prop (titleId → headerId on dt-banner)', () => {
|
|
955
|
+
const { transformed, count } = transformContent('<dt-banner titleId="hdr" />');
|
|
956
|
+
assert.equal(transformed, '<dt-banner headerId="hdr" />');
|
|
957
|
+
assert.equal(count, 1);
|
|
958
|
+
});
|
|
959
|
+
});
|