├── .eslintignore
├── .eslintrc.json
├── .github
└── workflows
│ └── nodejs.yml
├── .gitignore
├── .npmignore
├── .vscode
├── launch.json
└── settings.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── examples
├── Alert.json
├── Alert.svelte
├── Button.json
├── Button.svelte
├── SlotList.json
└── SlotList.svelte
├── index.js
├── lib
├── detector.js
├── helpers.js
├── jsdoc.js
├── options.js
├── parser.js
├── utils.js
└── v3
│ ├── events.js
│ ├── parser.js
│ ├── script.js
│ ├── template.js
│ └── v3-utils.js
├── package.json
├── scripts
└── generate-examples.js
├── test
├── integration
│ ├── detector
│ │ ├── detector.spec.js
│ │ ├── empty.svelte
│ │ ├── v2
│ │ │ ├── elseif.svelte
│ │ │ ├── exportDefault.svelte
│ │ │ └── ref.svelte
│ │ └── v3
│ │ │ ├── context.svelte
│ │ │ ├── contextAndScript.svelte
│ │ │ ├── elseif.svelte
│ │ │ └── letInSlot.svelte
│ └── parse
│ │ ├── basicV2.svelte
│ │ ├── basicV3.svelte
│ │ └── parse.spec.js
├── svelte2
│ └── integration
│ │ ├── basics
│ │ ├── basic.description.svelte
│ │ └── basic.spec.js
│ │ ├── data
│ │ ├── data.description.svelte
│ │ ├── data.plain.svelte
│ │ ├── data.spec.js
│ │ ├── data.typeFromDescription.svelte
│ │ └── data.typeFromValue.svelte
│ │ ├── events
│ │ ├── event.markup.fire.svelte
│ │ ├── event.markup.modificators.svelte
│ │ ├── event.markup.propogate.svelte
│ │ ├── event.method.fire.identifier.svelte
│ │ ├── event.method.fire.svelte
│ │ └── events.spec.js
│ │ ├── failure
│ │ ├── failure.invalid.js.svelte
│ │ └── failure.spec.js
│ │ ├── locations
│ │ ├── locations.spec.js
│ │ └── main.svelte
│ │ ├── overall
│ │ ├── main.svelte
│ │ ├── overall.main.doc.json
│ │ └── overall.main.spec.js
│ │ └── store
│ │ ├── store.get.markup.svelte
│ │ ├── store.markup.svelte
│ │ ├── store.set.markup.svelte
│ │ └── store.spec.js
├── svelte3
│ └── integration
│ │ ├── basic
│ │ ├── basic.name.svelte
│ │ ├── basic.name.wc.svelte
│ │ └── basic.spec.js
│ │ ├── bind
│ │ ├── bind.declared.svelte
│ │ ├── bind.exported.svelte
│ │ ├── bind.multiple.svelte
│ │ ├── bind.named.svelte
│ │ ├── bind.simple.svelte
│ │ └── bind.spec.js
│ │ ├── components
│ │ ├── components.import.aliace.svelte
│ │ ├── components.import.svelte
│ │ ├── components.importStar.svelte
│ │ ├── components.importable.js
│ │ ├── components.lowercase.svelte
│ │ ├── components.nested.svelte
│ │ ├── components.notdefault.svelte
│ │ └── components.spec.js
│ │ ├── computed
│ │ ├── computed.declaration.svelte
│ │ ├── computed.expression.svelte
│ │ └── computed.spec.js
│ │ ├── data
│ │ ├── const.importable.js
│ │ ├── data.const.svelte
│ │ ├── data.export.aliace.svelte
│ │ ├── data.export.functionExpression.svelte
│ │ ├── data.export.many.svelte
│ │ ├── data.exportNamed.many.svelte
│ │ ├── data.import.aliace.svelte
│ │ ├── data.import.default.svelte
│ │ ├── data.import.many.svelte
│ │ ├── data.multiple.svelte
│ │ ├── data.objectPattern.svelte
│ │ ├── data.private.svelte
│ │ ├── data.public.svelte
│ │ ├── data.spec.js
│ │ ├── data.static.svelte
│ │ └── data.types.svelte
│ │ ├── events
│ │ ├── event.dispatcher.arrayIdentifier.svelte
│ │ ├── event.dispatcher.custom.svelte
│ │ ├── event.dispatcher.customConstructor.svelte
│ │ ├── event.dispatcher.default.svelte
│ │ ├── event.dispatcher.externalCallback.svelte
│ │ ├── event.dispatcher.identifier.svelte
│ │ ├── event.dispatcher.importedIdentifier.svelte
│ │ ├── event.dispatcher.insideMethod.svelte
│ │ ├── event.dispatcher.markup.svelte
│ │ ├── event.markup.dispatcher.custom.svelte
│ │ ├── event.markup.dispatcher.customConstructor.svelte
│ │ ├── event.markup.dispatcher.default.function.svelte
│ │ ├── event.markup.dispatcher.default.svelte
│ │ ├── event.markup.handleAndPropogate.svelte
│ │ ├── event.markup.modificators.svelte
│ │ ├── event.markup.propogate.svelte
│ │ ├── events.spec.js
│ │ └── sharedEvents.importable.js
│ │ ├── globalComment
│ │ ├── globalComment.markup.svelte
│ │ ├── globalComment.nested.svelte
│ │ ├── globalComment.noComment.svelte
│ │ ├── globalComment.script.svelte
│ │ └── globalComment.spec.js
│ │ ├── locations
│ │ ├── locations.multiscripts.svelte
│ │ └── locations.spec.js
│ │ ├── methods
│ │ ├── method.private.svelte
│ │ ├── method.public.svelte
│ │ ├── method.typeInference.svelte
│ │ └── methods.spec.js
│ │ ├── refs
│ │ ├── ref.component.svelte
│ │ ├── ref.declared.svelte
│ │ ├── ref.simple.svelte
│ │ └── refs.spec.js
│ │ └── slots
│ │ ├── slot.comments.svelte
│ │ ├── slot.default.svelte
│ │ ├── slot.named.svelte
│ │ ├── slot.parameters.svelte
│ │ └── slots.spec.js
└── unit
│ ├── helpers
│ ├── helpers.spec.js
│ └── utils.spec.js
│ ├── jsdoc
│ └── jsdoc.spec.js
│ └── options
│ └── options.spec.js
├── typings.d.ts
└── yarn.lock
/.eslintignore:
--------------------------------------------------------------------------------
1 | /test/**/*.importable.js
--------------------------------------------------------------------------------
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "eslint:recommended",
3 | "parserOptions": {
4 | "ecmaVersion": 2018,
5 | "ecmaFeatures": {
6 | "jsx": false
7 | }
8 | },
9 | "env": {
10 | "node": true,
11 | "mocha": true,
12 | "es6": true
13 | },
14 | "globals": {
15 | "expect": false
16 | },
17 | "plugins": [
18 | "chai-expect"
19 | ],
20 | "settings": {
21 | },
22 | "rules": {
23 | "curly": ["error", "all"],
24 | "no-var": "error",
25 | "indent": ["error", 4, { "SwitchCase": 1 }],
26 | "semi": ["error", "always"],
27 | "object-curly-spacing": ["error", "always"],
28 | "comma-dangle": ["error", "only-multiline"],
29 | "space-before-function-paren": [
30 | "error",
31 | {
32 | "anonymous": "always",
33 | "named": "never",
34 | "asyncArrow": "always"
35 | }
36 | ],
37 | "padding-line-between-statements": [
38 | "error",
39 | {
40 | "blankLine": "always",
41 | "prev": ["directive", "import", "const", "let", "block-like"],
42 | "next": "*"
43 | },
44 | {
45 | "blankLine": "always",
46 | "prev": "*",
47 | "next": ["export", "return", "throw", "block-like"]
48 | },
49 | {
50 | "blankLine": "any",
51 | "prev": "import",
52 | "next": "import"
53 | },
54 | {
55 | "blankLine": "any",
56 | "prev": "const",
57 | "next": "const"
58 | },
59 | {
60 | "blankLine": "any",
61 | "prev": "let",
62 | "next": "let"
63 | }
64 | ],
65 | "padded-blocks": ["error", "never"],
66 | "prefer-rest-params": "error",
67 | "prefer-spread": "error",
68 | "prefer-const": "error",
69 | "chai-expect/terminating-properties": 1,
70 | "no-unused-expressions": "off"
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/.github/workflows/nodejs.yml:
--------------------------------------------------------------------------------
1 | name: Node CI
2 |
3 | on:
4 | pull_request:
5 | branches:
6 | - master
7 | push:
8 |
9 |
10 | jobs:
11 | lint:
12 | runs-on: ubuntu-latest
13 | strategy:
14 | matrix:
15 | node-version: [12.x]
16 |
17 | steps:
18 | - uses: actions/checkout@v1
19 | - name: Use Node.js ${{ matrix.node-version }}
20 | uses: actions/setup-node@v1
21 | with:
22 | node-version: ${{ matrix.node-version }}
23 | - name: npm install, build, and test
24 | run: |
25 | npm install
26 | npm run test
27 | env:
28 | CI: true
29 |
30 | tests:
31 | runs-on: ubuntu-latest
32 |
33 | strategy:
34 | matrix:
35 | node-version: [12.x, 14.x]
36 |
37 | steps:
38 | - uses: actions/checkout@v1
39 | - name: Use Node.js ${{ matrix.node-version }}
40 | uses: actions/setup-node@v1
41 | with:
42 | node-version: ${{ matrix.node-version }}
43 | - name: npm install, build, and test
44 | run: |
45 | npm install
46 | npm run test
47 | env:
48 | CI: true
49 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | *.log
3 | /build
4 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | /test
2 | /examples
3 | /scripts
4 | .eslintrc.json
5 | .gitignore
6 | yarn.lock
7 | .github
8 | .vscode
9 | yarn-error.log
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "request": "launch",
9 | "name": "Debug Mocha Test",
10 | "type": "node",
11 | "program": "${workspaceRoot}/node_modules/mocha/bin/_mocha",
12 | "args": [
13 | "./test/**/*.spec.js",
14 | "--colors",
15 | "--no-timeouts"
16 | ],
17 | "cwd": "${workspaceRoot}",
18 | "runtimeExecutable": null,
19 | "env": {}
20 | }
21 | ]
22 | }
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.eol": "\n"
3 | }
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 | All notable changes to the "svelte-intellisense" extension will be documented in this file.
3 |
4 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
5 |
6 | ## UNPUBLISHED
7 |
8 | ## [4.2.0] 14.12.2021
9 |
10 | - 🔒 **[Fixed]** Upgrade all dependecies to latest version to solve known vulnarability issues.
11 | - ✔ **[Added]** Add support ES6 default value assignment for method parameter [Issue #75](https://github.com/alexprey/sveltedoc-parser/issues/75). Thanks for @ekhaled.
12 | - ✔ **[Added]** Add support of method parsing when it assigned to identifier [Issue #78](https://github.com/alexprey/sveltedoc-parser/issues/78). Thanks for @ekhaled.
13 | - ✔ **[Added]** Extend typings to support `self` and `trusted` event modifiers [Issue #80].
14 | - ✔ **[Added]** Introduce `JSDocTypeFunction` to support functions types in variable definitions and provide details about function parameters and methods.
15 | - ✔ **[Added]** Extend `JSDocType` to support new `JSDocTypeFunction`
16 | - ✔ **[Added]** Improve type infering from assigned value. Currently support simple infering: `array`, `object`, `function`.
17 | - 🛠 **[Fixed]** Fix the [Issue #67](https://github.com/alexprey/sveltedoc-parser/issues/67), [Issue #69](https://github.com/alexprey/sveltedoc-parser/issues/69): specifier comments are not parsed properly; Thanks to @ekhaled
18 | - 🛠 **[Fixed]** Fix the [Issue #72](https://github.com/alexprey/sveltedoc-parser/issues/72): Module context scripts look for the wrong attribute
19 | - 🛠 **[Fixed]** Fix the [Issue #83](https://github.com/alexprey/sveltedoc-parser/issues/83): Default value and keywords of exported aliases not merged.
20 |
21 | ## [4.1.0] 19.02.2021
22 |
23 | - 🎉 **[Misc]** Update the ReadMe by [@soft-decay](https://github.com/soft-decay).
24 | - ✔ **[Added]** Implement support of imported types parsing, f.ex. `@type {import('../typings.d.ts').ExternalTypeClass}`. In order to do this, new field `importPath` introduced to `JSDocType`, in the name property now it returns imported class name, f.ex.: `ExternalTypeClass`.
25 | - 🛠 **[Fixed]** Complete fix of [Issue #1](https://github.com/alexprey/sveltedoc-parser/issues/1): Support parsing event names from top-level constant objects with accessing to their properties by naming strings. Introduce the new issue [Issue #48](https://github.com/alexprey/sveltedoc-parser/issues/48) about supporting parse of event names by external references.
26 | - 🛠 **[Fixed]** Fix the [Issue #47](https://github.com/alexprey/sveltedoc-parser/issues/48), now all comments in markup are parsed correctly and attached to required items in document. Support JSDoc comment markup parsing in all places where comment can be used.
27 | - 🛠 **[Fixed]** Fix the [Issue #61](https://github.com/alexprey/sveltedoc-parser/issues/61), now slot parameter items enrich with all detailed information that was parsed from markup comment.
28 | - 🛠 **[Fixed]** Spec: add the module definition typings to `typings.d.ts` file.
29 | - 🛠 **[Fixed]** Fix some edge-cases in script parsing logic.
30 | - 🛠 **[Tech]** Refactor internal parser logic to make it easy to introduce new features, moves forward to TS support! ;)
31 | - 🔥 **[Breaking]** Spec: change the `SvelteSlotParameter` definition, to support `name`, `description`, `type` fields, instead of many not relevant fields that was inherited from `ISvelteItem` interface.
32 | - 🔥 **[Breaking]** Spec: change the `SvelteSlotItem` definition, to improve consistency:
33 | - Rename `parameters` property to `params` to be most likely the same as `SvelteMethodItem`. Old field still available until 5.* release.
34 |
35 | Thanks a lot [@soft-decay](https://github.com/soft-decay) for contributing in this release!
36 |
37 | ## [4.0.0] 25.01.2021
38 |
39 | - 🛠 **[Fixed]** Fix [Issue #42](https://github.com/alexprey/sveltedoc-parser/issues/42)
40 | - 🛠 **[Fixed]** Partially fixed [Issue #1](https://github.com/alexprey/sveltedoc-parser/issues/1). Now event name correcly parsed if it provided by top-level constant of the same file. Thanks for [@soft-decay](https://github.com/soft-decay)
41 | - ✔ **[Added]** Support to complete parsing of component method arguments [Issue #39](https://github.com/alexprey/sveltedoc-parser/issues/39). Thanks for [@soft-decay](https://github.com/soft-decay)
42 | - ✔ **[Added]** Support to parse return types and description for methods in component [Issue #37](https://github.com/alexprey/sveltedoc-parser/issues/37). Thanks for [@soft-decay](https://github.com/soft-decay)
43 | - ✔ **[Added]** Options validation, thanks for [@soft-decay](https://github.com/soft-decay)
44 | - 🔥 **[Breaking]** API rework for component methods description:
45 | - `args` property was renamed to `params`;
46 | - Change the structure of `return` item for methods:
47 | - `desc` property was renamed to `description`;
48 | - `type` property now contains the `JSDocType` object, instead of `string` type with text representation of type. This can be gets from `text` property of `JSDocType` object;
49 | - [Svelte2]: method arguments was presented with plain array with names, now that replaced with objects of `SvelteMethodParamItem` type;
50 | - 🔥 **[Breaking]** Cleanup depricated code:
51 | - `loc` property was removed, please use `locations` instead, if you late with upgrade;
52 | - `value` property of `SvelteComponentItem` was removed, please use `importPath` instead
53 |
54 | ## [3.0.5] 28.11.2020
55 |
56 | - 🛠 **[Fixed]** Fix [Issue #35](https://github.com/alexprey/sveltedoc-parser/issues/35): Object literals not supported in @type keyword. Thanks for @soft-decay
57 |
58 | ## [3.0.4] 25.08.2020
59 |
60 | - 🛠 **[Fixed]** Fix [issue #5](https://github.com/alexprey/sveltedoc-parser/issues/5) (slots items have a private access level by default)
61 |
62 | ## [3.0.3] 25.08.2020
63 |
64 | - 🛠 **[Fixed]** Fix [issue #28](https://github.com/alexprey/sveltedoc-parser/issues/28) (Inline event handlers in markup cause errors when used without quotes)
65 | - Change dependency from `htmlparser2` to [htmlparser2-svelte](https://www.npmjs.com/package/htmlparser2-svelte) special fork of [htmlparser2](https://www.npmjs.com/package/htmlparser2) to handle Svelte specific cases to parse markup
66 |
67 | ## [3.0.2] 24.08.2020
68 |
69 | - 🛠 **[Fixed]** Fix issue #6 (Build a correct component name from a file name)
70 | ```
71 | round.button.svelte -> RoundButton
72 | ```
73 | - 🛠 **[Fixed]** Fix [issue #27](https://github.com/alexprey/sveltedoc-parser/issues/27) (Events is not exposed from exported functions and arrow functions)
74 | - 🛠 **[Fixed]** Fix [issue #31](https://github.com/alexprey/sveltedoc-parser/issues/31) (Propogated events in markup should be parsed even it was before handled)
75 | - 🛠 **[Fixed]** Fix [issue #32](https://github.com/alexprey/sveltedoc-parser/issues/32) (Event is not registered when dispatched from functions used as a parameters of another functions)
76 |
77 | ## [3.0.1] 17.08.2020
78 |
79 | - [Fixed] Solve issue #26, support `export { variables as var }` statement.
80 | - [Added] now interface `SvelteDataItem` provides a new property `localName` with information about internal name of component property.
81 |
82 | ## [3.0.0] 08.08.2020
83 |
84 | - [Fixed] Solve vulnerability issues:
85 | - Update `espree` to `7.2.0`
86 | - Update `htmlparser2` to `3.9.2`
87 | - Add dependency to `eslint` to fix issues after upgrading to new versions
88 | - [Breaking] Increase requirement of Node.js to `10.0.0`, Node.js v8 now is not supported, this is related with security isssues above. Please let me know if it still required.
89 |
90 | ## [2.3.4] 10.12.2019
91 |
92 | - [Fixed] Now `keywords` feature correctly supported.
93 |
94 | Thanks to [hontas](https://github.com/hontas) for following changes:
95 |
96 | - [Fixed] Svelte V3: Fix parsing of types for data items, defined by `@type` keyword.
97 |
98 | ## [2.3.3] 05.12.2019
99 |
100 | Thanks to [hontas](https://github.com/hontas) for following changes:
101 |
102 | - [Added] Svelte V3: Implement component documentation parsing provided by top level comment in HTML markup or in the JS section, marked with `@component` JSDoc attribute.
103 |
104 | ## [2.3.2] 02.12.2019
105 |
106 | Thanks to [Hostas](https://github.com/hontas) for following fixes:
107 |
108 | - [Fixed] Svelte V3: Improve type parsing for properties with default values.
109 | - [Fixed] Svelte V3: In some cases `type` property was setup with wrong structure and data, now it fixed.
110 |
111 | ## [2.3.1] 25.11.2019
112 |
113 | - [Fixed] Svelte V3: Fix parsing issues when anonymous functions are used in event handlers at markup (Issue #18)
114 |
115 | ## [2.3.0] 02.10.2019
116 |
117 | - [Added] Svelte V3: Implement support of script element locations
118 | - [Fixed] Svelte V3: Fix parsing when component have multiple `
22 |
23 |
24 |
25 |
26 |
27 |
28 | {#if closable}
29 |
30 |
34 |
35 |
36 | {/if}
37 |
--------------------------------------------------------------------------------
/examples/Button.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "name": "Button",
4 | "data": [
5 | {
6 | "keywords": [
7 | {
8 | "name": "type",
9 | "description": "{string}"
10 | }
11 | ],
12 | "visibility": "public",
13 | "description": "The text content of the button.",
14 | "name": "text",
15 | "kind": "let",
16 | "static": false,
17 | "readonly": false,
18 | "type": {
19 | "kind": "type",
20 | "text": "string",
21 | "type": "string"
22 | },
23 | "defaultValue": ""
24 | },
25 | {
26 | "keywords": [
27 | {
28 | "name": "type",
29 | "description": "{'default'|'primary'|'danger'|'success'}"
30 | }
31 | ],
32 | "visibility": "public",
33 | "description": "The style type of the button.",
34 | "name": "type",
35 | "kind": "let",
36 | "static": false,
37 | "readonly": false,
38 | "type": {
39 | "kind": "union",
40 | "text": "'default'|'primary'|'danger'|'success'",
41 | "type": [
42 | {
43 | "kind": "const",
44 | "text": "'default'",
45 | "type": "string",
46 | "value": "default"
47 | },
48 | {
49 | "kind": "const",
50 | "text": "'primary'",
51 | "type": "string",
52 | "value": "primary"
53 | },
54 | {
55 | "kind": "const",
56 | "text": "'danger'",
57 | "type": "string",
58 | "value": "danger"
59 | },
60 | {
61 | "kind": "const",
62 | "text": "'success'",
63 | "type": "string",
64 | "value": "success"
65 | }
66 | ]
67 | },
68 | "defaultValue": "default"
69 | },
70 | {
71 | "keywords": [
72 | {
73 | "name": "type",
74 | "description": "{'small'|'normal'|'big'}"
75 | }
76 | ],
77 | "visibility": "public",
78 | "description": "The size of the button.",
79 | "name": "size",
80 | "kind": "let",
81 | "static": false,
82 | "readonly": false,
83 | "type": {
84 | "kind": "union",
85 | "text": "'small'|'normal'|'big'",
86 | "type": [
87 | {
88 | "kind": "const",
89 | "text": "'small'",
90 | "type": "string",
91 | "value": "small"
92 | },
93 | {
94 | "kind": "const",
95 | "text": "'normal'",
96 | "type": "string",
97 | "value": "normal"
98 | },
99 | {
100 | "kind": "const",
101 | "text": "'big'",
102 | "type": "string",
103 | "value": "big"
104 | }
105 | ]
106 | },
107 | "defaultValue": "normal"
108 | },
109 | {
110 | "keywords": [
111 | {
112 | "name": "type",
113 | "description": "{{ rtl: boolean, lang: string }}"
114 | }
115 | ],
116 | "visibility": "public",
117 | "description": "Additional options for the button.",
118 | "name": "options",
119 | "kind": "let",
120 | "static": false,
121 | "readonly": false,
122 | "type": {
123 | "kind": "type",
124 | "text": "{ rtl: boolean, lang: string }",
125 | "type": "{ rtl: boolean, lang: string }"
126 | }
127 | }
128 | ],
129 | "computed": [],
130 | "methods": [
131 | {
132 | "keywords": [
133 | {
134 | "name": "param",
135 | "description": "{string} [question=Why?] a question about life, the universe, everything"
136 | },
137 | {
138 | "name": "returns",
139 | "description": "{number} the answer to all your questions"
140 | }
141 | ],
142 | "visibility": "public",
143 | "description": "Computes the answer to your question.",
144 | "name": "computeAnswer",
145 | "params": [
146 | {
147 | "type": {
148 | "kind": "type",
149 | "text": "string",
150 | "type": "string"
151 | },
152 | "name": "question",
153 | "description": "a question about life, the universe, everything",
154 | "optional": true,
155 | "defaultValue": "Why?"
156 | }
157 | ],
158 | "return": {
159 | "type": {
160 | "kind": "type",
161 | "text": "number",
162 | "type": "number"
163 | },
164 | "description": "the answer to all your questions"
165 | },
166 | "static": false
167 | }
168 | ],
169 | "components": [],
170 | "description": "The simple component button.",
171 | "keywords": [
172 | {
173 | "name": "component",
174 | "description": "Button"
175 | },
176 | {
177 | "name": "example",
178 | "description": "