first commit

This commit is contained in:
monjack
2025-06-20 18:01:48 +08:00
commit 6daa6d65c1
24611 changed files with 2512443 additions and 0 deletions

22
app_vue/node_modules/postcss-merge-rules/LICENSE-MIT generated vendored Normal file
View File

@ -0,0 +1,22 @@
Copyright (c) Ben Briggs <beneb.info@gmail.com> (http://beneb.info)
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

105
app_vue/node_modules/postcss-merge-rules/README.md generated vendored Normal file
View File

@ -0,0 +1,105 @@
# [postcss][postcss]-merge-rules
> Merge CSS rules with PostCSS.
## Install
With [npm](https://npmjs.org/package/postcss-merge-rules) do:
```
npm install postcss-merge-rules --save
```
## Examples
This module will attempt to merge *adjacent* CSS rules:
### By declarations
#### Input
```css
a {
color: blue;
font-weight: bold
}
p {
color: blue;
font-weight: bold
}
```
#### Output
```css
a,p {
color: blue;
font-weight: bold
}
```
### By selectors
#### Input
```css
a {
color: blue
}
a {
font-weight: bold
}
```
#### Output
```css
a {
color: blue;
font-weight: bold
}
```
### By partial declarations
#### Input
```css
a {
font-weight: bold
}
p {
color: blue;
font-weight: bold
}
```
#### Output
```css
a,p {
font-weight: bold
}
p {
color: blue
}
```
## Usage
See the [PostCSS documentation](https://github.com/postcss/postcss#usage) for
examples for your environment.
## Contributors
See [CONTRIBUTORS.md](https://github.com/cssnano/cssnano/blob/master/CONTRIBUTORS.md).
## License
MIT © [Ben Briggs](http://beneb.info)
[postcss]: https://github.com/postcss/postcss

46
app_vue/node_modules/postcss-merge-rules/package.json generated vendored Normal file
View File

@ -0,0 +1,46 @@
{
"name": "postcss-merge-rules",
"version": "5.1.4",
"description": "Merge CSS rules with PostCSS.",
"types": "types/index.d.ts",
"main": "src/index.js",
"files": [
"LICENSE-MIT",
"src",
"types"
],
"keywords": [
"css",
"optimise",
"postcss",
"postcss-plugin"
],
"license": "MIT",
"homepage": "https://github.com/cssnano/cssnano",
"author": {
"name": "Ben Briggs",
"email": "beneb.info@gmail.com",
"url": "http://beneb.info"
},
"repository": "cssnano/cssnano",
"dependencies": {
"browserslist": "^4.21.4",
"caniuse-api": "^3.0.0",
"postcss-selector-parser": "^6.0.5",
"cssnano-utils": "^3.1.0"
},
"bugs": {
"url": "https://github.com/cssnano/cssnano/issues"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"devDependencies": {
"@types/caniuse-api": "^3.0.2",
"postcss": "^8.2.15",
"postcss-discard-comments": "^5.1.2"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
}

427
app_vue/node_modules/postcss-merge-rules/src/index.js generated vendored Normal file
View File

@ -0,0 +1,427 @@
'use strict';
const browserslist = require('browserslist');
const { sameParent } = require('cssnano-utils');
const {
ensureCompatibility,
sameVendor,
noVendor,
} = require('./lib/ensureCompatibility');
/**
* @param {import('postcss').Declaration} a
* @param {import('postcss').Declaration} b
* @return {boolean}
*/
function declarationIsEqual(a, b) {
return (
a.important === b.important && a.prop === b.prop && a.value === b.value
);
}
/**
* @param {import('postcss').Declaration[]} array
* @param {import('postcss').Declaration} decl
* @return {number}
*/
function indexOfDeclaration(array, decl) {
return array.findIndex((d) => declarationIsEqual(d, decl));
}
/**
* Returns filtered array of matched or unmatched declarations
* @param {import('postcss').Declaration[]} a
* @param {import('postcss').Declaration[]} b
* @param {boolean} [not=false]
* @return {import('postcss').Declaration[]}
*/
function intersect(a, b, not) {
return a.filter((c) => {
const index = indexOfDeclaration(b, c) !== -1;
return not ? !index : index;
});
}
/**
* @param {import('postcss').Declaration[]} a
* @param {import('postcss').Declaration[]} b
* @return {boolean}
*/
function sameDeclarationsAndOrder(a, b) {
if (a.length !== b.length) {
return false;
}
return a.every((d, index) => declarationIsEqual(d, b[index]));
}
/**
* @param {import('postcss').Rule} ruleA
* @param {import('postcss').Rule} ruleB
* @param {string[]=} browsers
* @param {Map<string, boolean>=} compatibilityCache
* @return {boolean}
*/
function canMerge(ruleA, ruleB, browsers, compatibilityCache) {
const a = ruleA.selectors;
const b = ruleB.selectors;
const selectors = a.concat(b);
if (!ensureCompatibility(selectors, browsers, compatibilityCache)) {
return false;
}
const parent = sameParent(
/** @type {any} */ (ruleA),
/** @type {any} */ (ruleB)
);
if (
parent &&
ruleA.parent &&
ruleA.parent.type === 'atrule' &&
/** @type {import('postcss').AtRule} */ (ruleA.parent).name.includes(
'keyframes'
)
) {
return false;
}
return parent && (selectors.every(noVendor) || sameVendor(a, b));
}
/**
* @param {import('postcss').ChildNode} node
* @return {node is import('postcss').Declaration}
*/
function isDeclaration(node) {
return node.type === 'decl';
}
/**
* @param {import('postcss').Rule} rule
* @return {import('postcss').Declaration[]}
*/
function getDecls(rule) {
return rule.nodes.filter(isDeclaration);
}
/** @type {(...rules: import('postcss').Rule[]) => string} */
const joinSelectors = (...rules) => rules.map((s) => s.selector).join();
/**
* @param {...import('postcss').Rule} rules
* @return {number}
*/
function ruleLength(...rules) {
return rules.map((r) => (r.nodes.length ? String(r) : '')).join('').length;
}
/**
* @param {string} prop
* @return {{prefix: string?, base:string?, rest:string[]}}
*/
function splitProp(prop) {
// Treat vendor prefixed properties as if they were unprefixed;
// moving them when combined with non-prefixed properties can
// cause issues. e.g. moving -webkit-background-clip when there
// is a background shorthand definition.
const parts = prop.split('-');
if (prop[0] !== '-') {
return {
prefix: '',
base: parts[0],
rest: parts.slice(1),
};
}
// Don't split css variables
if (prop[1] === '-') {
return {
prefix: null,
base: null,
rest: [prop],
};
}
// Found prefix
return {
prefix: parts[1],
base: parts[2],
rest: parts.slice(3),
};
}
/**
* @param {string} propA
* @param {string} propB
* @return {boolean}
*/
function isConflictingProp(propA, propB) {
if (propA === propB) {
// Same specificity
return true;
}
const a = splitProp(propA);
const b = splitProp(propB);
// Don't resort css variables
if (!a.base && !b.base) {
return true;
}
// Different base and none is `place`;
if (a.base !== b.base && a.base !== 'place' && b.base !== 'place') {
return false;
}
// Conflict if rest-count mismatches
if (a.rest.length !== b.rest.length) {
return true;
}
/* Do not merge conflicting border properties */
if (a.base === 'border') {
const allRestProps = new Set([...a.rest, ...b.rest]);
if (
allRestProps.has('image') ||
allRestProps.has('width') ||
allRestProps.has('color') ||
allRestProps.has('style')
) {
return true;
}
}
// Conflict if rest parameters are equal (same but unprefixed)
return a.rest.every((s, index) => b.rest[index] === s);
}
/**
* @param {import('postcss').Rule} first
* @param {import('postcss').Rule} second
* @return {boolean} merged
*/
function mergeParents(first, second) {
// Null check for detached rules
if (!first.parent || !second.parent) {
return false;
}
// Check if parents share node
if (first.parent === second.parent) {
return false;
}
// sameParent() already called by canMerge()
second.remove();
first.parent.append(second);
return true;
}
/**
* @param {import('postcss').Rule} first
* @param {import('postcss').Rule} second
* @return {import('postcss').Rule} mergedRule
*/
function partialMerge(first, second) {
let intersection = intersect(getDecls(first), getDecls(second));
if (intersection.length === 0) {
return second;
}
let nextRule = second.next();
if (!nextRule) {
// Grab next cousin
/** @type {any} */
const parentSibling =
/** @type {import('postcss').Container<import('postcss').ChildNode>} */ (
second.parent
).next();
nextRule = parentSibling && parentSibling.nodes && parentSibling.nodes[0];
}
if (nextRule && nextRule.type === 'rule' && canMerge(second, nextRule)) {
let nextIntersection = intersect(getDecls(second), getDecls(nextRule));
if (nextIntersection.length > intersection.length) {
mergeParents(second, nextRule);
first = second;
second = nextRule;
intersection = nextIntersection;
}
}
const firstDecls = getDecls(first);
// Filter out intersections with later conflicts in First
intersection = intersection.filter((decl, intersectIndex) => {
const indexOfDecl = indexOfDeclaration(firstDecls, decl);
const nextConflictInFirst = firstDecls
.slice(indexOfDecl + 1)
.filter((d) => isConflictingProp(d.prop, decl.prop));
if (nextConflictInFirst.length === 0) {
return true;
}
const nextConflictInIntersection = intersection
.slice(intersectIndex + 1)
.filter((d) => isConflictingProp(d.prop, decl.prop));
if (nextConflictInFirst.length !== nextConflictInIntersection.length) {
return false;
}
return nextConflictInFirst.every((d, index) =>
declarationIsEqual(d, nextConflictInIntersection[index])
);
});
// Filter out intersections with previous conflicts in Second
const secondDecls = getDecls(second);
intersection = intersection.filter((decl) => {
const nextConflictIndex = secondDecls.findIndex((d) =>
isConflictingProp(d.prop, decl.prop)
);
if (nextConflictIndex === -1) {
return false;
}
if (!declarationIsEqual(secondDecls[nextConflictIndex], decl)) {
return false;
}
if (
decl.prop.toLowerCase() !== 'direction' &&
decl.prop.toLowerCase() !== 'unicode-bidi' &&
secondDecls.some(
(declaration) => declaration.prop.toLowerCase() === 'all'
)
) {
return false;
}
secondDecls.splice(nextConflictIndex, 1);
return true;
});
if (intersection.length === 0) {
// Nothing to merge
return second;
}
const receivingBlock = second.clone();
receivingBlock.selector = joinSelectors(first, second);
receivingBlock.nodes = [];
/** @type {import('postcss').Container<import('postcss').ChildNode>} */ (
second.parent
).insertBefore(second, receivingBlock);
const firstClone = first.clone();
const secondClone = second.clone();
/**
* @param {function(import('postcss').Declaration):void} callback
* @this {import('postcss').Rule}
* @return {function(import('postcss').Declaration)}
*/
function moveDecl(callback) {
return (decl) => {
if (indexOfDeclaration(intersection, decl) !== -1) {
callback.call(this, decl);
}
};
}
firstClone.walkDecls(
moveDecl((decl) => {
decl.remove();
receivingBlock.append(decl);
})
);
secondClone.walkDecls(moveDecl((decl) => decl.remove()));
const merged = ruleLength(firstClone, receivingBlock, secondClone);
const original = ruleLength(first, second);
if (merged < original) {
first.replaceWith(firstClone);
second.replaceWith(secondClone);
[firstClone, receivingBlock, secondClone].forEach((r) => {
if (r.nodes.length === 0) {
r.remove();
}
});
if (!secondClone.parent) {
return receivingBlock;
}
return secondClone;
} else {
receivingBlock.remove();
return second;
}
}
/**
* @param {string[]} browsers
* @param {Map<string, boolean>} compatibilityCache
* @return {function(import('postcss').Rule)}
*/
function selectorMerger(browsers, compatibilityCache) {
/** @type {import('postcss').Rule | null} */
let cache = null;
return function (rule) {
// Prime the cache with the first rule, or alternately ensure that it is
// safe to merge both declarations before continuing
if (!cache || !canMerge(rule, cache, browsers, compatibilityCache)) {
cache = rule;
return;
}
// Ensure that we don't deduplicate the same rule; this is sometimes
// caused by a partial merge
if (cache === rule) {
cache = rule;
return;
}
// Parents merge: check if the rules have same parents, but not same parent nodes
mergeParents(cache, rule);
// Merge when declarations are exactly equal
// e.g. h1 { color: red } h2 { color: red }
if (sameDeclarationsAndOrder(getDecls(rule), getDecls(cache))) {
rule.selector = joinSelectors(cache, rule);
cache.remove();
cache = rule;
return;
}
// Merge when both selectors are exactly equal
// e.g. a { color: blue } a { font-weight: bold }
if (cache.selector === rule.selector) {
const cached = getDecls(cache);
rule.walk((node) => {
if (node.type === 'decl' && indexOfDeclaration(cached, node) !== -1) {
node.remove();
return;
}
/** @type {import('postcss').Rule} */ (cache).append(node);
});
rule.remove();
return;
}
// Partial merge: check if the rule contains a subset of the last; if
// so create a joined selector with the subset, if smaller.
cache = partialMerge(cache, rule);
};
}
/**
* @type {import('postcss').PluginCreator<void>}
* @return {import('postcss').Plugin}
*/
function pluginCreator() {
return {
postcssPlugin: 'postcss-merge-rules',
prepare(result) {
/** @type {typeof result.opts & browserslist.Options} */
const resultOpts = result.opts || {};
const browsers = browserslist(null, {
stats: resultOpts.stats,
path: __dirname,
env: resultOpts.env,
});
const compatibilityCache = new Map();
return {
OnceExit(css) {
css.walkRules(selectorMerger(browsers, compatibilityCache));
},
};
},
};
}
pluginCreator.postcss = true;
module.exports = pluginCreator;

View File

@ -0,0 +1,231 @@
'use strict';
const { isSupported } = require('caniuse-api');
const selectorParser = require('postcss-selector-parser');
const simpleSelectorRe = /^#?[-._a-z0-9 ]+$/i;
const cssSel2 = 'css-sel2';
const cssSel3 = 'css-sel3';
const cssGencontent = 'css-gencontent';
const cssFirstLetter = 'css-first-letter';
const cssFirstLine = 'css-first-line';
const cssInOutOfRange = 'css-in-out-of-range';
const formValidation = 'form-validation';
const vendorPrefix =
/-(ah|apple|atsc|epub|hp|khtml|moz|ms|o|rim|ro|tc|wap|webkit|xv)-/;
const level2Sel = new Set(['=', '~=', '|=']);
const level3Sel = new Set(['^=', '$=', '*=']);
/**
* @param {string} selector
* @return {RegExpMatchArray | null}
*/
function filterPrefixes(selector) {
return selector.match(vendorPrefix);
}
/**
* Internet Explorer use :-ms-input-placeholder.
* Microsoft Edge use ::-ms-input-placeholder.
*
* @type {(selector: string) => number}
*/
const findMsInputPlaceholder = (selector) =>
~selector.search(/-ms-input-placeholder/i);
/**
* @param {string[]} selectorsA
* @param {string[]} selectorsB
* @return {boolean}
*/
function sameVendor(selectorsA, selectorsB) {
/** @type {(selectors: string[]) => string} */
let same = (selectors) => selectors.map(filterPrefixes).join();
/** @type {(selectors: string[]) => string | undefined} */
let findMsVendor = (selectors) => selectors.find(findMsInputPlaceholder);
return (
same(selectorsA) === same(selectorsB) &&
!(findMsVendor(selectorsA) && findMsVendor(selectorsB))
);
}
/**
* @param {string} selector
* @return {boolean}
*/
function noVendor(selector) {
return !vendorPrefix.test(selector);
}
const pseudoElements = {
':active': cssSel2,
':after': cssGencontent,
':any-link': 'css-any-link',
':before': cssGencontent,
':checked': cssSel3,
':default': 'css-default-pseudo',
':dir': 'css-dir-pseudo',
':disabled': cssSel3,
':empty': cssSel3,
':enabled': cssSel3,
':first-child': cssSel2,
':first-letter': cssFirstLetter,
':first-line': cssFirstLine,
':first-of-type': cssSel3,
':focus': cssSel2,
':focus-within': 'css-focus-within',
':focus-visible': 'css-focus-visible',
':has': 'css-has',
':hover': cssSel2,
':in-range': cssInOutOfRange,
':indeterminate': 'css-indeterminate-pseudo',
':invalid': formValidation,
':is': 'css-matches-pseudo',
':lang': cssSel2,
':last-child': cssSel3,
':last-of-type': cssSel3,
':link': cssSel2,
':matches': 'css-matches-pseudo',
':not': cssSel3,
':nth-child': cssSel3,
':nth-last-child': cssSel3,
':nth-last-of-type': cssSel3,
':nth-of-type': cssSel3,
':only-child': cssSel3,
':only-of-type': cssSel3,
':optional': 'css-optional-pseudo',
':out-of-range': cssInOutOfRange,
':placeholder-shown': 'css-placeholder-shown',
':required': formValidation,
':root': cssSel3,
':target': cssSel3,
'::after': cssGencontent,
'::backdrop': 'dialog',
'::before': cssGencontent,
'::first-letter': cssFirstLetter,
'::first-line': cssFirstLine,
'::marker': 'css-marker-pseudo',
'::placeholder': 'css-placeholder',
'::selection': 'css-selection',
':valid': formValidation,
':visited': cssSel2,
};
/**
* @param {string} selector
* @return {boolean}
*/
function isCssMixin(selector) {
return selector[selector.length - 1] === ':';
}
/**
* @param {string} selector
* @return {boolean}
*/
function isHostPseudoClass(selector) {
return selector.includes(':host');
}
const isSupportedCache = new Map();
// Move to util in future
/**
* @param {string} feature
* @param {string[] | undefined} browsers
*/
function isSupportedCached(feature, browsers) {
const key = JSON.stringify({ feature, browsers });
let result = isSupportedCache.get(key);
if (!result) {
result = isSupported(feature, /** @type {string[]} */ (browsers));
isSupportedCache.set(key, result);
}
return result;
}
/**
* @param {string[]} selectors
* @param{string[]=} browsers
* @param{Map<string,boolean>=} compatibilityCache
* @return {boolean}
*/
function ensureCompatibility(selectors, browsers, compatibilityCache) {
// Should not merge mixins
if (selectors.some(isCssMixin)) {
return false;
}
// Should not merge :host selector https://github.com/angular/angular-cli/issues/18672
if (selectors.some(isHostPseudoClass)) {
return false;
}
return selectors.every((selector) => {
if (simpleSelectorRe.test(selector)) {
return true;
}
if (compatibilityCache && compatibilityCache.has(selector)) {
return compatibilityCache.get(selector);
}
let compatible = true;
selectorParser((ast) => {
ast.walk((node) => {
const { type, value } = node;
if (type === 'pseudo') {
const entry =
pseudoElements[/** @type {keyof pseudoElements} */ (value)];
if (!entry && noVendor(value)) {
compatible = false;
}
if (entry && compatible) {
compatible = isSupportedCached(entry, browsers);
}
}
if (type === 'combinator') {
if (value.includes('~')) {
compatible = isSupportedCached(cssSel3, browsers);
}
if (value.includes('>') || value.includes('+')) {
compatible = isSupportedCached(cssSel2, browsers);
}
}
if (type === 'attribute' && node.attribute) {
// [foo]
if (!node.operator) {
compatible = isSupportedCached(cssSel2, browsers);
}
if (value) {
// [foo="bar"], [foo~="bar"], [foo|="bar"]
if (level2Sel.has(/** @type {string} */ (node.operator))) {
compatible = isSupportedCached(cssSel2, browsers);
}
// [foo^="bar"], [foo$="bar"], [foo*="bar"]
if (level3Sel.has(/** @type {string} */ (node.operator))) {
compatible = isSupportedCached(cssSel3, browsers);
}
}
// [foo="bar" i]
if (node.insensitive) {
compatible = isSupportedCached('css-case-insensitive', browsers);
}
}
if (!compatible) {
// If this node was not compatible,
// break out early from walking the rest
return false;
}
});
}).processSync(selector);
if (compatibilityCache) {
compatibilityCache.set(selector, compatible);
}
return compatible;
});
}
module.exports = { sameVendor, noVendor, pseudoElements, ensureCompatibility };

View File

@ -0,0 +1,9 @@
export = pluginCreator;
/**
* @type {import('postcss').PluginCreator<void>}
* @return {import('postcss').Plugin}
*/
declare function pluginCreator(): import('postcss').Plugin;
declare namespace pluginCreator {
const postcss: true;
}

View File

@ -0,0 +1,71 @@
/**
* @param {string[]} selectorsA
* @param {string[]} selectorsB
* @return {boolean}
*/
export function sameVendor(selectorsA: string[], selectorsB: string[]): boolean;
/**
* @param {string} selector
* @return {boolean}
*/
export function noVendor(selector: string): boolean;
export const pseudoElements: {
':active': string;
':after': string;
':any-link': string;
':before': string;
':checked': string;
':default': string;
':dir': string;
':disabled': string;
':empty': string;
':enabled': string;
':first-child': string;
':first-letter': string;
':first-line': string;
':first-of-type': string;
':focus': string;
':focus-within': string;
':focus-visible': string;
':has': string;
':hover': string;
':in-range': string;
':indeterminate': string;
':invalid': string;
':is': string;
':lang': string;
':last-child': string;
':last-of-type': string;
':link': string;
':matches': string;
':not': string;
':nth-child': string;
':nth-last-child': string;
':nth-last-of-type': string;
':nth-of-type': string;
':only-child': string;
':only-of-type': string;
':optional': string;
':out-of-range': string;
':placeholder-shown': string;
':required': string;
':root': string;
':target': string;
'::after': string;
'::backdrop': string;
'::before': string;
'::first-letter': string;
'::first-line': string;
'::marker': string;
'::placeholder': string;
'::selection': string;
':valid': string;
':visited': string;
};
/**
* @param {string[]} selectors
* @param{string[]=} browsers
* @param{Map<string,boolean>=} compatibilityCache
* @return {boolean}
*/
export function ensureCompatibility(selectors: string[], browsers?: string[] | undefined, compatibilityCache?: Map<string, boolean> | undefined): boolean;