From 5466bb85e0567ea389b91e8eff4ce58860bad783 Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 22 Jul 2019 13:02:43 +0530 Subject: [PATCH 01/11] create intial web-types.json, doesn't matches the schema --- packages/api-generator/.gitignore | 1 + packages/api-generator/src/index.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/api-generator/.gitignore b/packages/api-generator/.gitignore index 178135c2b27..e981c25d7a5 100644 --- a/packages/api-generator/.gitignore +++ b/packages/api-generator/.gitignore @@ -1 +1,2 @@ /dist/ +package-lock.json diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index f2fc9764631..e533eb11fd9 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -262,3 +262,5 @@ components['$vuetify'] = map['$vuetify'] components['internationalization'] = map['internationalization'] writeApiFile({ ...components, ...directives }, 'dist/api.js') + +writeJsonFile({ ...components, ...directives }, 'dist/web-types.json') From e6e312efdafb82c6ae6aecbe18acb528eb3a0163 Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 29 Jul 2019 17:00:35 +0530 Subject: [PATCH 02/11] web-types in poper format, but names need captalization --- packages/api-generator/src/index.js | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index e533eb11fd9..c62993fa6d1 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -3,6 +3,7 @@ const Vuetify = require('vuetify') const fs = require('fs') const map = require('./helpers/map') const deepmerge = require('./helpers/merge') +const pkg = require('../package.json') const hyphenateRE = /\B([A-Z])/g function hyphenate (str) { @@ -263,4 +264,28 @@ components['internationalization'] = map['internationalization'] writeApiFile({ ...components, ...directives }, 'dist/api.js') -writeJsonFile({ ...components, ...directives }, 'dist/web-types.json') +// Create web-types.json to provide autocomplete in JetBrains IDEs +const webTypes = { + // $schema: "../../schema/web-types.schema.json", + framework: "vue", + name: "vuetify", + version: pkg.version, + contributions: { + html: { + "types-syntax": "typescript", + tags: [], + } + } +} + +const webTypesTags = { ...components, ...directives } +Object.keys(webTypesTags).forEach(function(key) { + const name = key + const attributes = webTypesTags[key].props || [] + const events = webTypesTags[key].events || [] + const slots = webTypesTags[key].slots || [] + const tag = { name, attributes, events, slots } + webTypes.contributions.html.tags.push(tag); +}); + +writeJsonFile(webTypes, 'dist/web-types.json') From d53a19e04262ec9e08132ea2754f4ff0f5f0708c Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 29 Jul 2019 17:17:57 +0530 Subject: [PATCH 03/11] make linters happy --- packages/api-generator/src/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index c62993fa6d1..850631e1765 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -267,15 +267,15 @@ writeApiFile({ ...components, ...directives }, 'dist/api.js') // Create web-types.json to provide autocomplete in JetBrains IDEs const webTypes = { // $schema: "../../schema/web-types.schema.json", - framework: "vue", - name: "vuetify", + framework: 'vue', + name: 'vuetify', version: pkg.version, contributions: { html: { - "types-syntax": "typescript", + 'types-syntax': 'typescript', tags: [], - } - } + }, + }, } const webTypesTags = { ...components, ...directives } @@ -285,7 +285,7 @@ Object.keys(webTypesTags).forEach(function(key) { const events = webTypesTags[key].events || [] const slots = webTypesTags[key].slots || [] const tag = { name, attributes, events, slots } - webTypes.contributions.html.tags.push(tag); -}); + webTypes.contributions.html.tags.push(tag) +}) writeJsonFile(webTypes, 'dist/web-types.json') From a9f30528e3765bc94334d50ee14f5e038371a9fe Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 29 Jul 2019 17:18:26 +0530 Subject: [PATCH 04/11] don't change stuff in gitignore --- packages/api-generator/.gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/api-generator/.gitignore b/packages/api-generator/.gitignore index e981c25d7a5..178135c2b27 100644 --- a/packages/api-generator/.gitignore +++ b/packages/api-generator/.gitignore @@ -1,2 +1 @@ /dist/ -package-lock.json From 02a8f631143d5e9aa3260358d463df24d23969d2 Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 29 Jul 2019 18:00:28 +0530 Subject: [PATCH 05/11] make linters even more happy --- packages/api-generator/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index 850631e1765..76ab8fe1246 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -279,7 +279,7 @@ const webTypes = { } const webTypesTags = { ...components, ...directives } -Object.keys(webTypesTags).forEach(function(key) { +Object.keys(webTypesTags).forEach(function (key) { const name = key const attributes = webTypesTags[key].props || [] const events = webTypesTags[key].events || [] From 7ef2d12c5b2e7cd0c41bc1a1283965fadc39a79f Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 29 Jul 2019 18:06:38 +0530 Subject: [PATCH 06/11] convert name to pascal case --- packages/api-generator/src/index.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index 76ab8fe1246..703f772b6aa 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -5,6 +5,15 @@ const map = require('./helpers/map') const deepmerge = require('./helpers/merge') const pkg = require('../package.json') +const camelizeRE = /-(\w)/g +const camelize = str => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '') +} + +const capitalize = str => { + return str.charAt(0).toUpperCase() + str.slice(1) +} + const hyphenateRE = /\B([A-Z])/g function hyphenate (str) { return str.replace(hyphenateRE, '-$1').toLowerCase() @@ -280,7 +289,7 @@ const webTypes = { const webTypesTags = { ...components, ...directives } Object.keys(webTypesTags).forEach(function (key) { - const name = key + const name = capitalize(camelize(key)) const attributes = webTypesTags[key].props || [] const events = webTypesTags[key].events || [] const slots = webTypesTags[key].slots || [] From 2b9379b4b32730eb0fc31920362cff65efc32a1d Mon Sep 17 00:00:00 2001 From: Vaibhav Vishal Date: Mon, 23 Sep 2019 15:32:03 +0530 Subject: [PATCH 07/11] add schema --- packages/api-generator/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index 703f772b6aa..f47534e3064 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -275,7 +275,7 @@ writeApiFile({ ...components, ...directives }, 'dist/api.js') // Create web-types.json to provide autocomplete in JetBrains IDEs const webTypes = { - // $schema: "../../schema/web-types.schema.json", + $schema: "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json", framework: 'vue', name: 'vuetify', version: pkg.version, From 4313fadcc0208d6c38b1d11d1609e511f8a97718 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Wed, 23 Oct 2019 10:57:00 +0200 Subject: [PATCH 08/11] feat: Properly transform components and directives to match schema. --- packages/api-generator/src/index.js | 99 +++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 11 deletions(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index f47534e3064..3d491f177ad 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -15,6 +15,7 @@ const capitalize = str => { } const hyphenateRE = /\B([A-Z])/g + function hyphenate (str) { return str.replace(hyphenateRE, '-$1').toLowerCase() } @@ -268,14 +269,9 @@ writeJsonFile(attributes, 'dist/attributes.json') writePlainFile(fakeComponents(false), 'dist/fakeComponents.js') writePlainFile(fakeComponents(true), 'dist/fakeComponents.ts') -components['$vuetify'] = map['$vuetify'] -components['internationalization'] = map['internationalization'] - -writeApiFile({ ...components, ...directives }, 'dist/api.js') - // Create web-types.json to provide autocomplete in JetBrains IDEs const webTypes = { - $schema: "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json", + $schema: 'https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json', framework: 'vue', name: 'vuetify', version: pkg.version, @@ -283,18 +279,99 @@ const webTypes = { html: { 'types-syntax': 'typescript', tags: [], + attributes: [], }, }, } -const webTypesTags = { ...components, ...directives } -Object.keys(webTypesTags).forEach(function (key) { +components['$vuetify'] = map['$vuetify'] +components['internationalization'] = map['internationalization'] + +writeApiFile({ ...components, ...directives }, 'dist/api.js') + +delete components['$vuetify'] +delete components['internationalization'] + +Object.keys(components).forEach(function (key) { const name = capitalize(camelize(key)) - const attributes = webTypesTags[key].props || [] - const events = webTypesTags[key].events || [] - const slots = webTypesTags[key].slots || [] + const attributes = mapArray(components[key].props, transformAttribute) + const events = mapArray(components[key].events, transformEvent) + const slots = mapArray(components[key].slots, transformSlot) const tag = { name, attributes, events, slots } webTypes.contributions.html.tags.push(tag) + + function mapArray (arr, mapper) { + return arr !== undefined ? arr.map(mapper) : undefined + } + + function transformAttribute (attr) { + attr = copyObject(attr) + delete attr['source'] + if (attr['type']) { + attr['value'] = { + kind: 'expression', + type: attr['type'], + } + if (attr['type'] !== 'boolean') { + delete attr['type'] + } + } + if (attr['default'] !== undefined) { + attr['default'] = JSON.stringify(attr['default']) + } + delete attr['example'] + return attr + } + + function transformEvent (event) { + event = copyObject(event) + if (event['value'] !== undefined) { + const type = event['value'] + event.arguments = [{ + name: 'argument', + type: typeof type === 'string' ? type : JSON.stringify(type), + }] + } + delete event['value'] + delete event['source'] + return event + } + + function transformSlot (slot) { + slot = copyObject(slot) + if (slot['props'] !== undefined) { + const props = [] + Object.keys(slot['props']).forEach(function (name) { + const type = slot['props'][name] + props.push({ + name, + type: typeof type === 'string' ? type : JSON.stringify(type), + }) + }) + slot['vue-properties'] = props + } + delete slot['props'] + delete slot['source'] + return slot + } + + function copyObject (obj) { + const result = {} + if (typeof obj === 'string') { + result['name'] = obj + } else { + Object.keys(obj).forEach(function (name) { + result[name] = obj[name] + }) + } + return result + } +}) + +Object.keys(directives).forEach(function (key) { + const name = capitalize(camelize(key)) + const directive = { name } + webTypes.contributions.html.attributes.push(directive) }) writeJsonFile(webTypes, 'dist/web-types.json') From 5825514a7bb0d728f802fb8063760a2de4469842 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Wed, 23 Oct 2019 12:01:10 +0200 Subject: [PATCH 09/11] feat(web-types): add source property for components --- packages/api-generator/src/index.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index cc0dd2b497b..817c9ebb221 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -297,7 +297,13 @@ Object.keys(components).forEach(function (key) { const attributes = mapArray(components[key].props, transformAttribute) const events = mapArray(components[key].events, transformEvent) const slots = mapArray(components[key].slots, transformSlot) - const tag = { name, attributes, events, slots } + const tag = { + name, + source: { module: './src/components/index.ts', symbol: name }, + attributes, + events, + slots, + } webTypes.contributions.html.tags.push(tag) function mapArray (arr, mapper) { From f286862c41bcff5d2a4bb53045b3a0140db6f4e5 Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Wed, 23 Oct 2019 12:02:17 +0200 Subject: [PATCH 10/11] feat(web-types): improve directives metadata --- packages/api-generator/src/index.js | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/api-generator/src/index.js b/packages/api-generator/src/index.js index 817c9ebb221..fdbad0db0bf 100755 --- a/packages/api-generator/src/index.js +++ b/packages/api-generator/src/index.js @@ -375,9 +375,28 @@ Object.keys(components).forEach(function (key) { }) Object.keys(directives).forEach(function (key) { - const name = capitalize(camelize(key)) - const directive = { name } - webTypes.contributions.html.attributes.push(directive) + const name = key + const directive = directives[key] + const modifiers = [] + let valueType + let defaultValue + for (const option of directive.options || []) { + if (option.name.indexOf('modifiers.') === 0) { + modifiers.push({ + name: option.name.substr('modifiers.'.length), + }) + } else if (option.name === 'value') { + valueType = option.type + defaultValue = option.default + } + } + webTypes.contributions.html.attributes.push({ + name, + source: { module: './src/directives/index.ts', symbol: capitalize(name.substr(2)) }, + default: defaultValue, + value: valueType ? { kind: 'expression', type: valueType } : undefined, + 'vue-modifiers': modifiers.length > 0 ? modifiers : undefined, + }) }) writeJsonFile(webTypes, 'dist/web-types.json') From 539ed67cadfe6d66cb67d17539fa60d411f8bc5a Mon Sep 17 00:00:00 2001 From: Piotr Tomiak Date: Wed, 23 Oct 2019 12:14:41 +0200 Subject: [PATCH 11/11] feat(web-types): include web-types in vuetify dist --- packages/vuetify/build/build-json.js | 1 + packages/vuetify/package.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vuetify/build/build-json.js b/packages/vuetify/build/build-json.js index b213d04dd0c..0b52004394b 100644 --- a/packages/vuetify/build/build-json.js +++ b/packages/vuetify/build/build-json.js @@ -6,3 +6,4 @@ shell.cd('../api-generator') shell.exec('yarn build') shell.mv('dist/tags.json', '../vuetify/dist/json') shell.mv('dist/attributes.json', '../vuetify/dist/json') +shell.mv('dist/web-types.json', '../vuetify/dist/json') diff --git a/packages/vuetify/package.json b/packages/vuetify/package.json index 40ad25437aa..70ae90ee3f6 100644 --- a/packages/vuetify/package.json +++ b/packages/vuetify/package.json @@ -111,5 +111,6 @@ "vetur": { "tags": "dist/json/tags.json", "attributes": "dist/json/attributes.json" - } + }, + "web-types": "dist/json/web-types.json" }