From d2969e9f938e241a192add81c76b4f4684353f70 Mon Sep 17 00:00:00 2001 From: Romain Menke Date: Sun, 25 Aug 2024 00:25:46 +0200 Subject: [PATCH 01/66] css-syntax-for-csstree --- package-lock.json | 59 +- packages/css-syntax-for-csstree/index.mjs | 72 + packages/css-syntax-for-csstree/package.json | 79 + .../properties-syntax.json | 1814 +++++++++++++++++ .../css-syntax-for-csstree/types-syntax.json | 1019 +++++++++ 5 files changed, 3040 insertions(+), 3 deletions(-) create mode 100644 packages/css-syntax-for-csstree/index.mjs create mode 100644 packages/css-syntax-for-csstree/package.json create mode 100644 packages/css-syntax-for-csstree/properties-syntax.json create mode 100644 packages/css-syntax-for-csstree/types-syntax.json diff --git a/package-lock.json b/package-lock.json index 0115c4087a..4cef9f27bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2052,6 +2052,10 @@ "resolved": "packages/css-parser-algorithms", "link": true }, + "node_modules/@csstools/css-syntax-for-csstree": { + "resolved": "packages/css-syntax-for-csstree", + "link": true + }, "node_modules/@csstools/css-tokenizer": { "resolved": "packages/css-tokenizer", "link": true @@ -4031,9 +4035,9 @@ } }, "node_modules/@webref/css": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/@webref/css/-/css-6.14.1.tgz", - "integrity": "sha512-269+WydfyUJLJOsDOV77uobzRWuyc9QbjmvJ24ffyZJm8XbrSWSE1WMpYu2me4KsvKr6dqIAwXMKzGuPi8bz9g==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/@webref/css/-/css-6.14.2.tgz", + "integrity": "sha512-iHItMjpRQb8kyw7GXInvUt3tnsO234Q40SKNAjMnKHLDwg0SnZgxgFX74oNBIIGoNesEZDReUFrGOLN2K9SW+w==", "dev": true, "peerDependencies": { "css-tree": "^2.3.1" @@ -9409,6 +9413,55 @@ "@csstools/css-tokenizer": "^3.0.1" } }, + "packages/css-syntax": { + "version": "0.0.0", + "extraneous": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "devDependencies": { + "@webref/css": "^6.14.2", + "css-tree": "^2.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "packages/css-syntax-for-csstree": { + "version": "0.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "devDependencies": { + "@webref/css": "^6.14.2", + "css-tree": "^2.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "packages/css-tokenizer": { "name": "@csstools/css-tokenizer", "version": "3.0.1", diff --git a/packages/css-syntax-for-csstree/index.mjs b/packages/css-syntax-for-csstree/index.mjs new file mode 100644 index 0000000000..88504d25be --- /dev/null +++ b/packages/css-syntax-for-csstree/index.mjs @@ -0,0 +1,72 @@ +import fs from 'fs/promises'; +import { fork, definitionSyntax } from 'css-tree'; + + +const propertiesSyntax = { + overflow: '| overlay', // csstree/csstree#248 + width: '| min-intrinsic | -moz-min-content | -moz-available | -webkit-fill-available', // csstree/csstree#242 + 'field-sizing': 'content | fixed', + 'text-box-edge': + 'auto | [ text | cap | ex | ideographic | ideographic-ink ] [ text | alphabetic | ideographic | ideographic-ink ]?', + 'text-box-trim': 'none | trim-start | trim-end | trim-both', + 'text-spacing-trim': 'normal | space-all | space-first | trim-start', + 'text-wrap-style': 'auto | balance | pretty | stable', + 'word-break': '| auto-phrase | auto-phrase', +}; + +const forkedLexer = fork({ + properties: {}, + types: {}, +}).lexer; + +{ + const propertiesSyntax = Object(null); + + for (const key in forkedLexer.properties) { + if (!Object.prototype.hasOwnProperty.call(forkedLexer.properties, key)) { + continue; + } + + if (!forkedLexer.properties[key].syntax) { + console.log('no syntax for property', key); + + continue; + } + + propertiesSyntax[key] = { + 'syntax': definitionSyntax.generate(forkedLexer.properties[key].syntax), + }; + } + + await fs.writeFile( + 'properties-syntax.json', + JSON.stringify(propertiesSyntax, null, '\t'), + 'utf-8', + ); +} + +{ + const typesSyntax = Object(null); + + for (const key in forkedLexer.types) { + if (!Object.prototype.hasOwnProperty.call(forkedLexer.types, key)) { + continue; + } + + if (!forkedLexer.types[key].syntax) { + console.log('no syntax for type', key); + + continue; + } + + typesSyntax[key] = { + 'syntax': definitionSyntax.generate(forkedLexer.types[key].syntax), + }; + } + + await fs.writeFile( + 'types-syntax.json', + JSON.stringify(typesSyntax, null, '\t'), + 'utf-8', + ); +} diff --git a/packages/css-syntax-for-csstree/package.json b/packages/css-syntax-for-csstree/package.json new file mode 100644 index 0000000000..ddff6c6d85 --- /dev/null +++ b/packages/css-syntax-for-csstree/package.json @@ -0,0 +1,79 @@ +{ + "name": "@csstools/css-syntax-for-csstree", + "description": "CSS syntax data for CSS tree", + "version": "0.0.0", + "contributors": [ + { + "name": "Antonio Laguna", + "email": "antonio@laguna.es", + "url": "https://antonio.laguna.es" + }, + { + "name": "Romain Menke", + "email": "romainmenke@gmail.com" + } + ], + "license": "MIT-0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "type": "module", + "main": "dist/index.cjs", + "module": "dist/index.mjs", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.mjs" + }, + "require": { + "default": "./dist/index.cjs" + } + } + }, + "files": [ + "CHANGELOG.md", + "LICENSE.md", + "README.md", + "dist" + ], + "peerDependencies": { + "postcss": "^8.4" + }, + "devDependencies": { + "css-tree": "^2.3.1", + "@webref/css": "^6.14.2" + }, + "scripts": { + "build": "rollup -c ../../rollup/default.mjs", + "docs": "node ../../.github/bin/generate-docs/api-documenter.mjs", + "lint": "node ../../.github/bin/format-package-json.mjs", + "prepublishOnly": "npm run build && npm run test", + "test": "node --test" + }, + "homepage": "https://github.com/csstools/postcss-plugins/tree/main/packages/utilities#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/csstools/postcss-plugins.git", + "directory": "packages/utilities" + }, + "bugs": "https://github.com/csstools/postcss-plugins/issues", + "keywords": [ + "css", + "syntax", + "csstree" + ], + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/css-syntax-for-csstree/properties-syntax.json b/packages/css-syntax-for-csstree/properties-syntax.json new file mode 100644 index 0000000000..cc5ca572ed --- /dev/null +++ b/packages/css-syntax-for-csstree/properties-syntax.json @@ -0,0 +1,1814 @@ +{ + "--*": { + "syntax": "" + }, + "-ms-accelerator": { + "syntax": "false | true" + }, + "-ms-block-progression": { + "syntax": "tb | rl | bt | lr" + }, + "-ms-content-zoom-chaining": { + "syntax": "none | chained" + }, + "-ms-content-zooming": { + "syntax": "none | zoom" + }, + "-ms-content-zoom-limit": { + "syntax": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>" + }, + "-ms-content-zoom-limit-max": { + "syntax": "" + }, + "-ms-content-zoom-limit-min": { + "syntax": "" + }, + "-ms-content-zoom-snap": { + "syntax": "<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>" + }, + "-ms-content-zoom-snap-points": { + "syntax": "snapInterval( , ) | snapList( # )" + }, + "-ms-content-zoom-snap-type": { + "syntax": "none | proximity | mandatory" + }, + "-ms-filter": { + "syntax": "" + }, + "-ms-flow-from": { + "syntax": "[ none | ]#" + }, + "-ms-flow-into": { + "syntax": "[ none | ]#" + }, + "-ms-grid-columns": { + "syntax": "none | | " + }, + "-ms-grid-rows": { + "syntax": "none | | " + }, + "-ms-high-contrast-adjust": { + "syntax": "auto | none" + }, + "-ms-hyphenate-limit-chars": { + "syntax": "auto | {1,3}" + }, + "-ms-hyphenate-limit-lines": { + "syntax": "no-limit | " + }, + "-ms-hyphenate-limit-zone": { + "syntax": " | " + }, + "-ms-ime-align": { + "syntax": "auto | after" + }, + "-ms-overflow-style": { + "syntax": "auto | none | scrollbar | -ms-autohiding-scrollbar" + }, + "-ms-scrollbar-3dlight-color": { + "syntax": "" + }, + "-ms-scrollbar-arrow-color": { + "syntax": "" + }, + "-ms-scrollbar-base-color": { + "syntax": "" + }, + "-ms-scrollbar-darkshadow-color": { + "syntax": "" + }, + "-ms-scrollbar-face-color": { + "syntax": "" + }, + "-ms-scrollbar-highlight-color": { + "syntax": "" + }, + "-ms-scrollbar-shadow-color": { + "syntax": "" + }, + "-ms-scrollbar-track-color": { + "syntax": "" + }, + "-ms-scroll-chaining": { + "syntax": "chained | none" + }, + "-ms-scroll-limit": { + "syntax": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>" + }, + "-ms-scroll-limit-x-max": { + "syntax": "auto | " + }, + "-ms-scroll-limit-x-min": { + "syntax": "" + }, + "-ms-scroll-limit-y-max": { + "syntax": "auto | " + }, + "-ms-scroll-limit-y-min": { + "syntax": "" + }, + "-ms-scroll-rails": { + "syntax": "none | railed" + }, + "-ms-scroll-snap-points-x": { + "syntax": "snapInterval( , ) | snapList( # )" + }, + "-ms-scroll-snap-points-y": { + "syntax": "snapInterval( , ) | snapList( # )" + }, + "-ms-scroll-snap-type": { + "syntax": "none | proximity | mandatory" + }, + "-ms-scroll-snap-x": { + "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>" + }, + "-ms-scroll-snap-y": { + "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>" + }, + "-ms-scroll-translation": { + "syntax": "none | vertical-to-horizontal" + }, + "-ms-text-autospace": { + "syntax": "none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space" + }, + "-ms-touch-select": { + "syntax": "grippers | none" + }, + "-ms-user-select": { + "syntax": "none | element | text" + }, + "-ms-wrap-flow": { + "syntax": "auto | both | start | end | maximum | clear" + }, + "-ms-wrap-margin": { + "syntax": "" + }, + "-ms-wrap-through": { + "syntax": "wrap | none" + }, + "-moz-appearance": { + "syntax": "none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized" + }, + "-moz-binding": { + "syntax": " | none" + }, + "-moz-border-bottom-colors": { + "syntax": "+ | none" + }, + "-moz-border-left-colors": { + "syntax": "+ | none" + }, + "-moz-border-right-colors": { + "syntax": "+ | none" + }, + "-moz-border-top-colors": { + "syntax": "+ | none" + }, + "-moz-context-properties": { + "syntax": "none | [ fill | fill-opacity | stroke | stroke-opacity ]#" + }, + "-moz-float-edge": { + "syntax": "border-box | content-box | margin-box | padding-box" + }, + "-moz-force-broken-image-icon": { + "syntax": "0 | 1" + }, + "-moz-image-region": { + "syntax": " | auto" + }, + "-moz-orient": { + "syntax": "inline | block | horizontal | vertical" + }, + "-moz-outline-radius": { + "syntax": "{1,4} [ / {1,4} ]?" + }, + "-moz-outline-radius-bottomleft": { + "syntax": "" + }, + "-moz-outline-radius-bottomright": { + "syntax": "" + }, + "-moz-outline-radius-topleft": { + "syntax": "" + }, + "-moz-outline-radius-topright": { + "syntax": "" + }, + "-moz-stack-sizing": { + "syntax": "ignore | stretch-to-fit" + }, + "-moz-text-blink": { + "syntax": "none | blink" + }, + "-moz-user-focus": { + "syntax": "ignore | normal | select-after | select-before | select-menu | select-same | select-all | none" + }, + "-moz-user-input": { + "syntax": "auto | none | enabled | disabled" + }, + "-moz-user-modify": { + "syntax": "read-only | read-write | write-only" + }, + "-moz-window-dragging": { + "syntax": "drag | no-drag" + }, + "-moz-window-shadow": { + "syntax": "default | menu | tooltip | sheet | none" + }, + "-webkit-appearance": { + "syntax": "none | button | button-bevel | caps-lock-indicator | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbargripper-horizontal | scrollbargripper-vertical | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield | -apple-pay-button" + }, + "-webkit-border-before": { + "syntax": "<'border-width'> || <'border-style'> || " + }, + "-webkit-border-before-color": { + "syntax": "" + }, + "-webkit-border-before-style": { + "syntax": "<'border-style'>" + }, + "-webkit-border-before-width": { + "syntax": "<'border-width'>" + }, + "-webkit-box-reflect": { + "syntax": "[ above | below | right | left ]? ? ?" + }, + "-webkit-line-clamp": { + "syntax": "none | " + }, + "-webkit-mask": { + "syntax": "[ || [ / ]? || || [ | border | padding | content | text ] || [ | border | padding | content ] ]#" + }, + "-webkit-mask-attachment": { + "syntax": "#" + }, + "-webkit-mask-clip": { + "syntax": "[ | border | padding | content | text ]#" + }, + "-webkit-mask-composite": { + "syntax": "#" + }, + "-webkit-mask-image": { + "syntax": "#" + }, + "-webkit-mask-origin": { + "syntax": "[ | border | padding | content ]#" + }, + "-webkit-mask-position": { + "syntax": "#" + }, + "-webkit-mask-position-x": { + "syntax": "[ | left | center | right ]#" + }, + "-webkit-mask-position-y": { + "syntax": "[ | top | center | bottom ]#" + }, + "-webkit-mask-repeat": { + "syntax": "#" + }, + "-webkit-mask-repeat-x": { + "syntax": "repeat | no-repeat | space | round" + }, + "-webkit-mask-repeat-y": { + "syntax": "repeat | no-repeat | space | round" + }, + "-webkit-mask-size": { + "syntax": "#" + }, + "-webkit-overflow-scrolling": { + "syntax": "auto | touch" + }, + "-webkit-tap-highlight-color": { + "syntax": "" + }, + "-webkit-text-fill-color": { + "syntax": "" + }, + "-webkit-text-stroke": { + "syntax": " || " + }, + "-webkit-text-stroke-color": { + "syntax": "" + }, + "-webkit-text-stroke-width": { + "syntax": "" + }, + "-webkit-touch-callout": { + "syntax": "default | none" + }, + "-webkit-user-modify": { + "syntax": "read-only | read-write | read-write-plaintext-only" + }, + "accent-color": { + "syntax": "auto | " + }, + "align-content": { + "syntax": "normal | | | ? " + }, + "align-items": { + "syntax": "normal | stretch | | [ ? ]" + }, + "align-self": { + "syntax": "auto | normal | stretch | | ? " + }, + "align-tracks": { + "syntax": "[ normal | | | ? ]#" + }, + "all": { + "syntax": "initial | inherit | unset | revert | revert-layer" + }, + "animation": { + "syntax": "#" + }, + "animation-composition": { + "syntax": "#" + }, + "animation-delay": { + "syntax": "