Skip to content
This repository was archived by the owner on Mar 8, 2019. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,31 @@ var vueDocs = require('vue-docgen-api')
var componentInfo = vueDocs.parse(filePath)
```

or with typescript/es6
or with typescript

```ts
import { parse } from 'vue-docgen-api'
var componentInfo = parse(filePath)
var componentInfo = parse(filePath);
var componentInfo = vueDocs.parse(filePath, {
alias: {"@assets": path.resolve(__dirname, "src/assets")},
resolve: [path.resolve(__dirname, "src")],
addScriptHandler: [function(
documentation: Documentation,
componentDefinition: NodePath,
astPath: bt.File,
opt: ParseOptions){
// handle custom code in script
}],
addTemplateHandler: [function(
documentation: Documentation,
templateAst: ASTElement,
options: TemplateParserOptions){
// handle custom directives here
}]
})
```

### parse(filePath)
### parse(filePath:string, options?: DocGenOptions)

| Parameter | Type | Description |
| --------- | ------ | ------------- |
Expand Down
27 changes: 20 additions & 7 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,33 @@
import { ComponentDoc, Documentation } from './Documentation'
import { parseFile, parseSource as parseSourceLocal } from './parse'
import { DocGenOptions, parseFile, ParseOptions, parseSource as parseSourceLocal } from './parse'
export { ScriptHandler, TemplateHandler } from './parse'
export { ComponentDoc, DocGenOptions, ParseOptions, Documentation }

export { ComponentDoc }

export function parse(filePath: string, aliases?: { [alias: string]: string }): ComponentDoc {
export function parse(
filePath: string,
opts?: DocGenOptions | { [alias: string]: string },
): ComponentDoc {
const doc = new Documentation()
parseFile(doc, { filePath, aliases })
const options: ParseOptions = isOptionsObject(opts)
? { ...opts, filePath }
: { filePath, alias: opts }
parseFile(doc, options)
return doc.toObject()
}

export function parseSource(
source: string,
filePath: string,
aliases?: { [alias: string]: string },
opts?: DocGenOptions | { [alias: string]: string },
): ComponentDoc {
const doc = new Documentation()
parseSourceLocal(doc, source, { filePath, aliases })
const options: ParseOptions = isOptionsObject(opts)
? { ...opts, filePath }
: { filePath, alias: opts }
parseSourceLocal(doc, source, options)
return doc.toObject()
}

function isOptionsObject(opts: any): opts is DocGenOptions {
return !!opts && !!opts.alias
}
2 changes: 1 addition & 1 deletion src/parse-script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { ParseOptions } from './parse'

const ERROR_MISSING_DEFINITION = 'No suitable component definition found'

type Handler = (
export type Handler = (
doc: Documentation,
componentDefinition: NodePath,
ast: bt.File,
Expand Down
50 changes: 42 additions & 8 deletions src/parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,47 @@ import * as fs from 'fs'
import * as path from 'path'
import { parseComponent, SFCDescriptor } from 'vue-template-compiler'
import { Documentation } from './Documentation'
import parseScript from './parse-script'
import parseTemplate from './parse-template'
import handlers from './script-handlers'
import parseScript, { Handler as ScriptHandler } from './parse-script'
import parseTemplate, { Handler as TemplateHandler } from './parse-template'
import scriptHandlers from './script-handlers'
import templateHandlers from './template-handlers'
import cacher from './utils/cacher'

const ERROR_EMPTY_DOCUMENT = 'The passed source is empty'

export interface ParseOptions {
export { ScriptHandler, TemplateHandler }

export interface ParseOptions extends DocGenOptions {
filePath: string
/**
* In what language is the component written
* @default undefined - let the system decide
*/
lang?: 'ts' | 'js'
}

export interface DocGenOptions {
/**
* Which exported variables should be looked at
* @default undefined - means treat all dependencies
*/
nameFilter?: string[]
aliases?: { [alias: string]: string }
/**
* What alias should be replaced in requires and imports
*/
alias?: { [alias: string]: string }
/**
* What directories should be searched when resolving modules
*/
modules?: string[]
/**
* Handlers that will be added at the end of the script analysis
*/
addScriptHandlers?: ScriptHandler[]
/**
* Handlers that will be added at the end of the template analysis
*/
addTemplateHandlers?: TemplateHandler[]
}

/**
Expand Down Expand Up @@ -50,7 +78,13 @@ export function parseSource(documentation: Documentation, source: string, opt: P

// get slots and props from template
if (parts && parts.template) {
parseTemplate(parts.template, documentation, templateHandlers, opt.filePath)
const addTemplateHandlers: TemplateHandler[] = opt.addTemplateHandlers || []
parseTemplate(
parts.template,
documentation,
[...templateHandlers, ...addTemplateHandlers],
opt.filePath,
)
}

const scriptSource = parts ? (parts.script ? parts.script.content : undefined) : source
Expand All @@ -60,8 +94,8 @@ export function parseSource(documentation: Documentation, source: string, opt: P
/\.tsx?$/i.test(path.extname(opt.filePath))
? 'ts'
: 'js'

parseScript(scriptSource, documentation, handlers, opt)
const addScriptHandlers: ScriptHandler[] = opt.addScriptHandlers || []
parseScript(scriptSource, documentation, [...scriptHandlers, ...addScriptHandlers], opt)
}

if (!documentation.get('displayName')) {
Expand Down
2 changes: 1 addition & 1 deletion src/script-handlers/extendsHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export default function extendsHandler(

const originalDirName = path.dirname(opt.filePath)

const pathResolver = makePathResolver(originalDirName, opt.aliases)
const pathResolver = makePathResolver(originalDirName, opt.alias)

resolveImmediatelyExportedRequire(pathResolver, extendsFilePath)

Expand Down
2 changes: 1 addition & 1 deletion src/script-handlers/mixinsHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default function mixinsHandler(
) {
const originalDirName = path.dirname(opt.filePath)

const pathResolver = makePathResolver(originalDirName, opt.aliases)
const pathResolver = makePathResolver(originalDirName, opt.alias)

// filter only mixins
const mixinVariableNames = getMixinsVariableNames(componentDefinition)
Expand Down
6 changes: 5 additions & 1 deletion src/utils/makePathResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import resolvePathFrom from '../utils/resolvePathFrom'
export default function makePathResolver(
refDirName: string,
aliases?: { [alias: string]: string },
modules?: string[],
): (filePath: string, originalDirNameOverride?: string) => string {
return (filePath: string, originalDirNameOverride?: string): string =>
resolvePathFrom(resolveAliases(filePath, aliases || {}), originalDirNameOverride || refDirName)
resolvePathFrom(resolveAliases(filePath, aliases || {}), [
originalDirNameOverride || refDirName,
...(modules || []),
])
}
4 changes: 2 additions & 2 deletions src/utils/resolvePathFrom.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
const SUFFIXES = ['', '.js', '.ts', '.vue', '/index.js', '/index.ts']

export default function resolvePathFrom(path: string, from: string): string {
export default function resolvePathFrom(path: string, from: string[]): string {
let finalPath = ''
SUFFIXES.forEach(s => {
if (!finalPath.length) {
try {
finalPath = require.resolve(`${path}${s}`, {
paths: [from],
paths: from,
})
} catch (e) {
// eat the error
Expand Down
1 change: 1 addition & 0 deletions tests/components/mixin-resolved/button.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

<script>
import { anotherMixin, myMixin } from '@mixins/index'
import { multi, hidden } from 'multiMixin'

export default {
mixins: [anotherMixin, myMixin],
Expand Down
5 changes: 4 additions & 1 deletion tests/components/mixin-resolved/resolved-mixin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@ let docButton: ComponentDoc
describe('tests button', () => {
beforeAll(done => {
docButton = parse(button, {
'@mixins': path.resolve(__dirname, '../../mixins'),
alias: {
'@mixins': path.resolve(__dirname, '../../mixins'),
},
modules: [path.resolve(__dirname, '../../mixins')],
})
done()
})
Expand Down