Skip to content

ghostdevv/extractinator

Folders and files

NameName
Last commit message
Last commit date
Sep 17, 2024
Sep 17, 2024
Sep 17, 2024
Sep 17, 2024
Sep 17, 2024
Oct 19, 2023
Nov 5, 2023
Sep 17, 2024
Oct 13, 2023
Sep 17, 2024
Nov 5, 2023
Oct 13, 2023
Dec 26, 2023
Oct 13, 2023
Sep 17, 2024
Sep 17, 2024
Sep 17, 2024
Sep 17, 2024
Sep 17, 2024

Repository files navigation

Extractinator

A tool to extract the api information from Svelte and TS/JS files. Extract slots, events, module exports, props, and css props all with parsed tsdoc comments.


Usage

Install

pnpm i -D extractinator

Extract

pnpm extractinator extract <input_folder> <output_folder>


Requirements

Tool Version
Node v18 >=
TS 5.3 (other v5 may work, untested)
Svelte v4

CLI

$ extractinator --help

  Usage
    $ extractinator <command> [options]

  Available Commands
    extract    Extract the nator

  For more info, run any command with the `--help` flag
    $ extractinator extract --help

  Options
    --version  -v   Displays current version
    --help     -h   Displays this message
    --quiet    -q   Disabled all logging
    --verbose	    Enables verbose logging

JS API

import { extractinator } from 'extractinator'

interface ExtractinatorOptions {
	input: string
	tsdocConfigPath?: string
}

const results = await extractinator({
	// Path to the input file(s).  Will recursively search for svelte and ts files.
	input: './playground',

	// (optional) Path to a custom tsdoc config.  This will be merged with the internal config.
	tsdocConfigPath: './tsdoc.json',
})

Example

Input:

Example.svelte

<!-- 
	@component
	Example Svelte Component

	@example Simple
	```html
	<Example />
	```

	@example Slots
	```html
	<Example>
		<div slot="test">Test</div>
	</Example>
-->

<script context="module">
	import { writable } from 'svelte/store'

	/**
	 * The state the component is in
	 * @default true
	 */
	export const state = (writable < string) | number | (boolean > true)
</script>

<script lang="ts">
	/**
	 * Let the thing know whether it's on earth
	 */
	export let isExample: boolean
</script>

<button on:click> Is an example: {isExample} </button>

<div>
	<slot {isExample} />
	<slot name="test" />
</div>

Output:

Example.svelte.doc.json

{
	"type": "svelte",
	"fileName": "Example.svelte",
	"filePath": "playground/Example.svelte",
	"comment": {
		"raw": "/**\n * Example Svelte Component\n *\n * @example\n *\n * Simple\n * ```html\n * <Example />\n * ```\n *\n * @example\n *\n * Slots ```html <Example> <div slot=\"test\">Test</div> </Example>\n */",
		"summary": "Example Svelte Component",
		"examples": [
			{
				"name": "Simple",
				"content": "```html\n<Example />\n```"
			},
			{
				"name": "Slots",
				"content": "```html\n<Example>\n\t<div slot=\"test\">Test</div>\n</Example>"
			}
		]
	},
	"componentName": "Example",
	"props": [
		{
			"comment": {
				"raw": "/**\n * Let the thing know whether it's an example or not.\n */",
				"summary": "Let the thing know whether it's an example or not."
			},
			"name": "isExample",
			"type": "boolean"
		}
	],
	"events": [
		{
			"name": "click",
			"type": "HTMLElementEventMap"
		}
	],
	"slots": [
		{
			"name": "default",
			"props": [
				{
					"name": "isExample",
					"type": "boolean"
				}
			]
		},
		{
			"name": "test",
			"props": []
		}
	],
	"exports": [
		{
			"comment": {
				"raw": "/**\n * The state the component is in\n *\n * @default\n *\n * true\n */",
				"summary": "The state the component is in",
				"defaultValue": "true"
			},
			"name": "state",
			"type": "Writable<string | number | boolean>"
		}
	]
}