defineComponent.mjs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Composables
  2. import { injectDefaults, internalUseDefaults } from "../composables/defaults.mjs"; // Utilities
  3. import { defineComponent as _defineComponent // eslint-disable-line no-restricted-imports
  4. } from 'vue';
  5. import { consoleWarn } from "./console.mjs";
  6. import { pick } from "./helpers.mjs";
  7. import { propsFactory } from "./propsFactory.mjs"; // Types
  8. // No props
  9. // Object Props
  10. // Implementation
  11. export function defineComponent(options) {
  12. options._setup = options._setup ?? options.setup;
  13. if (!options.name) {
  14. consoleWarn('The component is missing an explicit name, unable to generate default prop value');
  15. return options;
  16. }
  17. if (options._setup) {
  18. options.props = propsFactory(options.props ?? {}, options.name)();
  19. const propKeys = Object.keys(options.props).filter(key => key !== 'class' && key !== 'style');
  20. options.filterProps = function filterProps(props) {
  21. return pick(props, propKeys);
  22. };
  23. options.props._as = String;
  24. options.setup = function setup(props, ctx) {
  25. const defaults = injectDefaults();
  26. // Skip props proxy if defaults are not provided
  27. if (!defaults.value) return options._setup(props, ctx);
  28. const {
  29. props: _props,
  30. provideSubDefaults
  31. } = internalUseDefaults(props, props._as ?? options.name, defaults);
  32. const setupBindings = options._setup(_props, ctx);
  33. provideSubDefaults();
  34. return setupBindings;
  35. };
  36. }
  37. return options;
  38. }
  39. // No argument - simple default slot
  40. // Generic constructor argument - generic props and slots
  41. // Slots argument - simple slots
  42. // Implementation
  43. export function genericComponent() {
  44. let exposeDefaults = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
  45. return options => (exposeDefaults ? defineComponent : _defineComponent)(options);
  46. }
  47. export function defineFunctionalComponent(props, render) {
  48. render.props = props;
  49. return render;
  50. }
  51. // Adds a filterProps method to the component options
  52. // https://github.com/vuejs/core/pull/10557
  53. // not a vue Component
  54. //# sourceMappingURL=defineComponent.mjs.map