@master/css-language-service 2.0.0-rc.5 → 2.0.0-rc.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/common.cjs +57 -0
  2. package/dist/common.d.ts +9 -0
  3. package/dist/common.mjs +48 -0
  4. package/dist/core.cjs +246 -0
  5. package/dist/core.d.ts +29 -0
  6. package/dist/core.mjs +244 -0
  7. package/dist/features/edit-syntax-colors.cjs +19 -0
  8. package/dist/features/edit-syntax-colors.d.ts +4 -0
  9. package/dist/features/edit-syntax-colors.mjs +17 -0
  10. package/dist/features/inspect-syntax.cjs +70 -0
  11. package/dist/features/inspect-syntax.d.ts +4 -0
  12. package/dist/features/inspect-syntax.mjs +68 -0
  13. package/dist/features/render-syntax-colors.cjs +88 -0
  14. package/dist/features/render-syntax-colors.d.ts +4 -0
  15. package/dist/features/render-syntax-colors.mjs +86 -0
  16. package/dist/features/suggest-syntax.cjs +20 -0
  17. package/dist/features/suggest-syntax.d.ts +4 -0
  18. package/dist/features/suggest-syntax.mjs +18 -0
  19. package/dist/index.cjs +29 -0
  20. package/dist/index.d.ts +7 -5
  21. package/dist/index.mjs +7 -0
  22. package/dist/settings.cjs +84 -0
  23. package/dist/settings.d.ts +19 -9
  24. package/dist/settings.mjs +82 -0
  25. package/dist/utils/beautify-css.cjs +13 -0
  26. package/dist/utils/beautify-css.d.ts +1 -0
  27. package/dist/utils/beautify-css.mjs +11 -0
  28. package/dist/utils/convert-color-space.cjs +40 -0
  29. package/dist/utils/convert-color-space.d.ts +2 -0
  30. package/dist/utils/convert-color-space.mjs +38 -0
  31. package/dist/utils/convert-color-token.cjs +28 -0
  32. package/dist/utils/convert-color-token.d.ts +3 -0
  33. package/dist/utils/convert-color-token.mjs +26 -0
  34. package/dist/utils/create-doc.cjs +26 -0
  35. package/dist/utils/create-doc.d.ts +16 -0
  36. package/dist/utils/create-doc.mjs +21 -0
  37. package/dist/utils/css-data-provider.cjs +9 -0
  38. package/dist/utils/css-data-provider.d.ts +3 -0
  39. package/dist/utils/css-data-provider.mjs +7 -0
  40. package/dist/utils/find-matching-brackets.cjs +29 -0
  41. package/dist/utils/find-matching-brackets.d.ts +1 -0
  42. package/dist/utils/find-matching-brackets.mjs +27 -0
  43. package/dist/utils/get-color-completion-items.cjs +30 -0
  44. package/dist/utils/get-color-completion-items.d.ts +3 -0
  45. package/dist/utils/get-color-completion-items.mjs +28 -0
  46. package/dist/utils/get-css-data-documentation.cjs +90 -0
  47. package/dist/utils/get-css-data-documentation.d.ts +5 -0
  48. package/dist/utils/get-css-data-documentation.mjs +88 -0
  49. package/dist/utils/get-main-completion-items.cjs +105 -0
  50. package/dist/utils/get-main-completion-items.d.ts +3 -0
  51. package/dist/utils/get-main-completion-items.mjs +103 -0
  52. package/dist/utils/get-position.cjs +12 -0
  53. package/dist/utils/get-position.d.ts +1 -0
  54. package/dist/utils/get-position.mjs +10 -0
  55. package/dist/utils/get-pseudo-class-completion-items.cjs +65 -0
  56. package/dist/utils/get-pseudo-class-completion-items.d.ts +3 -0
  57. package/dist/utils/get-pseudo-class-completion-items.mjs +63 -0
  58. package/dist/utils/get-pseudo-element-completion-items.cjs +56 -0
  59. package/dist/utils/get-pseudo-element-completion-items.d.ts +3 -0
  60. package/dist/utils/get-pseudo-element-completion-items.mjs +54 -0
  61. package/dist/utils/get-query-completion-items.cjs +102 -0
  62. package/dist/utils/get-query-completion-items.d.ts +3 -0
  63. package/dist/utils/get-query-completion-items.mjs +100 -0
  64. package/dist/utils/get-range.cjs +21 -0
  65. package/dist/utils/get-range.d.ts +2 -0
  66. package/dist/utils/get-range.mjs +19 -0
  67. package/dist/utils/get-utility-info.cjs +32 -0
  68. package/dist/utils/get-utility-info.d.ts +7 -0
  69. package/dist/utils/get-utility-info.mjs +30 -0
  70. package/dist/utils/get-value-completion-items.cjs +185 -0
  71. package/dist/utils/get-value-completion-items.d.ts +3 -0
  72. package/dist/utils/get-value-completion-items.mjs +183 -0
  73. package/dist/utils/query-syntax-completions.cjs +115 -0
  74. package/dist/utils/query-syntax-completions.d.ts +3 -0
  75. package/dist/utils/query-syntax-completions.mjs +113 -0
  76. package/dist/utils/regex.cjs +5 -0
  77. package/dist/utils/regex.mjs +3 -0
  78. package/dist/utils/sort-completion-items.cjs +11 -0
  79. package/dist/utils/sort-completion-items.d.ts +2 -0
  80. package/dist/utils/sort-completion-items.mjs +9 -0
  81. package/package.json +1 -1
  82. package/dist/constant.d.ts +0 -33
  83. package/dist/index.bundle.js +0 -33
  84. package/dist/position-check.d.ts +0 -20
  85. package/dist/providers/color.d.ts +0 -5
  86. package/dist/providers/completion.d.ts +0 -14
  87. package/dist/providers/hover.d.ts +0 -2
  88. package/dist/settings.bundle.js +0 -1
  89. package/dist/utils/get-css-entry-markdown-description.d.ts +0 -1
  90. package/dist/utils/hex-to-rgb.d.ts +0 -2
  91. package/dist/utils/oklab-to-rgb.d.ts +0 -1
  92. package/dist/utils/oklch-to-oklab.d.ts +0 -1
  93. package/dist/utils/to-two-digit-hex.d.ts +0 -1
@@ -0,0 +1,113 @@
1
+ import { CompletionItemKind } from 'vscode-languageserver-protocol';
2
+ import getPseudoClassCompletionItems from './get-pseudo-class-completion-items.mjs';
3
+ import getPseudoElementCompletionItems from './get-pseudo-element-completion-items.mjs';
4
+ import { SELECTOR_SIGNS, ANIMATION_SIGN, TRANSITION_SIGN, AT_SIGN, QUERY_COMPARISON_OPERATORS, QUERY_LOGICAL_OPERATORS, generateCSS, MasterCSS } from '@master/css';
5
+ import { GROUP_TRIGGER_CHARACTER, SELECTOR_TRIGGER_CHARACTERS } from '../common.mjs';
6
+ import getMainCompletionItems from './get-main-completion-items.mjs';
7
+ import getValueCompletionItems from './get-value-completion-items.mjs';
8
+ import getQueryCompletionItems from './get-query-completion-items.mjs';
9
+ import { getCSSDataDocumentation } from './get-css-data-documentation.mjs';
10
+
11
+ function querySyntaxCompletions(q = '', css = new MasterCSS()) {
12
+ const fields = q.split(' ');
13
+ let field = fields[fields.length - 1];
14
+ const triggerCharacter = q.charAt(q.length - 1);
15
+ const invoked = triggerCharacter === ' ' || field.length === 0;
16
+ if (invoked || field === GROUP_TRIGGER_CHARACTER || triggerCharacter === ';') {
17
+ return getMainCompletionItems(css);
18
+ }
19
+ const isGroup = field.startsWith(GROUP_TRIGGER_CHARACTER);
20
+ if (isGroup) {
21
+ const declarationSeparatorMatches = Array.from(field.matchAll(/;(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g));
22
+ if (declarationSeparatorMatches.length) {
23
+ field = field.slice(declarationSeparatorMatches[declarationSeparatorMatches.length - 1].index + 1);
24
+ } else {
25
+ field = field.slice(1);
26
+ }
27
+ }
28
+ const signs = css.definedRules.filter(({ definition })=>definition.sign).map(({ definition })=>definition.sign);
29
+ const keyMatch = field.match(new RegExp(`^[^${signs}'":\\s]+:`));
30
+ const atMatches = Array.from(field.matchAll(/@(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g));
31
+ const valueSeparatorMatch = field.match(/\|(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/g);
32
+ const atInvoked = atMatches.findIndex(({ index })=>index !== 0) !== -1;
33
+ const firstColonIndex = keyMatch ? keyMatch[0].length - 1 : -1;
34
+ const selectorInvokedRegex = new RegExp(`[${SELECTOR_SIGNS.join('')}](?=(?:[^'"]|'[^']*'|"[^"]*")*$)`);
35
+ const key = keyMatch ? keyMatch[0].slice(0, firstColonIndex) : undefined;
36
+ const componentNames = Object.keys(css.config.components || {});
37
+ const utilityNames = Object.keys(css.config.utilities || {});
38
+ const isStyle = !!componentNames.find((eachStyleName)=>new RegExp(`^${eachStyleName}(?:\\b|_)`).test(field));
39
+ const isUtility = !!utilityNames.find((eachUtilityName)=>new RegExp(`^${eachUtilityName}(?:\\b|_)`).test(field));
40
+ // check by utilities and components
41
+ if (!isStyle && !isUtility) {
42
+ if (key === undefined && !valueSeparatorMatch) {
43
+ /**
44
+ * The server capability sets '@' '~' as the trigger characters for at and adjacent selectors,
45
+ * but these two characters are also the prefix symbols of `animation` and `transition`,
46
+ * and should be filtered to prevent hints all completions items.
47
+ * @example class="@"
48
+ * @example class="~"
49
+ */ if (field.startsWith(ANIMATION_SIGN) || field.startsWith(TRANSITION_SIGN)) {
50
+ return getMainCompletionItems(css).filter((completionItem)=>completionItem.label.startsWith(field)).map((completionItem)=>({
51
+ ...completionItem,
52
+ label: completionItem.label.slice(1)
53
+ }));
54
+ }
55
+ return getMainCompletionItems(css);
56
+ }
57
+ if (!atInvoked && !selectorInvokedRegex.test(field.slice(firstColonIndex + 1))) {
58
+ if (field.startsWith(ANIMATION_SIGN) && firstColonIndex === -1) {
59
+ return getValueCompletionItems(css, 'animation');
60
+ } else if (field.startsWith(TRANSITION_SIGN) && firstColonIndex === -1) {
61
+ return getValueCompletionItems(css, 'transition');
62
+ } else if (key && firstColonIndex !== -1) {
63
+ return getValueCompletionItems(css, key);
64
+ }
65
+ }
66
+ }
67
+ /**
68
+ * Not support conditional btn:hover and group
69
+ */ if (isStyle || isGroup) return;
70
+ if (atInvoked && [
71
+ AT_SIGN,
72
+ ...QUERY_COMPARISON_OPERATORS,
73
+ ...QUERY_LOGICAL_OPERATORS
74
+ ].includes(triggerCharacter)) {
75
+ return getQueryCompletionItems(css, triggerCharacter, field);
76
+ }
77
+ if (!atInvoked && SELECTOR_TRIGGER_CHARACTERS.includes(triggerCharacter)) {
78
+ const pseudoElementCompletionItems = getPseudoElementCompletionItems(css, field);
79
+ if (field.endsWith('::')) {
80
+ /**
81
+ * Consider trigger characters and fix insertText.
82
+ * @incorrect class="text:center::" -> class="text:center::::after"
83
+ * @correct class="text:center::" -> class="text:center::after"
84
+ */ pseudoElementCompletionItems.forEach((completionItem)=>completionItem.insertText = completionItem.label.slice(2));
85
+ return pseudoElementCompletionItems;
86
+ } else {
87
+ const completionItems = getPseudoClassCompletionItems(css, field);
88
+ completionItems.push(...pseudoElementCompletionItems);
89
+ /**
90
+ * Consider trigger characters and fix insertText.
91
+ * @incorrect class="text:center:" -> class="text:center::active"
92
+ * @correct class="text:center:" -> class="text:center:active"
93
+ */ if (triggerCharacter === ':') {
94
+ completionItems.forEach((completionItem)=>completionItem.insertText = completionItem.label.slice(1));
95
+ } else {
96
+ completionItems.push({
97
+ label: '.<class>',
98
+ insertText: '.',
99
+ documentation: getCSSDataDocumentation(undefined, {
100
+ generatedCSS: generateCSS([
101
+ field + '.class'
102
+ ], css),
103
+ docs: '/guide/syntax#selectors'
104
+ }),
105
+ kind: CompletionItemKind.Class
106
+ });
107
+ }
108
+ return completionItems;
109
+ }
110
+ }
111
+ }
112
+
113
+ export { querySyntaxCompletions as default };
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ const instancePattern = /[^\s:]+:\w*\(?((?<!\\)["'`])((?:\\\1|(?:(?!\1))\S)*)((?<!\\)\1)\)?|[^\s"'`]+/g;
4
+
5
+ exports.instancePattern = instancePattern;
@@ -0,0 +1,3 @@
1
+ const instancePattern = /[^\s:]+:\w*\(?((?<!\\)["'`])((?:\\\1|(?:(?!\1))\S)*)((?<!\\)\1)\)?|[^\s"'`]+/g;
2
+
3
+ export { instancePattern };
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ /* localeCompare equals to the real vscode completion items sorting */ function sortCompletionItems(items) {
4
+ return items.sort((a, b)=>{
5
+ const sortTextA = a.sortText || a.label;
6
+ const sortTextB = b.sortText || b.label;
7
+ return sortTextA.localeCompare(sortTextB);
8
+ });
9
+ }
10
+
11
+ module.exports = sortCompletionItems;
@@ -0,0 +1,2 @@
1
+ import type { CompletionItem } from 'vscode-languageserver-protocol';
2
+ export default function sortCompletionItems(items: CompletionItem[]): CompletionItem[];
@@ -0,0 +1,9 @@
1
+ /* localeCompare equals to the real vscode completion items sorting */ function sortCompletionItems(items) {
2
+ return items.sort((a, b)=>{
3
+ const sortTextA = a.sortText || a.label;
4
+ const sortTextB = b.sortText || b.label;
5
+ return sortTextA.localeCompare(sortTextB);
6
+ });
7
+ }
8
+
9
+ export { sortCompletionItems as default };
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@master/css-language-service","scripts":{"build":"techor pack --platform node --declare","dev":"pnpm run build --watch","type-check":"tsc --noEmit","lint":"eslint src"},"description":"Master CSS Language Service","author":"Aoyue Design LLC.","license":"MIT","dependencies":{"@babel/parser":"^7.22.7","@master/css":"^2.0.0-rc.5","color-convert":"^2.0.1","js-beautify":"^1.14.7"},"devDependencies":{"@types/color-convert":"^2.0.0","vscode-css-languageservice":"^6.2.5","vscode-languageserver-types":"^3.17.3"},"main":"./dist/index.bundle.js","types":"./dist/index.d.ts","exports":{".":"./dist/index.bundle.js","./settings":"./dist/settings.bundle.js"},"typesVersions":{"*":{"./":["./dist/index.d.ts"],"./settings":["./dist/settings.d.ts"]}},"files":["dist"],"publishConfig":{"access":"public"},"version":"2.0.0-rc.5"}
1
+ {"name":"@master/css-language-service","type":"module","scripts":{"build":"techor build \"src/**/*.ts\"","dev":"pnpm build --watch","type-check":"tsc --noEmit","lint":"eslint","test":"vitest"},"description":"Master CSS Language Service","author":"Aoyue Design LLC.","license":"MIT","repository":{"type":"git","url":"https://github.com/master-co/css.git","directory":"packages/language-service"},"dependencies":{"@babel/parser":"^7.26.3","@master/css":"^2.0.0-rc.50","@techor/extend":"^3.1.7","color-convert":"^2.0.1","color-rgba":"^3.0.0","color-space":"^2.0.1","culori":"^4.0.1","js-beautify":"^1.15.1","lodash.escaperegexp":"^4.1.2","minimatch":"^10.0.1","pex-color":"^2.2.0","vscode-css-languageservice":"^6.3.2","vscode-languageserver-protocol":"^3.17.5","vscode-languageserver-textdocument":"^1.0.12"},"devDependencies":{"@types/chroma-js":"^2.4.5","@types/color-convert":"^2.0.4","@types/color-rgba":"^2.1.3","@types/culori":"^2.1.1","@types/lodash.escaperegexp":"^4.1.9","@types/vscode":"^1.96.0","shared":"^2.0.0-rc.50","vscode-languageserver":"^9.0.1"},"sideEffects":false,"main":"./dist/index.cjs","module":"./dist/index.mjs","jsnext:main":"./dist/index.mjs","esnext":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.cjs"}},"files":["dist"],"publishConfig":{"access":"public","provenance":true},"version":"2.0.0-rc.50"}
@@ -1,33 +0,0 @@
1
- import type { CompletionItem } from 'vscode-languageserver-types';
2
- interface MasterCssKey {
3
- key: string[];
4
- colored: boolean;
5
- values: Array<string | CompletionItem>;
6
- }
7
- export declare const masterCssSelectors: (string | {
8
- label: string;
9
- kind: number;
10
- })[];
11
- export declare const masterCssElements: (string | {
12
- label: string;
13
- kind: number;
14
- })[];
15
- export declare const masterCssMedia: (string | {
16
- label: string;
17
- kind: number;
18
- })[];
19
- export declare const masterCssOtherKeys: string[];
20
- export declare const masterCssCommonValues: (string | {
21
- label: string;
22
- kind: number;
23
- })[];
24
- export declare const commonUnit: any;
25
- export declare const masterCssKeyValues: MasterCssKey[];
26
- export declare const masterCssType: {
27
- type: string;
28
- values: (string | {
29
- label: string;
30
- kind: number;
31
- })[];
32
- }[];
33
- export {};