{"id":13903210,"url":"https://github.com/cloydlau/vue-global-config","last_synced_at":"2025-12-25T01:45:57.412Z","repository":{"id":55072682,"uuid":"480091805","full_name":"cloydlau/vue-global-config","owner":"cloydlau","description":"Configure your Vue 2/3 components globally! (Global Props + Attrs + Listeners + Hooks + Slots)","archived":false,"fork":false,"pushed_at":"2024-09-12T02:39:14.000Z","size":1091,"stargazers_count":8,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-09-12T20:15:47.892Z","etag":null,"topics":["config","configuration","global","option","options","slot","slots","vue","vue-demi"],"latest_commit_sha":null,"homepage":"https://juejin.cn/post/7189930273528774714","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cloydlau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-10T17:35:43.000Z","updated_at":"2024-09-12T02:39:18.000Z","dependencies_parsed_at":"2023-12-23T22:21:39.385Z","dependency_job_id":"c4d43223-fd9d-4406-bc7d-d8cfe3e3f6e1","html_url":"https://github.com/cloydlau/vue-global-config","commit_stats":{"total_commits":223,"total_committers":2,"mean_commits":111.5,"dds":"0.14798206278026904","last_synced_commit":"21cf37e023226c38bedb64dd22a624bacddf7c8d"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloydlau%2Fvue-global-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloydlau%2Fvue-global-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloydlau%2Fvue-global-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloydlau%2Fvue-global-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloydlau","download_url":"https://codeload.github.com/cloydlau/vue-global-config/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226320953,"owners_count":17606380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["config","configuration","global","option","options","slot","slots","vue","vue-demi"],"created_at":"2024-08-06T22:01:52.708Z","updated_at":"2025-12-25T01:45:57.362Z","avatar_url":"https://github.com/cloydlau.png","language":"TypeScript","funding_links":[],"categories":["vue"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003ca href=\"https://npmjs.com/package/vue-global-config\" target=\"_blank\" rel=\"noopener noreferrer\"\u003e\n    Vue Global Config \u003csup\u003e\u003cimg alt=\"version\" src=\"https://img.shields.io/npm/v/vue-global-config.svg?style=flat-square\u0026color=white\u0026label=\"\u003e\u003c/sup\u003e\n  \u003c/a\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Configure your Vue 2/3 components globally!\n  \u003cbr\u003e\n  \u003cb\u003eGlobal Props + Attrs + Listeners + Hooks + Slots.\u003c/b\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://juejin.cn/post/7189930273528774714\"\u003eBlog: How to implement global Slots in Vue?\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/vue-global-config?activeTab=versions\"\u003e\u003cimg alt=\"created at\" src=\"https://img.shields.io/github/created-at/cloydlau/vue-global-config?\u0026color=1C404E\u0026logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxZW0iIGhlaWdodD0iMWVtIiB2aWV3Qm94PSIwIDAgNDggNDgiPjxnIGZpbGw9Im5vbmUiPjxwYXRoIGQ9Ik04IDQwaDMyVjI0SDh6Ii8+PHBhdGggc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iNCIgZD0iTTQwIDQwSDhtMzIgMEg0aDRtMzIgMGg0bS00IDBWMjRIOHYxNiIvPjxwYXRoIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjQiIGQ9Im00MCAzNGwtNC0ybC00IDJsLTQtMmwtNCAybC00LTJsLTQgMmwtNC0ybC00IDJtMjQtMTB2LTltLTggOXYtOW0tOCA5di05bTE2LTVWOG0tOCAyVjhtLTggMlY4TTggMjR2MTZtMzItMTZ2MTYiLz48L2c+PC9zdmc+\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/antfu/eslint-config\"\u003e\u003cimg alt=\"code style\" src=\"https://antfu.me/badge-code-style.svg\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://app.fossa.com/projects/git%2Bgithub.com%2Fcloydlau%2Fvue-global-config?ref=badge_shield\u0026issueType=license\" alt=\"FOSSA Status\"\u003e\u003cimg src=\"https://app.fossa.com/api/projects/git%2Bgithub.com%2Fcloydlau%2Fvue-global-config.svg?type=shield\u0026issueType=license\"/\u003e\u003c/a\u003e\n  \u003ca href=\"https://bundlephobia.com/package/vue-global-config\"\u003e\u003cimg alt=\"minzipped size\" src=\"https://img.shields.io/bundlephobia/minzip/vue-global-config\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://arethetypeswrong.github.io/?p=vue-global-config\"\u003e\u003cimg alt=\"attw\" src=\"https://img.shields.io/badge/are_the_types_wrong%3F-analyze-3178C6?logo=typescript\u0026logoColor=white\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://conventionalcommits.org\"\u003e\u003cimg alt=\"conventional commits\" src=\"https://img.shields.io/badge/commits-Conventional-FE5196.svg?logo=conventionalcommits\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://semantic-release.gitbook.io\"\u003e\u003cimg alt=\"semantic release\" src=\"https://img.shields.io/badge/release-semantic-e10079?logo=semantic-release\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://pr.new\"\u003e\u003cimg src=\"https://developer.stackblitz.com/img/start_pr_dark_small.svg\" alt=\"Start new PR in StackBlitz Codeflow\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n- Vue 3\n\n```ts\napp.use(YourComponent, {\n  // Global Prop\n  'title': 'Global Title',\n\n  // Global Attr\n  'data': [\n    { key: 1, label: 'Global Option 1' },\n    { key: 2, label: 'Global Option 2' },\n  ],\n\n  // Global Listener\n  '@leftCheckChange': function () {\n    console.log('Global LeftCheckChange')\n  },\n\n  // Global Hook\n  '@vue:mounted': function () {\n    console.log('Global Mounted')\n  },\n\n  // Global Slot\n  '#left-footer': () =\u003e h('Fragment', undefined, 'Global Slot'),\n\n  // Global Scoped Slot\n  '#default': ({ option }) =\u003e h('Fragment', undefined, `${option.label} (From Global Scoped Slot)`),\n})\n```\n\n- Vue 2\n\n```ts\nVue.use(YourComponent, {\n  // Global Prop\n  'title': 'Global Title',\n\n  // Global Attr\n  'data': [\n    { key: 1, label: 'Global Option 1' },\n    { key: 2, label: 'Global Option 2' },\n  ],\n\n  // Global Listener\n  '@left-check-change': function () {\n    console.log('Global LeftCheckChange')\n  },\n\n  // Global Hook\n  '@hook:mounted': function () {\n    console.log('Global Mounted')\n  },\n\n  // Global Slot\n  '#left-footer': () =\u003e ({ render: h =\u003e h('span', undefined, 'Global Slot') }),\n\n  // Global Scoped Slot\n  '#default': ({ option }) =\u003e ({ render: h =\u003e h('span', undefined, `${option.label} (From Global Scoped Slot)`) }),\n})\n```\n\n\u003cbr\u003e\n\n## Why?\n\nVue provides support for globally registering components, but no configuration.\n\nSome UI framework like Element Plus thoughtfully provides [config-provider](https://element-plus.org/en-US/component/config-provider.html#config-provider-attributes).\n\nBut note that it's only for **partial props**. Global attrs/listeners/hooks/slots are all **not** supported.\n\nMake your components capable of globally configuring, is a not-that-hard but tiresome drudgery.\n\nEntangled in global/local/default parameters, which one to choose? It should be replaced or shallow merged or deep merged when it comes to plain object type? What if I want all functions triggered instead of ony one when it comes to function type? How to decide when both camel case and kebab case of a same parameter come together?\n\n\u003cbr\u003e\n\n## Features\n\n- Support Vue 2.6/2.7/3\n- Support global **Props**\n- Support global **Attrs**\n- Support global **Listeners**\n  - Support triggering both global listener and local listener\n  - Support triggering either global listener or local listener\n  - Support current instance (`this`) access\n- Support global **Hooks** (internal API)\n  - Such as `@vue:mounted`/`onVnodeMounted` in Vue 3, see https://github.com/vuejs/core/issues/4457\n  - Such as `@hook:mounted` in Vue 2, see https://github.com/vuejs/vue/issues/10312\n  - Support current instance (`this`) access\n- Support global **Slots** \u0026 **Scoped Slots**\n  - Vue 3\n    - Render function (`h`/`createVNode`)\n    - Component definition (`{ render: () =\u003e h() }` / `{ template: '...' }`)\n    - Locally or globally registered component name\n    - Imported SFC\n  - Vue 2\n    - Component definition (`{ render: h =\u003e h() }` / `{ template: '...' }` / `Vue.compile('\u003cspan\u003e...\u003c/span\u003e')`)\n    - Component constructor (`Vue.extend()`)\n    - Locally or globally registered component name\n    - Imported SFC\n- Provide weight algorithm to deal with trade-off and merging issues of global/local/default parameters.\n  - Support deep merge, shallow merge or directly replace values of plain object type\n  - Support merge or directly replace values of function type\n\n\u003cbr\u003e\n\n## Install\n\n### Peer Dependencies\n\n- vue\n- ~~@vue/composition-api~~: Only for Vue 2.6 or earlier\n\n### NPM\n\n```shell\nnpm i vue-global-config\n```\n\n### CDN + ESM\n\n```html\n\u003cscript type=\"importmap\"\u003e\n  {\n    \"imports\": {\n      \"vue\": \"https://cdn.jsdelivr.net/npm/vue/dist/vue.esm-browser.prod.js\",\n      \"vue-demi\": \"https://cdn.jsdelivr.net/npm/vue-demi/lib/v3/index.mjs\",\n      \"vue-global-config\": \"https://cdn.jsdelivr.net/npm/vue-global-config/dist/vue-global-config.mjs\"\n    }\n  }\n\u003c/script\u003e\n\u003cscript type=\"module\"\u003e\n  import {\n    conclude,\n    getLocalListeners,\n    listenGlobalHooks,\n    resolveConfig,\n  } from 'vue-global-config'\n\u003c/script\u003e\n```\n\n### CDN + IIFE\n\n```html\n\u003cscript src=\"https://cdn.jsdelivr.net/npm/vue-global-config@0.6\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n  const { conclude, getLocalListeners, listenGlobalHooks, resolveConfig } =\n    VueGlobalConfig\n\u003c/script\u003e\n```\n\n\u003cbr\u003e\n\n## Example\n\n- [Vue 3](./demo/vue3)\n- [Vue 2.7](./demo/vue2.7)\n- [Vue 2.6](./demo/vue2.6)\n\n\u003cbr\u003e\n\n## API\n\n\u003ca name=\"resolveConfig\"\u003e\u003c/a\u003e\n\n### resolveConfig\n\nGet global props, attrs, listeners, hooks and slots by analysing global parameters passed by component user.\n\n#### Params\n\n```ts\n/**\n * @param {Record\u003ckeyof any, any\u003e} globalConfig - global parameters\n * @param {Record\u003ckeyof any, any\u003e} [options] - Options\n * @param {string[] | Record\u003ckeyof any, any\u003e} [options.props = []] - local props, for the purpose of differentiating between props and attrs\n * @param {boolean} [options.camelizePropNames = false] - whether to camelize prop names\n * @returns {{\n *   props: Record\u003ckeyof any, any\u003e,\n *   attrs: Record\u003ckeyof any, any\u003e,\n *   listeners: Record\u003cstring, (...args: any) =\u003e unknown\u003e,\n *   hooks: Record\u003cstring, (...args: any) =\u003e unknown\u003e\n *   slots: Record\u003cstring, (...args: any) =\u003e unknown\u003e\n * }} global props, attrs, listeners, hooks and slots\n */\n```\n\n```ts\n// Example\n\n// Vue version before 2.7 should add an extra @vue/composition-api\n// import VCA from '@vue/composition-api'\n// Vue.use(VCA)\n\nimport { resolveConfig } from 'vue-global-config'\n\nresolveConfig({\n  'msg': 'some prop',\n  'placeholder': 'some attr',\n  '@blur': function () {},\n  '@hook:mounted': function () {},\n  '#left-footer': () =\u003e h('Fragment', undefined, 'Global Slot'),\n})\n```\n\n\u003cbr\u003e\n\n\u003ca name=\"conclude\"\u003e\u003c/a\u003e\n\n### conclude\n\n`Vue` provides local and default configuration of prop, but when wrapping components, there is a strong need for a \"global configuration\", which may otherwise lead to duplicate configurations for each component instance.\n\nFor example, the size and zIndex of `ElementUI` support global configuration.\n\nWhen there are more configurations, there is some judgment as to which configuration is used by the final component due to the different priorities.\n\nWhen it comes to objects and functions, this can get quite complicated.\n\nThe role of `conclude` is to help you figure out the final configuration.\n\n#### Features\n\n- Like Vue's props, it provides requirement, data type and custom validator\n- For plain object type prop, deep merge, shallow merge and direct override are supported\n- For function type prop, support merge and direct override\n- Support for unifying the keys of objects into camel names\n- Support for dynamic generation of default values\n\n#### Params\n\n```ts\n/**\n * @param {any[]} configSequence - Config sequence (priority from highest to lowest, last is the default value)\n * @param {Record\u003ckeyof any, any\u003e} [options] - Options\n * @param {PropType\u003cany\u003e} [options.type] - Data type checking\n * @param {any} [options.default] - Default value (explicit)\n * @param {boolean} [options.defaultIsDynamic = false] - Dynamic generation of default values\n * @param {boolean} [options.required = false] - Requirement checking\n * @param {(prop: any) =\u003e boolean} [options.validator] - Custom validator\n * @param {string} [options.camelizeObjectKeys = false] - Whether to camelize object keys\n * @param {false|string} [options.mergeObject = 'deep'] - The way to merge objects\n * @param {(objValue: any, srcValue: any, key: string, object: Record\u003cstring, any\u003e, source: Record\u003cstring, any\u003e, stack: object) =\u003e any} [options.mergeObjectCustomizer] - To produce the merged values of the destination and source properties. Returning undefined to maintain the default behavior\n * @param {boolean} [options.mergeObjectApplyOnlyToDefault = false] - `mergeObject` only works on `default`\n * @param {false|((accumulator, currentValue, currentIndex?, array?) =\u003e )} [options.mergeFunction = false] - The way to merge functions\n * @param {boolean} [options.mergeFunctionApplyOnlyToDefault = true] - `mergeFunction` only works on `default`\n * @returns {any} Final prop\n */\n```\n\n```ts\n// Example\n\nimport { conclude } from 'vue-global-config'\n\nconclude([1, 2, undefined]) // 1\n```\n\n#### How can we know whether a prop is passed or not?\n\nWhether the prop is all equal to `undefined` or not\n\n#### config.type\n\nSame as [Vue's prop validation](https://vuejs.org/guide/components/props.html#prop-validation).\n\n#### config.mergeObject\n\n- `'deep'`: Deep merge, where the object key of a high-weight prop overwrites the same-name key of a low-weight prop, containing nested objects (the default value)\n- `'shallow'`: Shallow merge, where the object key of a high weight prop overwrites the key of the same name of a low weight prop, without nested objects\n- `false`: No merging, direct overwriting, objects of high weight prop will directly overwrite objects of low weight prop, consistent with the behavior of value types\n\n#### config.mergeObjectCustomizer\n\nThe `customizer` argument of [mergeWith](https://lodash.com/docs#mergeWith) (`mergeObject: 'deep'`) or [assignInWith](https://lodash.com/docs#assignInWith) (`mergeObject: 'shallow'`) for customizing assigned values.\n\n#### config.mergeObjectApplyOnlyToDefault\n\nOff by default, only valid when mergeObject is on.\n\nWhen on, mergeObject's rules are only applied to the final comparison with default, and previous objects are still directly overwritten.\n\nWhen off, mergeObject's rules are applied to all object type prop weights.\n\nUsage scenario: The component author wants to merge the component's internal configuration with the component user's configuration, but the component user's own configuration at all levels remains directly overwritten by the rules.\n\n#### config.mergeFunction\n\nUsage Scenario: When wrapping a component, you may need to listen to certain events of the underlying dependency by configuration.\n\nWhen exposing the configuration for that dependency, the component user's configuration will conflict with yours.\n\n`mergeFunction` provides a customized way to merge function type prop.\n\nFor example, the well-known rich text library TinyMCE has a callback called `init_instance_callback` in its options.\n\nWhen wrapping this library, you can use it to do some initialization work and expose TinyMCE's options in order not to break the flexibility of the component.\n\nThe problem is that once the component user has configured this callback, it will conflict with your configuration.\n\nUnlike the configuration of other data types, function-type prop is not expected to be directly overridden by the user's configuration, and there is a need for \"fusion\".\n\nFusion: executes both functions configured by the component user and functions configured internally by the component.\n\nThe function type prop includes two cases:\n\n- prop is itself a function\n- prop is an object with function properties\n\n`conclude` internally uses `Array.prototype.reduce` to perform the function fusion, `mergeFunction` will be used as argument 1.\n\n```ts\nconclude([\n  () =\u003e {\n    console.log('I am option 1')\n  },\n  () =\u003e {\n    console.log('I am option 2')\n  }\n], {\n  default: () =\u003e {\n    console.log('I am default option')\n  },\n  mergeFunction: (accumulator, currentValue) =\u003e (...args) =\u003e {\n    accumulator(...args)\n    currentValue?.(...args)\n  },\n  mergeFunctionApplyOnlyToDefault: false,\n})()\n\n// Will print 'I am default option' 'I am option 2' 'I am option 1'\n```\n\n#### config.mergeFunctionApplyOnlyToDefault\n\nIs turned on by default and is only available when `mergeFunction` is on.\n\nFunction merging is, after all, a special behavior, and often only the component author will use this feature.\n\nFor component users, the configuration of function types may be more like Primitive Types and just override them.\n\nWhen turned on, the `mergeFunction` rule is only applied to the final comparison with default, and the previous function is still overwritten directly.\n\nWhen off, `mergeFunction`'s rules are applied to all function type prop weights.\n\n#### config.default\n\nExplicitly specify the default value.\n\nUseful when `mergeObjectApplyOnlyToDefault`, `mergeFunctionApplyOnlyToDefault` or `defaultIsDynamic` is enabled.\n\nWhen `defaultIsDynamic` is enabled, `config.default` should be a Function and its return value will be used for default value.\n\nOtherwise just put the default value at the end of `configSequence`.\n\n#### config.camelizeObjectKeys\n\nwithout\n\n```\nconst Props = conclude([...], {\n  default: (userProp) =\u003e {\n    if(userProp.beforeClose !== undefined || userProp['before-close'] !== undefined) {\n      ...\n    }\n  },\n  defaultIsDynamic: true,\n})\n\nif(Props.beforeClose !== undefined || Props['before-close'] !== undefined) {\n  ...\n}\n```\n\nwith\n\n```\nconst Props = conclude([...], {\n  default: (userProp) =\u003e {\n    if(userProp.beforeClose !== undefined) {\n      ...\n    }\n  },\n  defaultIsDynamic: true,\n})\n\nif(Props.beforeClose !== undefined) {\n  ...\n}\n```\n\nTake a look at this: `\u003cel-select value-key=\"id\" valueKey=\"code\" /\u003e`, so is `id` or `code` going to take effect?\n\nThe answer is `code` because `valueKey` is latter.\n\n`conclude([{ aB: 1, 'a-b': 2 }])` returns `{ aB: 2 }` in the same way.\n\nWith the global config, the situation can be quite complicated.\n\nWhat does `conclude([{ 'aB': 1, 'a-b': 2 }, { 'a-b': 4, 'aB': 3 }])` return?\n\n`{ aB: 1 }` if `conclude` merge object before unify the keys, because the merge process will change the order of keys.\n\nIt will be unpredictable with more props.\n\nSo `conclude` choose to unify the keys in advance, so `{ aB: 2 }` will be the answer, it's intuitive.\n\nWhy not take kebab-case as default?\n\n- Check [Official Vue style guide](https://v2.vuejs.org/v2/style-guide/index.html#Prop-name-casing-strongly-recommended)\n\n#### Dynamic default value\n\nUsage scenario: the default value needs to be determined according to the parameters passed by the component user.\n\n```ts\n// Example\n\nconclude([{\n  a: {\n    a: 1\n  }\n}, {\n  a: {\n    a: 2,\n    b: 1\n  }\n}], {\n  // userProp is the result of the calculation of parameter 1\n  default: userProp =\u003e ({\n    a: {\n      c: userProp.a.a === 1 ? 1 : null\n    }\n  }),\n  defaultIsDynamic: true,\n})\n\n/**\n * Will get:\n * {\n *   a: {\n *     a: 1,\n *     b: 1,\n *     c: 1\n *   }\n * }\n */\n```\n\n\u003cbr\u003e\n\n### getLocalListeners\n\nVue 2 only. For the purpose of listening local hooks.\n\nIn Vue 2, `this.$listeners` includes listeners \u0026 hooks.\n\nIn Vue 3, `attrs` includes attrs and listeners.\n\nAs a result in Vue 2, hooks passed locally will be improperly passed to the child component within your component, making hook triggered repeatedly.\n\nBy using `getLocalListeners(this.$listeners)`, you can get pure listeners without any hook.\n\n\u003cbr\u003e\n\n### listenGlobalHooks\n\nVue 2 only. For the purpose of listening global hooks.\n\nIn Vue 2, only Vue components can trigger a hook, HTML elements don't. So triggering both global \u0026 local hooks needs hijacking `emit`.\n\n\u003cbr\u003e\n\n## Changelog\n\nDetailed changes for each release are documented in the [release notes](https://github.com/cloydlau/vue-global-config/releases)\n\n\u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloydlau%2Fvue-global-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloydlau%2Fvue-global-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloydlau%2Fvue-global-config/lists"}