skyux-stylelint 14.1.0 → 14.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skyux-stylelint",
3
- "version": "14.1.0",
3
+ "version": "14.2.0",
4
4
  "author": "Blackbaud, Inc.",
5
5
  "description": "Stylelint plugin for SKY UX projects",
6
6
  "keywords": [
@@ -23,6 +23,7 @@
23
23
  "stylelint": "^17.1.0"
24
24
  },
25
25
  "dependencies": {
26
+ "@blackbaud/skyux-design-tokens": "6.0.0",
26
27
  "tslib": "^2.8.1"
27
28
  },
28
29
  "type": "module",
package/src/index.js CHANGED
@@ -1,8 +1,12 @@
1
+ import noDeprecatedSkyScssVariables from './rules/no-deprecated-sky-scss-variables.js';
2
+ import noInvalidSkyCustomProperties from './rules/no-invalid-sky-custom-properties.js';
1
3
  import noNgDeep from './rules/no-ng-deep.js';
2
4
  import noSkySelectors from './rules/no-sky-selectors.js';
3
5
  import noSkyThemeImports from './rules/no-sky-theme-imports.js';
4
6
  import noStaticColorValues from './rules/no-static-color-values.js';
5
7
  export default [
8
+ noDeprecatedSkyScssVariables,
9
+ noInvalidSkyCustomProperties,
6
10
  noNgDeep,
7
11
  noSkySelectors,
8
12
  noSkyThemeImports,
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/sdk/skyux-stylelint/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,mBAAmB,MAAM,mCAAmC,CAAC;AAEpE,eAAe;IACb,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,mBAAmB;CACpB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/sdk/skyux-stylelint/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,MAAM,6CAA6C,CAAC;AACvF,OAAO,4BAA4B,MAAM,6CAA6C,CAAC;AACvF,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,cAAc,MAAM,6BAA6B,CAAC;AACzD,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,mBAAmB,MAAM,mCAAmC,CAAC;AAEpE,eAAe;IACb,4BAA4B;IAC5B,4BAA4B;IAC5B,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,mBAAmB;CACpB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import stylelint from 'stylelint';
2
+ export declare const ruleName: string;
3
+ declare const _default: stylelint.Plugin;
4
+ export default _default;
@@ -0,0 +1,67 @@
1
+ import stylelint from 'stylelint';
2
+ import { getRuleMeta } from '../utility/meta.js';
3
+ import { withNamespace } from '../utility/namespace.js';
4
+ import { deprecatedScssVarMap } from '../utility/style-public-api.js';
5
+ const ruleId = 'no-deprecated-sky-scss-variables';
6
+ export const ruleName = withNamespace(ruleId);
7
+ const STYLE_API_DOCS_URL = 'https://developer.blackbaud.com/skyux/design/styles';
8
+ const SCSS_VAR_PATTERN = /\$sky-[a-z0-9-]+/g;
9
+ const messages = stylelint.utils.ruleMessages(ruleName, {
10
+ deprecatedWithReplacement: (variable, replacement) => `"${variable}" is deprecated. Use "var(${replacement})" instead.`,
11
+ deprecatedNoReplacement: (variable) => `"${variable}" is deprecated with no direct replacement. See the style API documentation: ${STYLE_API_DOCS_URL}`,
12
+ privateVariable: (variable) => `"${variable}" is a private or obsolete SKY UX SCSS variable. To find an alternative, see the style API documentation: ${STYLE_API_DOCS_URL}`,
13
+ });
14
+ const ruleBase = (options) => {
15
+ return (root, result) => {
16
+ const validOptions = stylelint.utils.validateOptions(result, ruleName, {
17
+ actual: options,
18
+ possible: [true],
19
+ });
20
+ if (!validOptions) {
21
+ return;
22
+ }
23
+ root.walkDecls((decl) => {
24
+ const { value } = decl;
25
+ let match;
26
+ SCSS_VAR_PATTERN.lastIndex = 0;
27
+ while ((match = SCSS_VAR_PATTERN.exec(value)) !== null) {
28
+ const variable = match[0];
29
+ if (!deprecatedScssVarMap.has(variable)) {
30
+ stylelint.utils.report({
31
+ result,
32
+ ruleName,
33
+ message: messages.privateVariable(variable),
34
+ node: decl,
35
+ });
36
+ continue;
37
+ }
38
+ const replacement = deprecatedScssVarMap.get(variable);
39
+ if (replacement) {
40
+ stylelint.utils.report({
41
+ result,
42
+ ruleName,
43
+ message: messages.deprecatedWithReplacement(variable, replacement),
44
+ node: decl,
45
+ fix() {
46
+ decl.value = decl.value.replace(variable, `var(${replacement})`);
47
+ },
48
+ });
49
+ }
50
+ else {
51
+ stylelint.utils.report({
52
+ result,
53
+ ruleName,
54
+ message: messages.deprecatedNoReplacement(variable),
55
+ node: decl,
56
+ });
57
+ }
58
+ }
59
+ });
60
+ };
61
+ };
62
+ const rule = ruleBase;
63
+ rule.messages = messages;
64
+ rule.meta = getRuleMeta({ fixable: true, ruleId });
65
+ rule.ruleName = ruleName;
66
+ export default stylelint.createPlugin(ruleName, rule);
67
+ //# sourceMappingURL=no-deprecated-sky-scss-variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-deprecated-sky-scss-variables.js","sourceRoot":"","sources":["../../../../../../libs/sdk/skyux-stylelint/src/rules/no-deprecated-sky-scss-variables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import stylelint from 'stylelint';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { testRule } from '../testing/test-rule.js';
4
+ import plugin, { ruleName } from './no-deprecated-sky-scss-variables.js';
5
+ vi.mock('../utility/style-public-api.js', () => ({
6
+ deprecatedScssVarMap: new Map([
7
+ ['$sky-deprecated-var', '--sky-theme-replacement'],
8
+ ['$sky-deprecated-var-2', '--sky-theme-replacement-2'],
9
+ ['$sky-deprecated-no-replacement', undefined],
10
+ ]),
11
+ }));
12
+ describe(ruleName, () => {
13
+ testRule({
14
+ plugins: [plugin],
15
+ ruleName,
16
+ config: true,
17
+ fix: true,
18
+ customSyntax: 'postcss-scss',
19
+ accept: [
20
+ {
21
+ code: 'a { margin-top: 8px; }',
22
+ description: 'plain values are allowed',
23
+ },
24
+ {
25
+ code: '$my-own-var: 8px;',
26
+ description: 'non-sky SCSS variables are allowed',
27
+ },
28
+ {
29
+ code: 'a { margin-top: var(--sky-theme-mock-prop); }',
30
+ description: 'CSS custom properties are not matched against this rule',
31
+ },
32
+ ],
33
+ reject: [
34
+ {
35
+ code: 'a { margin-top: $sky-deprecated-var; }',
36
+ description: 'deprecated $sky- SCSS variable with replacement should error',
37
+ warnings: [
38
+ {
39
+ message: '"$sky-deprecated-var" is deprecated. Use "var(--sky-theme-replacement)" instead.',
40
+ },
41
+ ],
42
+ fixed: 'a { margin-top: var(--sky-theme-replacement); }',
43
+ },
44
+ {
45
+ code: 'a { margin-left: $sky-deprecated-no-replacement; }',
46
+ description: 'deprecated $sky- SCSS variable with no replacement should error',
47
+ unfixable: true,
48
+ warnings: [
49
+ {
50
+ message: '"$sky-deprecated-no-replacement" is deprecated with no direct replacement. See the style API documentation: https://developer.blackbaud.com/skyux/design/styles',
51
+ },
52
+ ],
53
+ },
54
+ {
55
+ code: 'a { margin: $sky-my-custom-variable; }',
56
+ description: 'unknown $sky- SCSS variables are flagged as private or obsolete',
57
+ warnings: [
58
+ {
59
+ message: '"$sky-my-custom-variable" is a private or obsolete SKY UX SCSS variable. To find an alternative, see the style API documentation: https://developer.blackbaud.com/skyux/design/styles',
60
+ },
61
+ ],
62
+ unfixable: true,
63
+ },
64
+ {
65
+ code: 'a { margin: $sky-deprecated-var $sky-deprecated-var-2; }',
66
+ description: 'multiple deprecated SCSS variables in one declaration should each error and be replaced',
67
+ warnings: [
68
+ {
69
+ message: '"$sky-deprecated-var" is deprecated. Use "var(--sky-theme-replacement)" instead.',
70
+ },
71
+ {
72
+ message: '"$sky-deprecated-var-2" is deprecated. Use "var(--sky-theme-replacement-2)" instead.',
73
+ },
74
+ ],
75
+ fixed: 'a { margin: var(--sky-theme-replacement) var(--sky-theme-replacement-2); }',
76
+ },
77
+ ],
78
+ });
79
+ it('should not report when options are invalid', async () => {
80
+ const result = await stylelint.lint({
81
+ code: 'a { color: red; }',
82
+ config: {
83
+ plugins: [plugin],
84
+ rules: { [ruleName]: ['invalid-value'] },
85
+ },
86
+ customSyntax: 'postcss-scss',
87
+ });
88
+ expect(result.results[0].warnings).toHaveLength(0);
89
+ expect(result.results[0].invalidOptionWarnings).toHaveLength(1);
90
+ });
91
+ });
92
+ //# sourceMappingURL=no-deprecated-sky-scss-variables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-deprecated-sky-scss-variables.test.js","sourceRoot":"","sources":["../../../../../../libs/sdk/skyux-stylelint/src/rules/no-deprecated-sky-scss-variables.test.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,OAAO,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,oBAAoB,EAAE,IAAI,GAAG,CAAC;QAC5B,CAAC,qBAAqB,EAAE,yBAAyB,CAAC;QAClD,CAAC,uBAAuB,EAAE,2BAA2B,CAAC;QACtD,CAAC,gCAAgC,EAAE,SAAS,CAAC;KAC9C,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,QAAQ,CAAC;QACP,OAAO,EAAE,CAAC,MAAM,CAAC;QACjB,QAAQ;QACR,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,IAAI;QACT,YAAY,EAAE,cAAc;QAC5B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,WAAW,EAAE,0BAA0B;aACxC;YACD;gBACE,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,oCAAoC;aAClD;YACD;gBACE,IAAI,EAAE,+CAA+C;gBACrD,WAAW,EAAE,yDAAyD;aACvE;SACF;QACD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,wCAAwC;gBAC9C,WAAW,EACT,8DAA8D;gBAChE,QAAQ,EAAE;oBACR;wBACE,OAAO,EACL,kFAAkF;qBACrF;iBACF;gBACD,KAAK,EAAE,iDAAiD;aACzD;YACD;gBACE,IAAI,EAAE,oDAAoD;gBAC1D,WAAW,EACT,iEAAiE;gBACnE,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE;oBACR;wBACE,OAAO,EACL,iKAAiK;qBACpK;iBACF;aACF;YACD;gBACE,IAAI,EAAE,wCAAwC;gBAC9C,WAAW,EACT,iEAAiE;gBACnE,QAAQ,EAAE;oBACR;wBACE,OAAO,EACL,uLAAuL;qBAC1L;iBACF;gBACD,SAAS,EAAE,IAAI;aAChB;YACD;gBACE,IAAI,EAAE,0DAA0D;gBAChE,WAAW,EACT,yFAAyF;gBAC3F,QAAQ,EAAE;oBACR;wBACE,OAAO,EACL,kFAAkF;qBACrF;oBACD;wBACE,OAAO,EACL,sFAAsF;qBACzF;iBACF;gBACD,KAAK,EACH,4EAA4E;aAC/E;SACF;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;YAClC,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC,MAAM,CAAC;gBACjB,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE;aACzC;YACD,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import stylelint from 'stylelint';
2
+ export declare const ruleName: string;
3
+ declare const _default: stylelint.Plugin;
4
+ export default _default;
@@ -0,0 +1,79 @@
1
+ import stylelint from 'stylelint';
2
+ import { getRuleMeta } from '../utility/meta.js';
3
+ import { withNamespace } from '../utility/namespace.js';
4
+ import { deprecatedCustomPropsMap, validThemeCustomProperties, } from '../utility/style-public-api.js';
5
+ const ruleId = 'no-invalid-sky-custom-properties';
6
+ export const ruleName = withNamespace(ruleId);
7
+ const STYLE_API_DOCS_URL = 'https://developer.blackbaud.com/skyux/design/styles';
8
+ const CUSTOM_PROPERTY_PATTERN = /var\(\s*(--sky-[a-z0-9-]+)[^)]*\)/g;
9
+ const messages = stylelint.utils.ruleMessages(ruleName, {
10
+ deprecatedWithReplacement: (prop, replacement) => `"${prop}" is deprecated. Use "${replacement}" instead.`,
11
+ deprecatedNoReplacement: (prop) => `"${prop}" is deprecated with no direct replacement. See the style API documentation: ${STYLE_API_DOCS_URL}`,
12
+ unknownThemeCustomProperty: (prop) => `"${prop}" is not a known --sky-theme- custom property. See the style API documentation for valid custom properties: ${STYLE_API_DOCS_URL}`,
13
+ privateCustomProperty: (prop) => `"${prop}" is a private SKY UX custom property and should not be used directly. To find an alternative, check the style API documentation: ${STYLE_API_DOCS_URL}`,
14
+ });
15
+ const ruleBase = (options) => {
16
+ return (root, result) => {
17
+ const validOptions = stylelint.utils.validateOptions(result, ruleName, {
18
+ actual: options,
19
+ possible: [true],
20
+ });
21
+ if (!validOptions) {
22
+ return;
23
+ }
24
+ root.walkDecls((decl) => {
25
+ const { value } = decl;
26
+ let match;
27
+ CUSTOM_PROPERTY_PATTERN.lastIndex = 0;
28
+ while ((match = CUSTOM_PROPERTY_PATTERN.exec(value)) !== null) {
29
+ const prop = match[1];
30
+ if (prop.startsWith('--sky-theme-')) {
31
+ if (!validThemeCustomProperties.has(prop)) {
32
+ stylelint.utils.report({
33
+ result,
34
+ ruleName,
35
+ message: messages.unknownThemeCustomProperty(prop),
36
+ node: decl,
37
+ });
38
+ }
39
+ continue;
40
+ }
41
+ if (deprecatedCustomPropsMap.has(prop)) {
42
+ const replacement = deprecatedCustomPropsMap.get(prop);
43
+ if (replacement) {
44
+ stylelint.utils.report({
45
+ result,
46
+ ruleName,
47
+ message: messages.deprecatedWithReplacement(prop, replacement),
48
+ node: decl,
49
+ fix() {
50
+ decl.value = decl.value.replace(prop, replacement);
51
+ },
52
+ });
53
+ }
54
+ else {
55
+ stylelint.utils.report({
56
+ result,
57
+ ruleName,
58
+ message: messages.deprecatedNoReplacement(prop),
59
+ node: decl,
60
+ });
61
+ }
62
+ continue;
63
+ }
64
+ stylelint.utils.report({
65
+ result,
66
+ ruleName,
67
+ message: messages.privateCustomProperty(prop),
68
+ node: decl,
69
+ });
70
+ }
71
+ });
72
+ };
73
+ };
74
+ const rule = ruleBase;
75
+ rule.messages = messages;
76
+ rule.meta = getRuleMeta({ fixable: true, ruleId });
77
+ rule.ruleName = ruleName;
78
+ export default stylelint.createPlugin(ruleName, rule);
79
+ //# sourceMappingURL=no-invalid-sky-custom-properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-sky-custom-properties.js","sourceRoot":"","sources":["../../../../../../libs/sdk/skyux-stylelint/src/rules/no-invalid-sky-custom-properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import stylelint from 'stylelint';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ import { testRule } from '../testing/test-rule.js';
4
+ import plugin, { ruleName } from './no-invalid-sky-custom-properties.js';
5
+ vi.mock('../utility/style-public-api.js', () => ({
6
+ deprecatedCustomPropsMap: new Map([
7
+ ['--sky-deprecated-prop', '--sky-theme-replacement'],
8
+ ['--sky-deprecated-prop-2', '--sky-theme-replacement-2'],
9
+ ['--sky-deprecated-no-replacement', undefined],
10
+ ]),
11
+ validThemeCustomProperties: new Set([
12
+ '--sky-theme-replacement',
13
+ '--sky-theme-replacement-2',
14
+ '--sky-theme-valid-prop',
15
+ ]),
16
+ }));
17
+ describe(ruleName, () => {
18
+ testRule({
19
+ plugins: [plugin],
20
+ ruleName,
21
+ config: true,
22
+ fix: true,
23
+ accept: [
24
+ {
25
+ code: 'a { color: red; }',
26
+ description: 'declarations without sky- custom properties are allowed',
27
+ },
28
+ {
29
+ code: 'a { margin-top: var(--my-token); }',
30
+ description: 'non-sky custom properties are allowed',
31
+ },
32
+ {
33
+ code: 'a { margin-top: var(--sky-theme-valid-prop); }',
34
+ description: 'valid --sky-theme- custom properties are allowed',
35
+ },
36
+ {
37
+ code: 'a { margin-top: var(--sky-theme-replacement); }',
38
+ description: 'the replacement target is itself a valid custom property',
39
+ },
40
+ ],
41
+ reject: [
42
+ {
43
+ code: 'a { color: var(--sky-deprecated-prop); }',
44
+ description: 'deprecated custom property with replacement should error',
45
+ warnings: [
46
+ {
47
+ message: '"--sky-deprecated-prop" is deprecated. Use "--sky-theme-replacement" instead.',
48
+ },
49
+ ],
50
+ fixed: 'a { color: var(--sky-theme-replacement); }',
51
+ },
52
+ {
53
+ code: 'a { color: var(--sky-deprecated-no-replacement); }',
54
+ description: 'deprecated custom property with no replacement should error',
55
+ unfixable: true,
56
+ warnings: [
57
+ {
58
+ message: '"--sky-deprecated-no-replacement" is deprecated with no direct replacement. See the style API documentation: https://developer.blackbaud.com/skyux/design/styles',
59
+ },
60
+ ],
61
+ },
62
+ {
63
+ code: 'a { margin-top: var(--sky-theme-unknown-token); }',
64
+ description: 'unknown --sky-theme- custom property should error',
65
+ unfixable: true,
66
+ warnings: [
67
+ {
68
+ message: '"--sky-theme-unknown-token" is not a known --sky-theme- custom property. See the style API documentation for valid custom properties: https://developer.blackbaud.com/skyux/design/styles',
69
+ },
70
+ ],
71
+ },
72
+ {
73
+ code: 'a { margin-top: var(--sky-private-internal); }',
74
+ description: 'private --sky- custom property should error',
75
+ unfixable: true,
76
+ warnings: [
77
+ {
78
+ message: '"--sky-private-internal" is a private SKY UX custom property and should not be used directly. To find an alternative, check the style API documentation: https://developer.blackbaud.com/skyux/design/styles',
79
+ },
80
+ ],
81
+ },
82
+ {
83
+ code: 'a { margin: var(--sky-deprecated-prop) var(--sky-deprecated-prop-2); }',
84
+ description: 'multiple deprecated custom properties in one declaration should each error and be replaced',
85
+ warnings: [
86
+ {
87
+ message: '"--sky-deprecated-prop" is deprecated. Use "--sky-theme-replacement" instead.',
88
+ },
89
+ {
90
+ message: '"--sky-deprecated-prop-2" is deprecated. Use "--sky-theme-replacement-2" instead.',
91
+ },
92
+ ],
93
+ fixed: 'a { margin: var(--sky-theme-replacement) var(--sky-theme-replacement-2); }',
94
+ },
95
+ ],
96
+ });
97
+ it('should not report when options are invalid', async () => {
98
+ const result = await stylelint.lint({
99
+ code: 'a { color: red; }',
100
+ config: {
101
+ plugins: [plugin],
102
+ rules: { [ruleName]: ['invalid-value'] },
103
+ },
104
+ });
105
+ expect(result.results[0].warnings).toHaveLength(0);
106
+ expect(result.results[0].invalidOptionWarnings).toHaveLength(1);
107
+ });
108
+ });
109
+ //# sourceMappingURL=no-invalid-sky-custom-properties.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-invalid-sky-custom-properties.test.js","sourceRoot":"","sources":["../../../../../../libs/sdk/skyux-stylelint/src/rules/no-invalid-sky-custom-properties.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Maps each deprecated custom property name to its replacement custom property,
3
+ * or undefined if the parent token has no canonical customProperty.
4
+ */
5
+ export declare const deprecatedCustomPropsMap: Map<string, string | undefined>;
6
+ /**
7
+ * All canonical custom property names defined in public-api-tokens.json.
8
+ */
9
+ export declare const validThemeCustomProperties: Set<string>;
10
+ /**
11
+ * Maps each deprecated SCSS variable name to its replacement custom property,
12
+ * or undefined if the parent token has no canonical customProperty.
13
+ */
14
+ export declare const deprecatedScssVarMap: Map<string, string | undefined>;
@@ -0,0 +1,40 @@
1
+ import { createRequire } from 'node:module';
2
+ const require = createRequire(import.meta.url);
3
+ const publicApiTokens = require('@blackbaud/skyux-design-tokens/bundles/public-api-tokens.json');
4
+ /**
5
+ * Recursively walks token groups and calls the callback for each token.
6
+ */
7
+ function walkTokens(groups, tokens, callback) {
8
+ for (const token of tokens ?? []) {
9
+ callback(token);
10
+ }
11
+ for (const group of groups ?? []) {
12
+ walkTokens(group.groups, group.tokens, callback);
13
+ }
14
+ }
15
+ /**
16
+ * Maps each deprecated custom property name to its replacement custom property,
17
+ * or undefined if the parent token has no canonical customProperty.
18
+ */
19
+ export const deprecatedCustomPropsMap = new Map();
20
+ /**
21
+ * All canonical custom property names defined in public-api-tokens.json.
22
+ */
23
+ export const validThemeCustomProperties = new Set();
24
+ /**
25
+ * Maps each deprecated SCSS variable name to its replacement custom property,
26
+ * or undefined if the parent token has no canonical customProperty.
27
+ */
28
+ export const deprecatedScssVarMap = new Map();
29
+ walkTokens(publicApiTokens.groups, publicApiTokens.tokens, (token) => {
30
+ if (token.customProperty) {
31
+ validThemeCustomProperties.add(token.customProperty);
32
+ }
33
+ for (const prop of token.deprecatedCustomProperties ?? []) {
34
+ deprecatedCustomPropsMap.set(prop, token.customProperty);
35
+ }
36
+ for (const variable of token.deprecatedScssVariables ?? []) {
37
+ deprecatedScssVarMap.set(variable, token.customProperty);
38
+ }
39
+ });
40
+ //# sourceMappingURL=style-public-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-public-api.js","sourceRoot":"","sources":["../../../../../../libs/sdk/skyux-stylelint/src/utility/style-public-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAoB5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,eAAe,GACnB,OAAO,CAAC,+DAA+D,CAAoB,CAAC;AAE9F;;GAEG;AACH,SAAS,UAAU,CACjB,MAAyC,EACzC,MAAoC,EACpC,QAAyC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,IAAI,GAAG,EAAE,CAAC;AAEZ;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAgB,IAAI,GAAG,EAAE,CAAC;AAEjE;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAoC,IAAI,GAAG,EAAE,CAAC;AAE/E,UAAU,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;IACnE,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,EAAE,CAAC;QAC1D,wBAAwB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,EAAE,CAAC;QAC3D,oBAAoB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { deprecatedCustomPropsMap, deprecatedScssVarMap, validThemeCustomProperties, } from './style-public-api.js';
3
+ describe('style-public-api', () => {
4
+ describe('validThemeCustomProperties', () => {
5
+ it('contains known --sky-theme- custom properties from public-api-tokens.json', () => {
6
+ expect(validThemeCustomProperties.has('--sky-theme-color-background-page')).toBe(true);
7
+ expect(validThemeCustomProperties.has('--sky-theme-color-text-default')).toBe(true);
8
+ });
9
+ it('does not contain deprecated custom property names', () => {
10
+ expect(validThemeCustomProperties.has('--sky-background-color-page-default')).toBe(false);
11
+ expect(validThemeCustomProperties.has('--sky-text-color-default')).toBe(false);
12
+ });
13
+ });
14
+ describe('deprecatedCustomPropsMap', () => {
15
+ it('maps deprecated custom properties to their replacements', () => {
16
+ expect(deprecatedCustomPropsMap.get('--sky-background-color-page-default')).toBe('--sky-theme-color-background-page');
17
+ expect(deprecatedCustomPropsMap.get('--sky-text-color-default')).toBe('--sky-theme-color-text-default');
18
+ });
19
+ });
20
+ describe('deprecatedScssVarMap', () => {
21
+ it('maps deprecated SCSS variables to their replacement custom properties', () => {
22
+ expect(deprecatedScssVarMap.get('$sky-margin-stacked-compact')).toBe('--sky-theme-space-stacked-xs');
23
+ expect(deprecatedScssVarMap.get('$sky-margin-inline-default')).toBe('--sky-theme-space-inline-s');
24
+ });
25
+ });
26
+ });
27
+ //# sourceMappingURL=style-public-api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style-public-api.test.js","sourceRoot":"","sources":["../../../../../../libs/sdk/skyux-stylelint/src/utility/style-public-api.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;YACnF,MAAM,CACJ,0BAA0B,CAAC,GAAG,CAAC,mCAAmC,CAAC,CACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,CACJ,0BAA0B,CAAC,GAAG,CAAC,gCAAgC,CAAC,CACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CACJ,0BAA0B,CAAC,GAAG,CAAC,qCAAqC,CAAC,CACtE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,CAAC,0BAA0B,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CACrE,KAAK,CACN,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,CACJ,wBAAwB,CAAC,GAAG,CAAC,qCAAqC,CAAC,CACpE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAC5C,MAAM,CAAC,wBAAwB,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CACnE,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;YAC/E,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAClE,8BAA8B,CAC/B,CAAC;YACF,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CACjE,4BAA4B,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}