@markee/diagrams 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/LICENSE +13 -0
- package/_assets/_head/assets/__basePickBy-seJymvZv.js +1 -0
- package/_assets/_head/assets/__baseUniq-BbfvCSQ0.js +1 -0
- package/_assets/_head/assets/_api-BbxJBqLU.js +54 -0
- package/_assets/_head/assets/_arc-hKElnQvK.js +1 -0
- package/_assets/_head/assets/_architecture-PBZL5I3N-BPxfLoEK.js +1 -0
- package/_assets/_head/assets/_architectureDiagram-2XIMDMQ5-B6NKHtRx.js +36 -0
- package/_assets/_head/assets/_array-1ZLHT4IW.js +1 -0
- package/_assets/_head/assets/_blockDiagram-WCTKOSBZ-Dqnb6UUE.js +132 -0
- package/_assets/_head/assets/_c4Diagram-IC4MRINW-BZcM5On4.js +10 -0
- package/_assets/_head/assets/_channel-CfD3KTsT.js +1 -0
- package/_assets/_head/assets/_chunk-4BX2VUAB-zqTDmcBB.js +1 -0
- package/_assets/_head/assets/_chunk-55IACEB6-x7bSLf7B.js +1 -0
- package/_assets/_head/assets/_chunk-7E7YKBS2-BfdwzEwB.js +1 -0
- package/_assets/_head/assets/_chunk-7R4GIKGN-CixjX2hF.js +80 -0
- package/_assets/_head/assets/_chunk-C72U2L5F-Ju1rEIdN.js +1 -0
- package/_assets/_head/assets/_chunk-EGIJ26TM-CCUYcH6V.js +1 -0
- package/_assets/_head/assets/_chunk-FMBD7UC4-D6coRtDw.js +15 -0
- package/_assets/_head/assets/_chunk-GEFDOKGD-hedaaI_B.js +2 -0
- package/_assets/_head/assets/_chunk-GLR3WWYH-CADHj0Af.js +2 -0
- package/_assets/_head/assets/_chunk-HHEYEP7N-yDnzeL6u.js +1 -0
- package/_assets/_head/assets/_chunk-JSJVCQXG-CJ2rQuP0.js +1 -0
- package/_assets/_head/assets/_chunk-KX2RTZJC-C6_Rew8h.js +1 -0
- package/_assets/_head/assets/_chunk-KYZI473N-HFloJmj0.js +53 -0
- package/_assets/_head/assets/_chunk-L3YUKLVL-BZnSrFqZ.js +1 -0
- package/_assets/_head/assets/_chunk-MX3YWQON-DTYOrezi.js +1 -0
- package/_assets/_head/assets/_chunk-NQ4KR5QH-BUplpEk2.js +220 -0
- package/_assets/_head/assets/_chunk-O4XLMI2P-Dmj7UqP5.js +7 -0
- package/_assets/_head/assets/_chunk-OZEHJAEY-BSk-0ei6.js +1 -0
- package/_assets/_head/assets/_chunk-PQ6SQG4A-d07SUR0W.js +1 -0
- package/_assets/_head/assets/_chunk-PU5JKC2W-B7Fh0LIt.js +70 -0
- package/_assets/_head/assets/_chunk-QZHKN3VN-OrU_cr5J.js +1 -0
- package/_assets/_head/assets/_chunk-R5LLSJPH-CoKBj2D6.js +1 -0
- package/_assets/_head/assets/_chunk-WL4C6EOR-bOFxg0ID.js +189 -0
- package/_assets/_head/assets/_chunk-XIRO2GV7-COC85g2g.js +1 -0
- package/_assets/_head/assets/_chunk-XPW4576I-CW6DI-1k.js +32 -0
- package/_assets/_head/assets/_chunk-XZSTWKYB-DNV9pfMo.js +102 -0
- package/_assets/_head/assets/_chunk-YBOYWFTD-nZYHIeRV.js +1 -0
- package/_assets/_head/assets/_classDiagram-VBA2DB6C-C9oLPafD.js +1 -0
- package/_assets/_head/assets/_classDiagram-v2-RAHNMMFH-Dgh8T6Nh.js +1 -0
- package/_assets/_head/assets/_clone-C4VI7IwW.js +1 -0
- package/_assets/_head/assets/_cose-bilkent-S5V4N54A-DzNIP-ES.js +1 -0
- package/_assets/_head/assets/_cytoscape.esm-p1aMD8pk.js +321 -0
- package/_assets/_head/assets/_d3-graphviz-D-OeP-Hi.js +13 -0
- package/_assets/_head/assets/_dagre-D4f1FF8i.js +1 -0
- package/_assets/_head/assets/_dagre-KLK3FWXG-BkNMp9M0.js +4 -0
- package/_assets/_head/assets/_defaultLocale-CTKA0Sod.js +1 -0
- package/_assets/_head/assets/_diagram-E7M64L7V-D6PZVOLB.js +24 -0
- package/_assets/_head/assets/_diagram-IFDJBPK2-QApacJ5c.js +43 -0
- package/_assets/_head/assets/_diagram-P4PSJMXO-CNMUKotv.js +24 -0
- package/_assets/_head/assets/_dist-Dk49gvBM.js +1 -0
- package/_assets/_head/assets/_erDiagram-INFDFZHY-Bpnx05jC.js +70 -0
- package/_assets/_head/assets/_flowDiagram-PKNHOUZH-BdAdScRO.js +162 -0
- package/_assets/_head/assets/_ganttDiagram-A5KZAMGK-DzEPJRcF.js +292 -0
- package/_assets/_head/assets/_gitGraph-HDMCJU4V-bzhcDRU8.js +1 -0
- package/_assets/_head/assets/_gitGraphDiagram-K3NZZRJ6-BMvgx1jL.js +65 -0
- package/_assets/_head/assets/_graphlib-CWZwVoL0.js +1 -0
- package/_assets/_head/assets/_info-3K5VOQVL-DO8S_2BK.js +1 -0
- package/_assets/_head/assets/_infoDiagram-LFFYTUFH-V27XJ0e-.js +2 -0
- package/_assets/_head/assets/_init-B0zvuhbV.js +1 -0
- package/_assets/_head/assets/_isArrayLikeObject-B62EgjVm.js +1 -0
- package/_assets/_head/assets/_isEmpty-DwnoWLeP.js +1 -0
- package/_assets/_head/assets/_ishikawaDiagram-PHBUUO56-ye8wu7pU.js +70 -0
- package/_assets/_head/assets/_journeyDiagram-4ABVD52K-D5OtlO2S.js +139 -0
- package/_assets/_head/assets/_kanban-definition-K7BYSVSG-DtUEcx7s.js +89 -0
- package/_assets/_head/assets/_katex-DF9NgSAO.js +261 -0
- package/_assets/_head/assets/_line-Bn73e1DS.js +1 -0
- package/_assets/_head/assets/_linear-DLy__jWx.js +1 -0
- package/_assets/_head/assets/_math-CyywJguE.js +1 -0
- package/_assets/_head/assets/_mermaid-parser.core-_H6Clr87.js +4 -0
- package/_assets/_head/assets/_mermaid.core-CN_dW3wB.js +11 -0
- package/_assets/_head/assets/_mindmap-definition-YRQLILUH-Bj6WNjT2.js +68 -0
- package/_assets/_head/assets/_ordinal-CxoIAYU5.js +1 -0
- package/_assets/_head/assets/_packet-RMMSAZCW-BQu67kO8.js +1 -0
- package/_assets/_head/assets/_path-DqxJfpv2.js +1 -0
- package/_assets/_head/assets/_path-e1ZUMOO_.js +1 -0
- package/_assets/_head/assets/_pie-UPGHQEXC-Bq1eDF5N.js +1 -0
- package/_assets/_head/assets/_pieDiagram-SKSYHLDU-B7n7B95W.js +30 -0
- package/_assets/_head/assets/_quadrantDiagram-337W2JSQ-C_OD8wEG.js +7 -0
- package/_assets/_head/assets/_radar-KQ55EAFF-BVJblTdI.js +1 -0
- package/_assets/_head/assets/_requirementDiagram-Z7DCOOCP-C8HzXf-7.js +73 -0
- package/_assets/_head/assets/_rough.esm-B-x7cSr_.js +1 -0
- package/_assets/_head/assets/_sankeyDiagram-WA2Y5GQK-Ctpgy26F.js +10 -0
- package/_assets/_head/assets/_sequenceDiagram-2WXFIKYE-BrWWYecj.js +145 -0
- package/_assets/_head/assets/_src-COkbRRdF.js +1 -0
- package/_assets/_head/assets/_src-DGaYM9rN.js +1 -0
- package/_assets/_head/assets/_src-EY2faTVt.js +1 -0
- package/_assets/_head/assets/_stateDiagram-RAJIS63D-DHDYVq4g.js +1 -0
- package/_assets/_head/assets/_stateDiagram-v2-FVOUBMTO-C3RKEofw.js +1 -0
- package/_assets/_head/assets/_timeline-definition-YZTLITO2-Baqh8Zr3.js +61 -0
- package/_assets/_head/assets/_treemap-KZPCXAKY-DnDBABML.js +1 -0
- package/_assets/_head/assets/_value-BHMRaafc.js +1 -0
- package/_assets/_head/assets/_vennDiagram-LZ73GAT5-DT2MLRvW.js +34 -0
- package/_assets/_head/assets/_xychartDiagram-JWTSCODW-B4O2dc9N.js +7 -0
- package/_assets/_head/assets/main-CSvXzq1b.css +1 -0
- package/_assets/_head/assets/main-GvJmWKsI.js +9 -0
- package/extension.yaml +0 -0
- package/package.json +23 -0
- package/src/element.ts +129 -0
- package/src/global.d.ts +9 -0
- package/src/helpers.ts +75 -0
- package/src/index.css +73 -0
- package/src/main.ts +7 -0
- package/src/remark.ts +75 -0
- package/src/runtime.ts +40 -0
- package/tsconfig.json +15 -0
- package/vite.config.ts +6 -0
package/src/helpers.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export function encodeText(value: string) {
|
|
2
|
+
const bytes = new TextEncoder().encode(value)
|
|
3
|
+
let binary = ''
|
|
4
|
+
bytes.forEach((byte) => {
|
|
5
|
+
binary += String.fromCharCode(byte)
|
|
6
|
+
})
|
|
7
|
+
return btoa(binary)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function decodeText(encoded: string) {
|
|
11
|
+
const binary = atob(encoded)
|
|
12
|
+
const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0))
|
|
13
|
+
return new TextDecoder().decode(bytes)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function escapeHtml(value: string) {
|
|
17
|
+
return value
|
|
18
|
+
.replaceAll('&', '&')
|
|
19
|
+
.replaceAll('<', '<')
|
|
20
|
+
.replaceAll('>', '>')
|
|
21
|
+
.replaceAll('"', '"')
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function toErrorMessage(err: unknown) {
|
|
25
|
+
if (err instanceof Error) return err.message
|
|
26
|
+
if (typeof err === 'string') return err
|
|
27
|
+
return 'Unknown error'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function getStringFromMeta(meta: Record<string, any>, key: string) {
|
|
31
|
+
const rawValue = meta[key]
|
|
32
|
+
if (rawValue === undefined) return ''
|
|
33
|
+
if (typeof rawValue === 'string') return rawValue.trim()
|
|
34
|
+
if (typeof rawValue === 'number' || typeof rawValue === 'boolean') {
|
|
35
|
+
return String(rawValue)
|
|
36
|
+
}
|
|
37
|
+
return ''
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function getClassList(meta: Record<string, any>) {
|
|
41
|
+
const classAttr = getStringFromMeta(meta, 'class')
|
|
42
|
+
if (!classAttr) return []
|
|
43
|
+
return classAttr.split(/\s+/).filter(Boolean)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getBooleanFromMeta(
|
|
47
|
+
meta: Record<string, any>,
|
|
48
|
+
key: string,
|
|
49
|
+
defaultValue = false,
|
|
50
|
+
) {
|
|
51
|
+
const rawValue = getStringFromMeta(meta, key)
|
|
52
|
+
if (!rawValue) return defaultValue
|
|
53
|
+
|
|
54
|
+
switch (rawValue.toLowerCase()) {
|
|
55
|
+
case key.toLowerCase():
|
|
56
|
+
case '1':
|
|
57
|
+
case 'true':
|
|
58
|
+
case 'yes':
|
|
59
|
+
case 'on':
|
|
60
|
+
return true
|
|
61
|
+
case '0':
|
|
62
|
+
case 'false':
|
|
63
|
+
case 'no':
|
|
64
|
+
case 'off':
|
|
65
|
+
return false
|
|
66
|
+
default:
|
|
67
|
+
return defaultValue
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function hasClass(meta: Record<string, any>, className: string) {
|
|
72
|
+
const classAttr = meta.class
|
|
73
|
+
if (typeof classAttr !== 'string') return false
|
|
74
|
+
return classAttr.split(/\s+/).includes(className)
|
|
75
|
+
}
|
package/src/index.css
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
@layer markee-extension {
|
|
2
|
+
markee-diagram {
|
|
3
|
+
display: block;
|
|
4
|
+
margin: 1.2rem 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
a.glightbox > markee-diagram {
|
|
8
|
+
position: relative;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
a.glightbox > markee-diagram::after {
|
|
12
|
+
content: '';
|
|
13
|
+
position: absolute;
|
|
14
|
+
inset: 0;
|
|
15
|
+
z-index: 1;
|
|
16
|
+
background: transparent;
|
|
17
|
+
cursor: pointer;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.ginlined-content.diagram {
|
|
21
|
+
min-width: 100vw;
|
|
22
|
+
padding: 1rem 6rem;
|
|
23
|
+
text-align: center;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
markee-diagram .markee-diagram-status,
|
|
27
|
+
markee-diagram .markee-diagram-error {
|
|
28
|
+
border: 1px solid var(--mk-color-border, #d9d9d9);
|
|
29
|
+
border-radius: 0.5rem;
|
|
30
|
+
background: var(--mk-color-background, #fafafa);
|
|
31
|
+
color: var(--mk-color-text, #333);
|
|
32
|
+
padding: 0.75rem 0.9rem;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
markee-diagram .markee-diagram-status {
|
|
36
|
+
font-style: italic;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
markee-diagram .markee-diagram-error {
|
|
40
|
+
border-left: 4px solid var(--mk-admonition-color-danger);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
markee-diagram .markee-diagram-error pre {
|
|
44
|
+
margin: 0.6rem 0 0;
|
|
45
|
+
overflow: auto;
|
|
46
|
+
font-size: 0.875rem;
|
|
47
|
+
white-space: pre-wrap;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
markee-diagram .markee-diagram-mermaid,
|
|
51
|
+
markee-diagram .markee-diagram-dbml {
|
|
52
|
+
overflow-x: auto;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
markee-diagram .markee-diagram-mermaid > svg,
|
|
56
|
+
markee-diagram .markee-diagram-dbml > svg {
|
|
57
|
+
display: block;
|
|
58
|
+
max-width: 100%;
|
|
59
|
+
height: auto;
|
|
60
|
+
margin: 0 auto;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
markee-diagram .markee-diagram-dbml,
|
|
64
|
+
markee-diagram .markee-diagram-dbml * {
|
|
65
|
+
pointer-events: none !important;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
[data-color-scheme='dark'] {
|
|
69
|
+
markee-diagram {
|
|
70
|
+
filter: invert(88%) hue-rotate(180deg);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/main.ts
ADDED
package/src/remark.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import parseAttrs from 'attributes-parser'
|
|
2
|
+
import { extend } from '@markee/runtime'
|
|
3
|
+
import {
|
|
4
|
+
encodeText,
|
|
5
|
+
escapeHtml,
|
|
6
|
+
getBooleanFromMeta,
|
|
7
|
+
getClassList,
|
|
8
|
+
getStringFromMeta,
|
|
9
|
+
hasClass,
|
|
10
|
+
} from './helpers'
|
|
11
|
+
|
|
12
|
+
export function registerDiagramsRemark() {
|
|
13
|
+
extend.markdownPipeline.remark('markee-diagrams', function (this: any) {
|
|
14
|
+
return (tree: any) => {
|
|
15
|
+
const resolved = this.data().pluginConfig('lightbox') as
|
|
16
|
+
| boolean
|
|
17
|
+
| { enabled: boolean }
|
|
18
|
+
| undefined
|
|
19
|
+
const lightboxEnabled =
|
|
20
|
+
typeof resolved === 'boolean' ? resolved : (resolved?.enabled ?? true)
|
|
21
|
+
|
|
22
|
+
let fallbackId = 0
|
|
23
|
+
|
|
24
|
+
extend.markdownPipeline.visit(
|
|
25
|
+
tree,
|
|
26
|
+
'code',
|
|
27
|
+
(node: any, index: number | undefined, parent: any) => {
|
|
28
|
+
const lang = node.lang?.trim()?.toLowerCase()
|
|
29
|
+
if (!parent || index === undefined) return
|
|
30
|
+
if (lang !== 'mermaid' && lang !== 'dbml') return
|
|
31
|
+
if ((node.meta ?? '').trim().startsWith('kroki')) return
|
|
32
|
+
|
|
33
|
+
const source = encodeText(node.value ?? '')
|
|
34
|
+
const parsedMeta = parseAttrs(node.meta ?? '')
|
|
35
|
+
const fromNodeId = (node.data as any)?.hProperties?.id
|
|
36
|
+
const fromMetaId = getStringFromMeta(parsedMeta, 'id')
|
|
37
|
+
const hasLightboxDisableClass =
|
|
38
|
+
hasClass(parsedMeta, 'skip-lightbox') ||
|
|
39
|
+
hasClass(parsedMeta, 'off-glb')
|
|
40
|
+
const hasLightboxEnableClass =
|
|
41
|
+
hasClass(parsedMeta, 'force-lightbox') ||
|
|
42
|
+
hasClass(parsedMeta, 'on-glb')
|
|
43
|
+
let nodeLightboxEnabled = getBooleanFromMeta(
|
|
44
|
+
parsedMeta,
|
|
45
|
+
'lightbox',
|
|
46
|
+
lightboxEnabled,
|
|
47
|
+
)
|
|
48
|
+
if (hasLightboxDisableClass) {
|
|
49
|
+
nodeLightboxEnabled = false
|
|
50
|
+
} else if (hasLightboxEnableClass) {
|
|
51
|
+
nodeLightboxEnabled = true
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const uniqueId =
|
|
55
|
+
(fromNodeId ? String(fromNodeId) : fromMetaId) ||
|
|
56
|
+
`markee-diagram-${fallbackId++}`
|
|
57
|
+
const extraClasses = getClassList(parsedMeta).filter(
|
|
58
|
+
(name) => name !== lang,
|
|
59
|
+
)
|
|
60
|
+
const className = [lang, 'diagram', ...extraClasses].join(' ')
|
|
61
|
+
|
|
62
|
+
const element = `<markee-diagram id="${escapeHtml(uniqueId)}" class="${escapeHtml(className)}" data-kind="${lang}" data-source="${source}"></markee-diagram>`
|
|
63
|
+
const inlineElement = `<markee-diagram class="${escapeHtml(className)}" data-kind="${lang}" data-source="${source}"></markee-diagram>`
|
|
64
|
+
const inlineContent = inlineElement.replaceAll("'", ''')
|
|
65
|
+
const withLightbox = `<a class='glightbox' href='#' data-content='${inlineContent}' data-width='100vw' data-height='auto' data-draggable='false'>${element}</a>`
|
|
66
|
+
|
|
67
|
+
parent.children.splice(index, 1, {
|
|
68
|
+
type: 'html',
|
|
69
|
+
value: nodeLightboxEnabled ? withLightbox : element,
|
|
70
|
+
})
|
|
71
|
+
},
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
}
|
package/src/runtime.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
type MermaidModule = typeof import('mermaid')
|
|
2
|
+
|
|
3
|
+
export type DiagramRuntime = {
|
|
4
|
+
dbmlRun: (source: string, format: any) => string
|
|
5
|
+
select: (element: HTMLElement) => any
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
let mermaidPromise: Promise<MermaidModule['default']> | null = null
|
|
9
|
+
let diagramRuntimePromise: Promise<DiagramRuntime> | null = null
|
|
10
|
+
|
|
11
|
+
export function loadMermaid() {
|
|
12
|
+
if (!mermaidPromise) {
|
|
13
|
+
mermaidPromise = import('mermaid').then((runtime) => {
|
|
14
|
+
runtime.default.initialize({ startOnLoad: false })
|
|
15
|
+
return runtime.default
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
return mermaidPromise
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function loadDiagramRuntime() {
|
|
22
|
+
if (!diagramRuntimePromise) {
|
|
23
|
+
diagramRuntimePromise = Promise.all([
|
|
24
|
+
import('@softwaretechnik/dbml-renderer'),
|
|
25
|
+
import('d3-selection'),
|
|
26
|
+
import('d3-graphviz'),
|
|
27
|
+
]).then(([dbmlRenderer, d3Selection]) => {
|
|
28
|
+
const d3Module = d3Selection as any
|
|
29
|
+
const d3 = d3Module.select ? d3Module : d3Module.default
|
|
30
|
+
if (!d3 || typeof d3.select !== 'function') {
|
|
31
|
+
throw new Error('Could not load d3-selection runtime.')
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
dbmlRun: dbmlRenderer.run as DiagramRuntime['dbmlRun'],
|
|
35
|
+
select: d3.select,
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
return diagramRuntimePromise
|
|
40
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"strict": true,
|
|
4
|
+
"skipLibCheck": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"target": "ESNext",
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"allowSyntheticDefaultImports": true,
|
|
10
|
+
"lib": ["ES2022", "dom"],
|
|
11
|
+
"outDir": "dist",
|
|
12
|
+
"baseUrl": "."
|
|
13
|
+
},
|
|
14
|
+
"include": ["src"]
|
|
15
|
+
}
|