fix: prevent asset conflicts between React and Grid.js versions

Add coexistence checks to all enqueue methods to prevent loading
both React and Grid.js assets simultaneously.

Changes:
- ReactAdmin.php: Only enqueue React assets when ?react=1
- Init.php: Skip Grid.js when React active on admin pages
- Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0
- Customer.php, Product.php, License.php: Add coexistence checks

Now the toggle between Classic and React versions works correctly.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
dwindown
2026-04-18 17:02:14 +07:00
parent bd9cdac02e
commit e8fbfb14c1
74973 changed files with 6658406 additions and 71 deletions

View File

@@ -0,0 +1,13 @@
import { NodePath, types } from '@babel/core';
interface State {
replacedComponents: Set<string>;
unsupportedComponents: Set<string>;
}
declare const plugin: () => {
visitor: {
Program(path: NodePath<types.Program>, state: Partial<State>): void;
};
};
export { plugin as default };

View File

@@ -0,0 +1,107 @@
'use strict';
var core = require('@babel/core');
const elementToComponent = {
svg: "Svg",
circle: "Circle",
clipPath: "ClipPath",
ellipse: "Ellipse",
g: "G",
linearGradient: "LinearGradient",
radialGradient: "RadialGradient",
line: "Line",
path: "Path",
pattern: "Pattern",
polygon: "Polygon",
polyline: "Polyline",
rect: "Rect",
symbol: "Symbol",
text: "Text",
textPath: "TextPath",
tspan: "TSpan",
use: "Use",
defs: "Defs",
stop: "Stop",
mask: "Mask",
image: "Image",
foreignObject: "ForeignObject"
};
const plugin = () => {
function replaceElement(path, state) {
const namePath = path.get("openingElement").get("name");
if (!namePath.isJSXIdentifier())
return;
const { name } = namePath.node;
const component = elementToComponent[name];
if (component) {
namePath.replaceWith(core.types.jsxIdentifier(component));
if (path.has("closingElement")) {
const closingNamePath = path.get("closingElement").get("name");
closingNamePath.replaceWith(core.types.jsxIdentifier(component));
}
state.replacedComponents.add(component);
return;
}
state.unsupportedComponents.add(name);
path.remove();
}
const svgElementVisitor = {
JSXElement(path, state) {
if (!path.get("openingElement").get("name").isJSXIdentifier({ name: "svg" })) {
return;
}
replaceElement(path, state);
path.traverse(jsxElementVisitor, state);
}
};
const jsxElementVisitor = {
JSXElement(path, state) {
replaceElement(path, state);
}
};
const importDeclarationVisitor = {
ImportDeclaration(path, state) {
if (path.get("source").isStringLiteral({ value: "react-native-svg" }) && !path.get("importKind").hasNode()) {
state.replacedComponents.forEach((component) => {
if (path.get("specifiers").some(
(specifier) => specifier.get("local").isIdentifier({ name: component })
)) {
return;
}
path.pushContainer(
"specifiers",
core.types.importSpecifier(core.types.identifier(component), core.types.identifier(component))
);
});
} else if (path.get("source").isStringLiteral({ value: "expo" })) {
path.pushContainer(
"specifiers",
core.types.importSpecifier(core.types.identifier("Svg"), core.types.identifier("Svg"))
);
} else {
return;
}
if (state.unsupportedComponents.size && !path.has("trailingComments")) {
const componentList = [...state.unsupportedComponents].join(", ");
path.addComment(
"trailing",
` SVGR has dropped some elements not supported by react-native-svg: ${componentList} `
);
}
}
};
return {
visitor: {
Program(path, state) {
state.replacedComponents = /* @__PURE__ */ new Set();
state.unsupportedComponents = /* @__PURE__ */ new Set();
path.traverse(svgElementVisitor, state);
path.traverse(importDeclarationVisitor, state);
}
}
};
};
module.exports = plugin;
//# sourceMappingURL=index.js.map

File diff suppressed because one or more lines are too long