| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| // Null module shim for packages not available in the docs build. |
| // These are transitive dependencies of superset-frontend components that exist |
| // in the barrel file but are never rendered on the docs site. |
| // webpack needs these to resolve at build time even though the code paths |
| // that use them are never executed at runtime. |
| // |
| // This shim uses a recursive Proxy to handle nested property access chains: |
| // import ace from 'ace-builds'; ace.config.set(...) → works (returns proxy) |
| // import { useResizeDetector } from 'react-resize-detector' → returns noop hook |
| // import ReactAce from 'react-ace' → returns NullComponent |
| |
| const NullComponent = () => null; |
| |
| // For hooks that return objects/arrays |
| const useNoop = () => ({}); |
| |
| // Mock for useResizeDetector - returns { ref, width, height } where ref.current exists |
| const useResizeDetectorMock = () => ({ |
| ref: { current: null }, |
| width: 0, |
| height: 0, |
| }); |
| |
| /** |
| * Creates a recursive proxy that handles any depth of property access. |
| * This allows patterns like ace.config.set() or ace.config.setModuleUrl() to work. |
| * |
| * The proxy is both callable (returns undefined) and accessible (returns another proxy). |
| */ |
| function createDeepProxy() { |
| const handler = { |
| // Handle property access - return another proxy for chaining |
| get(target, prop) { |
| // Standard module properties |
| if (prop === 'default') return createDeepProxy(); |
| if (prop === '__esModule') return true; |
| |
| // Symbol properties (used by JS internals) |
| if (typeof prop === 'symbol') { |
| if (prop === Symbol.toPrimitive) return () => ''; |
| if (prop === Symbol.toStringTag) return 'NullModule'; |
| if (prop === Symbol.iterator) return undefined; |
| return undefined; |
| } |
| |
| // React-specific properties |
| if (prop === '$$typeof') return undefined; |
| if (prop === 'propTypes') return undefined; |
| if (prop === 'displayName') return 'NullComponent'; |
| |
| // Specific hook mocks for known hooks that need proper return values |
| if (prop === 'useResizeDetector') { |
| return useResizeDetectorMock; |
| } |
| |
| // Common hook names return useNoop for better compatibility |
| if (typeof prop === 'string' && prop.startsWith('use')) { |
| return useNoop; |
| } |
| |
| // Return another proxy to allow further chaining (ace.config.set) |
| return createDeepProxy(); |
| }, |
| |
| // Handle function calls - return undefined (safe default) |
| apply() { |
| return undefined; |
| }, |
| |
| // Handle new ClassName() - return an empty object |
| construct() { |
| return {}; |
| }, |
| }; |
| |
| // Create a proxy over a function so it's both callable and has properties |
| return new Proxy(function NullModule() {}, handler); |
| } |
| |
| // Create the main module export as a deep proxy |
| const nullModule = createDeepProxy(); |
| |
| // Support both CommonJS and ES module patterns |
| module.exports = nullModule; |
| module.exports.default = createDeepProxy(); |
| module.exports.__esModule = true; |
| |
| // Named exports for common patterns (webpack may inline these) |
| module.exports.useResizeDetector = useResizeDetectorMock; |
| module.exports.withResizeDetector = createDeepProxy(); |
| module.exports.Resizable = NullComponent; |
| module.exports.ResizableBox = NullComponent; |
| module.exports.FixedSizeList = NullComponent; |
| module.exports.VariableSizeList = NullComponent; |
| |
| // ace-builds specific exports that CodeEditor uses |
| module.exports.config = createDeepProxy(); |
| module.exports.require = createDeepProxy(); |
| module.exports.edit = createDeepProxy(); |