1
const path = require('node:path')
2
const { logError, writeFile, kebabCase } = require('./build.utils')
4
const { version } = require('../package.json')
6
const resolve = file => path.resolve(__dirname, '../dist/web-types', file)
8
function resolveType ({ type, values }) {
10
if (Array.isArray(type)) {
11
return type.map(type => resolveType({ type })).join('|')
13
if (type === 'String' && values) {
14
return values.map(v => (v === null ? 'null' : `'${ v }'`)).join('|')
16
if ([ 'Any', 'String', 'Boolean', 'Number', 'Object' ].includes(type)) {
17
return type.toLowerCase()
19
if (type === 'Array') {
25
function getDescription (propApi) {
26
return propApi.examples
27
? propApi.desc + '\n\nExamples:\n' + propApi.examples.join('\n')
31
module.exports.generate = function ({ api, compact = false }) {
32
const encodeFn = compact === true
34
: json => JSON.stringify(json, null, 2)
37
const webtypes = encodeFn({
44
'types-syntax': 'typescript',
46
tags: api.components.map(({ api: { events, props, scopedSlots, slots, meta }, name }) => {
49
Object.entries(slots).forEach(([ name, slotApi ]) => {
52
description: getDescription(slotApi),
53
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
59
Object.entries(scopedSlots).forEach(([ name, slotApi ]) => {
62
'vue-properties': slotApi.scope && Object.entries(slotApi.scope).map(([ name, api ]) => ({
64
type: resolveType(api),
65
description: getDescription(api),
66
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
68
description: getDescription(slotApi),
69
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
80
attributes: props && Object.entries(props).map(([ name, propApi ]) => {
85
type: resolveType(propApi)
87
description: getDescription(propApi),
88
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
90
if (propApi.required) {
91
result.required = true
93
if (propApi.default) {
94
result.default = JSON.stringify(propApi.default)
96
if (propApi.type === 'Boolean') {
98
result.type = 'boolean'
102
events: events && Object.entries(events).map(([ name, eventApi ]) => ({
104
arguments: eventApi.params && Object.entries(eventApi.params).map(([ paramName, paramApi ]) => ({
106
type: resolveType(paramApi),
107
description: getDescription(paramApi),
108
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
110
description: getDescription(eventApi),
111
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
114
description: `${ name } - Quasar component`,
115
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
117
if (props && props.value && ((events && events.input) || props.value.category === 'model')) {
118
result[ 'vue-model' ] = {
123
Object.entries(result).forEach(([ key, v ]) => {
132
attributes: api.directives.map(({ name, api: { modifiers, value, meta } }) => {
133
const valueType = value.type
135
name: 'v-' + kebabCase(name),
141
description: `${ name } - Quasar directive`,
142
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
145
result[ 'vue-modifiers' ] = Object.entries(modifiers).map(([ name, api ]) => ({
147
description: getDescription(api),
148
'doc-url': meta.docsUrl || 'https://v1.quasar.dev'
151
if (valueType !== 'Boolean') {
154
type: resolveType(value)
163
writeFile(resolve('web-types.json'), webtypes)
166
logError('build.web-types.js: something went wrong...')