@k4a_l/dirtreeist 0.3.3 → 1.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,MAAM,UAAU,GAAG,CAAC,QAAgB,EAAE,MAAgB,EAAE,EAAE;IACxD,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AACnE,CAAC,CAAA;AAED,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AACrC,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"index.js","names":["symbolSets: {\n\t[key in OptionsBase[\"treeType\"]]: SymbolSet;\n}","defaultOptions: OptionsBase","anyString: Guard<\"noteBullet\">","nonEmptyStringOrFalse: Guard<\"delimiter\">","positiveIntegerOrFalse: Guard<\"memoMaxColumn\">","guards: { [K in keyof OptionsBase]: Guard<K> }","defaultOptions","wideRanges: Range[]","ambiguousRanges: Range[]","rows: Row[]","common","width","column","wholeRange: Range"],"sources":["../src/constants/constant.ts","../src/modules/options.ts","../src/modules/width.ts","../src/modules/convert.ts","../src/modules/parse.ts","../src/index.ts"],"sourcesContent":["import type { OptionsBase, SymbolSet } from \"../types\";\n\nconst symbolSets: {\n\t[key in OptionsBase[\"treeType\"]]: SymbolSet;\n} = {\n\tnormal: {\n\t\tvertical: \"│\",\n\t\thorizontal: \"─\",\n\t\tcrossing: \"├\",\n\t\tend: \"└\",\n\t\tspace: \" \",\n\t},\n\tbold: {\n\t\tvertical: \"┃\",\n\t\thorizontal: \"━\",\n\t\tcrossing: \"┣\",\n\t\tend: \"┗\",\n\t\tspace: \" \",\n\t},\n\tascii: {\n\t\tvertical: \"|\",\n\t\thorizontal: \"-\",\n\t\tcrossing: \"+\",\n\t\tend: \"+\",\n\t\tspace: \" \",\n\t},\n};\n\nconst defaultOptions: OptionsBase = {\n\ttreeType: \"normal\",\n\tspaceBeforeName: false,\n\tspaceSize: 2,\n\temptyBeforeUpperHierarchy: false,\n\tkeepMarkdown: false,\n\tcjkFont: true,\n\tdelimiter: false, // --\n\tmemoAlign: \"all\",\n\tmemoGap: 2,\n\tmemoMaxColumn: false,\n\tnoteAlignToMemo: true,\n\tnoteBullet: \"・\",\n\tnoteIndentSize: 2,\n};\n\nconst treeTypeValues = [\"normal\", \"bold\", \"ascii\"] as const;\n\nconst memoAlignValues = [\"all\", \"siblings\", \"none\"] as const;\n\nexport { defaultOptions, memoAlignValues, symbolSets, treeTypeValues };\n","import { memoAlignValues, treeTypeValues } from \"../constants/constant\";\nimport type { Options, OptionsBase } from \"../types\";\n\n/** 検証を通らなかったら既定値に落とす。valueは利用者から来る未検証の値。 */\ntype Guard<K extends keyof OptionsBase> = (\n\tvalue: unknown,\n\tdefaultValue: OptionsBase[K],\n) => OptionsBase[K];\n\n/** 値がTであるOptionsBaseのキー。検証を型ごとに使い回すためのもの。 */\ntype KeysOfType<T> = {\n\t[K in keyof OptionsBase]: OptionsBase[K] extends T ? K : never;\n}[keyof OptionsBase];\n\n/** 整数として扱える数値か。min未満は既定値に落とす。 */\nconst integerAtLeast =\n\t<K extends KeysOfType<number>>(min: number): Guard<K> =>\n\t(value, defaultValue) => {\n\t\tif (typeof value !== \"number\") return defaultValue;\n\t\tif (!Number.isFinite(value)) return defaultValue;\n\t\tif (value < min) return defaultValue;\n\t\treturn Math.floor(value) as OptionsBase[K];\n\t};\n\nconst oneOf =\n\t<K extends keyof OptionsBase>(values: readonly OptionsBase[K][]): Guard<K> =>\n\t(value, defaultValue) => {\n\t\treturn values.includes(value as OptionsBase[K])\n\t\t\t? (value as OptionsBase[K])\n\t\t\t: defaultValue;\n\t};\n\nconst boolean =\n\t<K extends KeysOfType<boolean>>(): Guard<K> =>\n\t(value, defaultValue) => {\n\t\treturn typeof value === \"boolean\"\n\t\t\t? (value as OptionsBase[K])\n\t\t\t: defaultValue;\n\t};\n\n/** 空文字は「記号なし」の指定として有効なので許す。 */\nconst anyString: Guard<\"noteBullet\"> = (value, defaultValue) => {\n\treturn typeof value === \"string\" ? value : defaultValue;\n};\n\n/** 空文字だと区切れないので落とす。falseは機能オフの指定として有効。 */\nconst nonEmptyStringOrFalse: Guard<\"delimiter\"> = (value, defaultValue) => {\n\tif (value === false) return false;\n\tif (typeof value !== \"string\") return defaultValue;\n\tif (value.length === 0) return defaultValue;\n\treturn value;\n};\n\nconst positiveIntegerOrFalse: Guard<\"memoMaxColumn\"> = (\n\tvalue,\n\tdefaultValue,\n) => {\n\tif (value === false) return false;\n\tif (typeof value !== \"number\") return defaultValue;\n\tif (!Number.isFinite(value)) return defaultValue;\n\tif (value < 1) return defaultValue;\n\treturn Math.floor(value);\n};\n\n/** キーごとの検証。全キーを網羅していないと型エラーになる。 */\nconst guards: { [K in keyof OptionsBase]: Guard<K> } = {\n\ttreeType: oneOf(treeTypeValues),\n\temptyBeforeUpperHierarchy: boolean(),\n\tspaceBeforeName: boolean(),\n\tspaceSize: integerAtLeast(1),\n\tkeepMarkdown: boolean(),\n\tcjkFont: boolean(),\n\tdelimiter: nonEmptyStringOrFalse,\n\tmemoAlign: oneOf(memoAlignValues),\n\tmemoGap: integerAtLeast(0),\n\tmemoMaxColumn: positiveIntegerOrFalse,\n\tnoteAlignToMemo: boolean(),\n\tnoteBullet: anyString,\n\tnoteIndentSize: integerAtLeast(0),\n};\n\nconst pickOption = <K extends keyof OptionsBase>(\n\toptions: Options | undefined,\n\tdefaultOptions: OptionsBase,\n\tkey: K,\n): OptionsBase[K] => {\n\tconst defaultValue = defaultOptions[key];\n\tconst value = options?.[key];\n\tif (value === undefined) return defaultValue;\n\treturn guards[key](value, defaultValue);\n};\n\nconst buildOption = (\n\toptions: Options | undefined,\n\tdefaultOptions: OptionsBase,\n): OptionsBase => {\n\tconst keys = Object.keys(guards) as (keyof OptionsBase)[];\n\n\treturn keys.reduce((built, key) => {\n\t\treturn Object.assign(built, {\n\t\t\t[key]: pickOption(options, defaultOptions, key),\n\t\t});\n\t}, {} as OptionsBase);\n};\n\nexport { buildOption };\n","import type { OptionsBase } from \"../types\";\n\ntype Range = [number, number];\n\n// East Asian Width: Wide(W) / Fullwidth(F)\nconst wideRanges: Range[] = [\n\t[0x1100, 0x115f],\n\t[0x2e80, 0x303e],\n\t[0x3041, 0x33ff],\n\t[0x3400, 0x4dbf],\n\t[0x4e00, 0x9fff],\n\t[0xa000, 0xa4cf],\n\t[0xa960, 0xa97f],\n\t[0xac00, 0xd7a3],\n\t[0xf900, 0xfaff],\n\t[0xfe10, 0xfe19],\n\t[0xfe30, 0xfe6f],\n\t[0xff00, 0xff60],\n\t[0xffe0, 0xffe6],\n\t[0x1f300, 0x1f64f],\n\t[0x1f900, 0x1f9ff],\n\t[0x20000, 0x3fffd],\n];\n\n// East Asian Width: Ambiguous(A)\n// 罫線素片(0x2500-0x254b)もここに含まれる\nconst ambiguousRanges: Range[] = [\n\t[0x00a1, 0x00a1],\n\t[0x00a4, 0x00a4],\n\t[0x00a7, 0x00a8],\n\t[0x00aa, 0x00aa],\n\t[0x00ad, 0x00ae],\n\t[0x00b0, 0x00b4],\n\t[0x00b6, 0x00ba],\n\t[0x00bc, 0x00bf],\n\t[0x00c6, 0x00c6],\n\t[0x00d0, 0x00d0],\n\t[0x00d7, 0x00d8],\n\t[0x00de, 0x00e1],\n\t[0x00e6, 0x00e6],\n\t[0x00e8, 0x00ea],\n\t[0x00ec, 0x00ed],\n\t[0x00f0, 0x00f0],\n\t[0x00f2, 0x00f3],\n\t[0x00f7, 0x00fa],\n\t[0x00fc, 0x00fc],\n\t[0x00fe, 0x00fe],\n\t[0x2010, 0x2010],\n\t[0x2013, 0x2016],\n\t[0x2018, 0x2019],\n\t[0x201c, 0x201d],\n\t[0x2020, 0x2022],\n\t[0x2024, 0x2027],\n\t[0x2030, 0x2030],\n\t[0x2032, 0x2033],\n\t[0x2035, 0x2035],\n\t[0x203b, 0x203b],\n\t[0x203e, 0x203e],\n\t[0x2074, 0x2074],\n\t[0x207f, 0x207f],\n\t[0x2081, 0x2084],\n\t[0x20ac, 0x20ac],\n\t[0x2103, 0x2103],\n\t[0x2105, 0x2105],\n\t[0x2109, 0x2109],\n\t[0x2113, 0x2113],\n\t[0x2116, 0x2116],\n\t[0x2121, 0x2122],\n\t[0x2126, 0x2126],\n\t[0x212b, 0x212b],\n\t[0x2153, 0x2154],\n\t[0x215b, 0x215e],\n\t[0x2160, 0x216b],\n\t[0x2170, 0x2179],\n\t[0x2189, 0x2189],\n\t[0x2190, 0x2199],\n\t[0x21b8, 0x21b9],\n\t[0x21d2, 0x21d2],\n\t[0x21d4, 0x21d4],\n\t[0x21e7, 0x21e7],\n\t[0x2200, 0x2200],\n\t[0x2202, 0x2203],\n\t[0x2207, 0x2208],\n\t[0x220b, 0x220b],\n\t[0x220f, 0x220f],\n\t[0x2211, 0x2211],\n\t[0x2215, 0x2215],\n\t[0x221a, 0x221a],\n\t[0x221d, 0x2220],\n\t[0x2223, 0x2223],\n\t[0x2225, 0x2225],\n\t[0x2227, 0x222c],\n\t[0x222e, 0x222e],\n\t[0x2234, 0x2237],\n\t[0x223c, 0x223d],\n\t[0x2248, 0x2248],\n\t[0x224c, 0x224c],\n\t[0x2252, 0x2252],\n\t[0x2260, 0x2261],\n\t[0x2264, 0x2267],\n\t[0x226a, 0x226b],\n\t[0x226e, 0x226f],\n\t[0x2282, 0x2283],\n\t[0x2286, 0x2287],\n\t[0x2295, 0x2295],\n\t[0x2299, 0x2299],\n\t[0x22a5, 0x22a5],\n\t[0x22bf, 0x22bf],\n\t[0x2312, 0x2312],\n\t[0x2460, 0x24e9],\n\t[0x24eb, 0x254b],\n\t[0x2550, 0x2573],\n\t[0x2580, 0x258f],\n\t[0x2592, 0x2595],\n\t[0x25a0, 0x25a1],\n\t[0x25a3, 0x25a9],\n\t[0x25b2, 0x25b3],\n\t[0x25b6, 0x25b7],\n\t[0x25bc, 0x25bd],\n\t[0x25c0, 0x25c1],\n\t[0x25c6, 0x25c8],\n\t[0x25cb, 0x25cb],\n\t[0x25ce, 0x25d1],\n\t[0x25e2, 0x25e5],\n\t[0x25ef, 0x25ef],\n\t[0x2605, 0x2606],\n\t[0x2609, 0x2609],\n\t[0x260e, 0x260f],\n\t[0x2614, 0x2615],\n\t[0x261c, 0x261c],\n\t[0x261e, 0x261e],\n\t[0x2640, 0x2640],\n\t[0x2642, 0x2642],\n\t[0x2660, 0x2661],\n\t[0x2663, 0x2665],\n\t[0x2667, 0x266a],\n\t[0x266c, 0x266d],\n\t[0x266f, 0x266f],\n\t[0x273d, 0x273d],\n\t[0x2776, 0x277f],\n\t[0xe000, 0xf8ff],\n\t[0xfffd, 0xfffd],\n];\n\nconst includes = (ranges: Range[], code: number): boolean => {\n\tlet low = 0;\n\tlet high = ranges.length - 1;\n\n\twhile (low <= high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tconst [start, end] = ranges[middle];\n\t\tif (code < start) high = middle - 1;\n\t\telse if (code > end) low = middle + 1;\n\t\telse return true;\n\t}\n\n\treturn false;\n};\n\n/** East Asian Width が Ambiguous の文字を何幅として数えるか。 */\ntype AmbiguousWidth = 1 | 2;\n\nconst charWidth = (code: number, ambiguousWidth: AmbiguousWidth): number => {\n\tif (code === 0) return 0;\n\tif (code < 0x20 || (code >= 0x7f && code < 0xa0)) return 0; // 制御文字\n\tif (code < 0x7f) return 1;\n\tif (code >= 0x0300 && code <= 0x036f) return 0; // 結合文字\n\tif (code === 0x200b || code === 0xfe0f) return 0; // ゼロ幅・異体字セレクタ\n\tif (includes(wideRanges, code)) return 2;\n\tif (includes(ambiguousRanges, code)) return ambiguousWidth;\n\treturn 1;\n};\n\n/**\n * 等幅表示を前提とした表示幅を返す。\n * 罫線素片や全角スペースを混在させるため、East Asian Width を見て 1/2 を数える。\n */\nconst stringWidth = (text: string, ambiguousWidth: AmbiguousWidth): number => {\n\tlet width = 0;\n\tfor (const char of text) {\n\t\twidth += charWidth(char.codePointAt(0) as number, ambiguousWidth);\n\t}\n\treturn width;\n};\n\n/**\n * CJKフォント前提かどうかを、Ambiguousな文字の幅に読み替える。\n * CJKフォントでは罫線素片などが全角で描画されるため2幅として数える。\n */\nconst ambiguousWidthOf = (cjkFont: OptionsBase[\"cjkFont\"]): AmbiguousWidth => {\n\treturn cjkFont ? 2 : 1;\n};\n\n/**\n * markdown記法のうち、レンダリング後に消える文字を取り除く。\n * keepMarkdown:true のとき、`**bold**` を4文字ではなく8文字と数えてしまうのを防ぐ。\n *\n * あくまで文字数の話であり、太字や色などレンダリング後の字形の違いまでは扱えない。\n */\nconst stripMarkdown = (text: string): string => {\n\treturn (\n\t\ttext\n\t\t\t// 画像・リンク: ![alt](src) / [label](href) -> alt / label\n\t\t\t.replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, \"$1\")\n\t\t\t// 参照リンク: [label][ref] -> label\n\t\t\t.replace(/!?\\[([^\\]]*)\\]\\[[^\\]]*\\]/g, \"$1\")\n\t\t\t// コードスパン: `code` -> code\n\t\t\t.replace(/`+([^`]*)`+/g, \"$1\")\n\t\t\t// 強調: **bold** / *it* / __b__ / _i_ -> 中身\n\t\t\t// 打ち消し(~~)はGFM拡張でパーサが解釈しないため、ここでも除かない\n\t\t\t.replace(/(\\*\\*\\*|\\*\\*|\\*|___|__|_)(.+?)\\1/g, \"$2\")\n\t\t\t// エスケープ: \\* -> *\n\t\t\t.replace(/\\\\([!-/:-@[-`{-~])/g, \"$1\")\n\t);\n};\n\nexport { ambiguousWidthOf, stringWidth, stripMarkdown };\n","import { defaultOptions, symbolSets } from \"../constants/constant\";\nimport type {\n\tConvertOptions,\n\tDirNode,\n\tDirTree,\n\tLine,\n\tNoteNode,\n\tOptions,\n\tSymbolSet,\n} from \"../types\";\nimport { buildOption } from \"./options\";\nimport { ambiguousWidthOf, stringWidth, stripMarkdown } from \"./width\";\n\n/**\n * 揃えを計算する前の1行。groupは揃えの単位。\n * これに空白を詰めたものがLineになる。\n *\n * node: 通常のディレクトリ/ファイルの行。\n * prefixとnameを分けて持つのは、幅を測るときnameからだけmarkdown記法を除くため。\n * note: 名前を持たずメモだけの行。groupは所属するnode行と同じ値を持ち、\n * noteAlignToMemoのときその列に揃える。\n * empty: 罫線だけの空行。揃えには関与しない。\n */\ntype Row =\n\t| {\n\t\t\tkind: \"node\";\n\t\t\tprefix: string;\n\t\t\tname: string;\n\t\t\tmemo?: string;\n\t\t\tgroup: number;\n\t\t\tnode: DirNode;\n\t\t\thierarchy: number;\n\t }\n\t| {\n\t\t\tkind: \"note\";\n\t\t\tprefix: string;\n\t\t\ttext: string;\n\t\t\tdepth: number;\n\t\t\tgroup: number;\n\t\t\tnode: DirNode;\n\t\t\tnoteNode: NoteNode;\n\t }\n\t| {\n\t\t\tkind: \"empty\";\n\t\t\tprefix: string;\n\t };\n\nconst makeSymbol = (symbolSet: SymbolSet, isLast: boolean): string => {\n\tif (isLast) return symbolSet.end;\n\treturn symbolSet.crossing;\n};\n\nconst makeAsciiSpace = (spaceSize: number) => {\n\treturn new Array(spaceSize).fill(\" \").reduce((prev, cur) => {\n\t\treturn prev + cur;\n\t}, \"\");\n};\n\nconst makeSpace = (spaceSize: number) => {\n\treturn (\n\t\tnew Array(Math.floor(spaceSize / 2)).fill(\" \").reduce((prev, cur) => {\n\t\t\treturn prev + cur;\n\t\t}, \"\") + (spaceSize % 2 === 1 ? \" \" : \"\")\n\t);\n};\n\nconst reduce = (\n\tdirTree: DirTree,\n\toptions: ConvertOptions,\n\tprefix: string,\n\thie: number,\n\tisLastGroup: boolean,\n\tgroup: number,\n\tcounter: { value: number },\n): Row[] => {\n\tconst rows: Row[] = [];\n\n\t// siblingsでは子要素を挟んだ時点で揃えを打ち切るため、兄弟の途中で切り替わりうる\n\tlet currentGroup = group;\n\n\tdirTree.forEach((dirNode, dirNodeIndex) => {\n\t\t// 準備\n\t\tconst isLast = dirNodeIndex === dirTree.length - 1;\n\t\tconst isOneTop = hie === 0 && dirTree.length === 1;\n\t\tconst symbolSet = symbolSets[options.treeType];\n\n\t\t// 現在\n\t\tconst makePrefix = () => {\n\t\t\tif (isOneTop) return \"\";\n\t\t\treturn (\n\t\t\t\tmakeSymbol(symbolSet, isLast) +\n\t\t\t\tnew Array(\n\t\t\t\t\tMath.floor(\n\t\t\t\t\t\toptions.spaceSize / (options.treeType === \"ascii\" ? 1 : 2),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t\t.fill(symbolSet.horizontal)\n\t\t\t\t\t.reduce((prev, cur) => prev + cur, \"\") +\n\t\t\t\t(options.spaceBeforeName ? \" \" : \"\")\n\t\t\t);\n\t\t};\n\n\t\trows.push({\n\t\t\tkind: \"node\",\n\t\t\tprefix: prefix + makePrefix(),\n\t\t\tname: dirNode.name,\n\t\t\tmemo: dirNode.memo,\n\t\t\tgroup: currentGroup,\n\t\t\tnode: dirNode,\n\t\t\thierarchy: hie,\n\t\t});\n\n\t\t// 子\n\t\tconst makeNextSpaces = () => {\n\t\t\tif (isOneTop) return \"\";\n\t\t\treturn options.treeType === \"ascii\"\n\t\t\t\t? makeAsciiSpace(options.spaceSize)\n\t\t\t\t: makeSpace(options.spaceSize);\n\t\t};\n\n\t\tconst makeNextVertical = () => {\n\t\t\tif (!isLast) return symbolSet.vertical;\n\t\t\tif (!isOneTop) return symbolSet.space;\n\t\t\treturn \"\";\n\t\t};\n\n\t\tconst childPrefix = prefix + makeNextVertical() + makeNextSpaces();\n\n\t\t/**\n\t\t * note行の罫線。\n\t\t * noteの下には子要素が続くので、childPrefixの後ろにさらに縦線を置いて\n\t\t * 自分から子への線を途切れさせない。子がなければ線を引く先がないので置かない。\n\t\t */\n\t\tconst notePrefix =\n\t\t\tdirNode.children.length > 0\n\t\t\t\t? childPrefix + symbolSet.vertical\n\t\t\t\t: childPrefix;\n\n\t\t// noteは自身の行の直後、子要素より前に出す\n\t\tconst pushNotes = (notes: NoteNode[], depth: number) => {\n\t\t\tnotes.forEach((noteNode) => {\n\t\t\t\trows.push({\n\t\t\t\t\tkind: \"note\",\n\t\t\t\t\tprefix: notePrefix,\n\t\t\t\t\ttext: noteNode.text,\n\t\t\t\t\tdepth,\n\t\t\t\t\tgroup: currentGroup,\n\t\t\t\t\tnode: dirNode,\n\t\t\t\t\tnoteNode,\n\t\t\t\t});\n\t\t\t\tpushNotes(noteNode.children, depth + 1);\n\t\t\t});\n\t\t};\n\n\t\tpushNotes(dirNode.notes ?? [], 0);\n\n\t\tcounter.value += 1;\n\n\t\tconst childrenRows = reduce(\n\t\t\tdirNode.children,\n\t\t\toptions,\n\t\t\tchildPrefix,\n\t\t\thie + 1,\n\t\t\tisLastGroup || isLast,\n\t\t\tcounter.value,\n\t\t\tcounter,\n\t\t);\n\n\t\trows.push(...childrenRows);\n\n\t\t// 子要素が挟まると見た目の連続性が切れるので、次の兄弟から別グループにする\n\t\tif (options.memoAlign === \"siblings\" && childrenRows.length > 0) {\n\t\t\tcounter.value += 1;\n\t\t\tcurrentGroup = counter.value;\n\t\t}\n\n\t\t// 追加\n\t\tif (\n\t\t\toptions.emptyBeforeUpperHierarchy &&\n\t\t\tisLast &&\n\t\t\t!(isLastGroup || hie === 0)\n\t\t) {\n\t\t\trows.push({ kind: \"empty\", prefix: symbolSet.vertical });\n\t\t}\n\t});\n\n\treturn rows;\n};\n\n/** memo/noteの開始位置を揃えて、行ごとに空白を確定させる。 */\nconst align = (rows: Row[], options: ConvertOptions): Line[] => {\n\tconst keyOf = (row: Extract<Row, { group: number }>) =>\n\t\toptions.memoAlign === \"all\" ? 0 : row.group;\n\n\tconst ambiguousWidth = ambiguousWidthOf(options.cjkFont);\n\tconst widthOf = (text: string) => stringWidth(text, ambiguousWidth);\n\n\t// keepMarkdownのときは記法がレンダリングで消える分を幅から差し引く\n\tconst nodeWidthOf = (row: Extract<Row, { kind: \"node\" }>) =>\n\t\twidthOf(row.prefix) +\n\t\twidthOf(options.keepMarkdown ? stripMarkdown(row.name) : row.name);\n\n\t// note内の階層はインデントで表す\n\tconst makeNoteIndent = (depth: number) => {\n\t\tconst size = options.noteIndentSize * depth;\n\t\treturn options.treeType === \"ascii\"\n\t\t\t? makeAsciiSpace(size)\n\t\t\t: makeSpace(size);\n\t};\n\n\tconst columns = new Map<number, number>();\n\n\tif (options.memoAlign !== \"none\") {\n\t\tconst maxColumn = options.memoMaxColumn;\n\n\t\trows.forEach((row) => {\n\t\t\tif (row.kind !== \"node\" || row.memo === undefined) return;\n\n\t\t\tconst width = nodeWidthOf(row);\n\n\t\t\t// 上限を超える行は列の決定に加わらせない。\n\t\t\t// 1つの長い名前に他の行すべてが引きずられるのを防ぐため。\n\t\t\tif (maxColumn !== false && width > maxColumn) return;\n\n\t\t\tconst key = keyOf(row);\n\t\t\tcolumns.set(key, Math.max(columns.get(key) ?? 0, width));\n\t\t});\n\t}\n\n\treturn rows.map((row): Line => {\n\t\tif (row.kind === \"empty\") {\n\t\t\treturn { type: \"empty\", branch: row.prefix };\n\t\t}\n\n\t\tif (row.kind === \"note\") {\n\t\t\tconst common = {\n\t\t\t\ttype: \"note\" as const,\n\t\t\t\tbranch: row.prefix,\n\t\t\t\tindent: makeNoteIndent(row.depth),\n\t\t\t\tbullet: options.noteBullet,\n\t\t\t\ttext: row.text,\n\t\t\t\tdepth: row.depth,\n\t\t\t\tnode: row.node,\n\t\t\t\tnoteNode: row.noteNode,\n\t\t\t};\n\n\t\t\t// 揃えないときは名前の位置に依存せず、罫線の直後に置く\n\t\t\tif (!options.noteAlignToMemo) {\n\t\t\t\treturn { ...common, gap: makeNoteIndent(1) };\n\t\t\t}\n\n\t\t\t// 所属するnode行のmemo列に揃える\n\t\t\tconst width = widthOf(row.prefix);\n\t\t\tconst column = columns.get(keyOf(row)) ?? width;\n\t\t\treturn {\n\t\t\t\t...common,\n\t\t\t\tgap: makeAsciiSpace(Math.max(column - width, 0) + options.memoGap),\n\t\t\t};\n\t\t}\n\n\t\tconst common = {\n\t\t\ttype: \"node\" as const,\n\t\t\tbranch: row.prefix,\n\t\t\tname: row.name,\n\t\t\tnode: row.node,\n\t\t\thierarchy: row.hierarchy,\n\t\t};\n\n\t\tif (row.memo === undefined) return { ...common, gap: \"\" };\n\n\t\tconst width = nodeWidthOf(row);\n\t\tconst column = columns.get(keyOf(row)) ?? width;\n\t\treturn {\n\t\t\t...common,\n\t\t\tgap: makeAsciiSpace(Math.max(column - width, 0) + options.memoGap),\n\t\t\tmemo: row.memo,\n\t\t};\n\t});\n};\n\n/** Lineを1行の文字列にする。 */\nconst lineToString = (line: Line): string => {\n\tif (line.type === \"empty\") return line.branch;\n\tif (line.type === \"note\") {\n\t\treturn line.branch + line.gap + line.indent + line.bullet + line.text;\n\t}\n\treturn line.branch + line.name + line.gap + (line.memo ?? \"\");\n};\n\n/**\n * 階層構造を、上から下へのフラットな行データに落とす。\n * 罫線・名前・空白・メモが分かれているので、利用側で独自にレンダリングできる。\n */\nconst layout = (dirTree: DirTree, options?: Options): Line[] => {\n\tconst mergedOptions = buildOption(options, defaultOptions);\n\treturn align(\n\t\treduce(dirTree, mergedOptions, \"\", 0, false, 0, { value: 0 }),\n\t\tmergedOptions,\n\t);\n};\n\nconst convert = (dirTree: DirTree, options?: Options): string => {\n\ttry {\n\t\treturn layout(dirTree, options).map(lineToString).join(\"\\n\");\n\t} catch (error) {\n\t\treturn (\n\t\t\t\"Some errors occurred!\\n\\n\" +\n\t\t\tString(error) +\n\t\t\t\"\\n\\n\" +\n\t\t\t\"Please contact to developper.\"\n\t\t);\n\t}\n};\n\nexport { convert, layout, lineToString };\n","import type { Content, List, ListItem } from \"mdast\";\n\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { defaultOptions } from \"../constants/constant\";\nimport type {\n\tDirNode,\n\tDirTree,\n\tNoteNode,\n\tOptions,\n\tParseOptions,\n} from \"../types/index\";\nimport { buildOption } from \"./options\";\n\ntype Range = { from: number; to: number };\n\nconst wholeRange: Range = { from: 0, to: Infinity };\n\nconst unescapeMarkdown = (text: string): string => {\n\treturn text.replace(/\\\\([!-/:-@[-`{-~])/g, \"$1\");\n};\n\nconst extractText = (\n\tcontent: Content,\n\tchunk: string,\n\toptions: ParseOptions,\n\trange: Range = wholeRange,\n): string => {\n\tif (!content) return \"\";\n\n\tconst start = content.position?.start.offset ?? 0;\n\tconst end = content.position?.end.offset ?? Infinity;\n\tif (end <= range.from || start >= range.to) return \"\";\n\n\tconst isWhole = start >= range.from && end <= range.to;\n\tconst sliceStart = Math.max(start, range.from);\n\tconst sliceEnd = Math.min(end, range.to);\n\n\tif (options.keepMarkdown && content.position) {\n\t\treturn chunk.slice(sliceStart, sliceEnd);\n\t}\n\n\tif (content.type === \"text\") {\n\t\tif (isWhole) return content.value;\n\t\treturn unescapeMarkdown(chunk.slice(sliceStart, sliceEnd));\n\t}\n\n\t// inlineCodeなどchildrenを持たずvalueだけを持つもの\n\tif (\"value\" in content) {\n\t\tif (isWhole) return content.value;\n\t\treturn chunk.slice(sliceStart, sliceEnd);\n\t}\n\n\tif (\"children\" in content) {\n\t\treturn content.children\n\t\t\t.map((child) => {\n\t\t\t\treturn extractText(child, chunk, options, range);\n\t\t\t})\n\t\t\t.reduce((prev, cur) => {\n\t\t\t\treturn prev + cur;\n\t\t\t}, \"\");\n\t}\n\n\treturn \"\";\n};\n\n/**\n * メモの区切り文字の位置(chunk上のoffset)を返す。\n * リンクのURLやコードスパンの中身を誤って区切らないよう、\n * テキストノードの範囲だけを走査する。`\\#`のようなエスケープは無視する。\n */\nconst findMemoOffset = (\n\tcontent: Content,\n\tchunk: string,\n\tdelimiter: string,\n): number | undefined => {\n\tif (!content) return undefined;\n\tif (!(\"children\" in content)) return undefined;\n\n\tfor (const child of content.children) {\n\t\tif (child.type !== \"text\") continue;\n\n\t\tconst start = child.position?.start.offset;\n\t\tconst end = child.position?.end.offset;\n\t\tif (start === undefined || end === undefined) continue;\n\n\t\tlet index = chunk.indexOf(delimiter, start);\n\t\twhile (index >= 0 && index + delimiter.length <= end) {\n\t\t\tif (chunk[index - 1] !== \"\\\\\") return index;\n\t\t\tindex = chunk.indexOf(delimiter, index + delimiter.length);\n\t\t}\n\t}\n\n\treturn undefined;\n};\n\n/** 名前が空でメモだけの行(note)かどうか。 */\nconst isNoteOnly = (node: DirNode): boolean => {\n\treturn node.name === \"\" && node.memo !== undefined;\n};\n\n/**\n * noteの行を、子孫まとめてNoteNodeに変換する。\n * noteの子は名前を持っていてもnoteとして扱う。\n */\nconst toNoteNode = (node: DirNode): NoteNode => {\n\treturn {\n\t\ttext: node.memo ?? node.name,\n\t\tchildren: node.children.map(toNoteNode),\n\t};\n};\n\n/**\n * noteの子をchildrenから外してnotesへ移す。\n * 分割前のchildrenを見るので、実ノードと混ざっていても元の順序を保てる。\n */\nconst splitNotes = (node: DirNode): DirNode => {\n\tconst notes = node.children.filter(isNoteOnly).map(toNoteNode);\n\tconst children = node.children\n\t\t.filter((child) => !isNoteOnly(child))\n\t\t.map(splitNotes);\n\n\tif (notes.length === 0) return { ...node, children };\n\n\treturn { ...node, children, notes };\n};\n\nconst extractListItem = (\n\tlistItem: ListItem,\n\tchunk: string,\n\toptions: ParseOptions,\n): DirNode => {\n\tconst content = listItem.children[0];\n\n\tconst children =\n\t\tlistItem.children.length > 1\n\t\t\t? extractList(listItem.children[1] as List, chunk, options)\n\t\t\t: [];\n\n\tconst delimiter = options.delimiter;\n\tconst memoOffset = delimiter\n\t\t? findMemoOffset(content, chunk, delimiter)\n\t\t: undefined;\n\n\tif (!delimiter || memoOffset === undefined) {\n\t\treturn { name: extractText(content, chunk, options), children };\n\t}\n\n\tconst name = extractText(content, chunk, options, {\n\t\tfrom: 0,\n\t\tto: memoOffset,\n\t}).trimEnd();\n\n\tconst memo = extractText(content, chunk, options, {\n\t\tfrom: memoOffset + delimiter.length,\n\t\tto: Infinity,\n\t}).trim();\n\n\tif (!memo) return { name, children };\n\n\treturn { name, memo, children };\n};\n\nconst extractList = (\n\tlist: Content,\n\tchunk: string,\n\toptions: ParseOptions,\n): DirTree => {\n\tif (list.type !== \"list\") return [];\n\tif (!list.children) return [];\n\treturn list.children.map((listItem) => {\n\t\treturn extractListItem(listItem, chunk, options);\n\t});\n};\n\nconst parse = (chunk: string, options?: Options): DirTree[] => {\n\tconst tree = fromMarkdown(chunk);\n\tconst mergedOptions = buildOption(options, defaultOptions);\n\n\tconst lists = tree.children.filter((child) => child.type === \"list\");\n\n\tconst result = lists.map((list) => {\n\t\ttry {\n\t\t\treturn extractList(list, chunk, mergedOptions).map(splitNotes);\n\t\t} catch (_error) {\n\t\t\treturn [];\n\t\t}\n\t});\n\n\treturn result;\n};\n\nexport { parse };\n","import {\n\tdefaultOptions,\n\tmemoAlignValues,\n\tsymbolSets,\n\ttreeTypeValues,\n} from \"./constants/constant\";\nimport { convert, layout, lineToString } from \"./modules/convert\";\nimport { parse } from \"./modules/parse\";\nimport type {\n\tDirNode,\n\tDirTree,\n\tEmptyLine,\n\tLine,\n\tNodeLine,\n\tNoteLine,\n\tNoteNode,\n\tOptions,\n} from \"./types\";\n\nconst dirtreeist = (markdown: string, option?: Options) => {\n\treturn parse(markdown, option).map((dirtree) => convert(dirtree, option));\n};\n\nexport {\n\tconvert,\n\tdefaultOptions,\n\tlayout,\n\tlineToString,\n\tmemoAlignValues,\n\tparse,\n\tsymbolSets,\n\ttreeTypeValues,\n};\nexport default dirtreeist;\nexport type {\n\tDirNode,\n\tDirTree,\n\tEmptyLine,\n\tLine,\n\tNodeLine,\n\tNoteLine,\n\tNoteNode,\n\tOptions,\n};\n"],"mappings":"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ChB,CAAC,KAAQ,IAAO;CAChB,CAAC,KAAQ,IAAO;CAChB,CAAC,KAAQ,IAAO;CAChB,CAAC,KAAQ,IAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB,CAAC,MAAQ,KAAO;CAChB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"}
package/package.json CHANGED
@@ -1,49 +1,46 @@
1
1
  {
2
- "name": "@k4a_l/dirtreeist",
3
- "version": "0.3.3",
4
- "main": "dist/index.js",
5
- "exports": {
6
- ".": {
7
- "import": "./dist/index.js",
8
- "require": "./dist/index.cjs"
9
- },
10
- "./": "./"
11
- },
12
- "types": "dist/index.d.ts",
13
- "author": "kasahala",
14
- "license": "MIT",
15
- "type": "module",
16
- "scripts": {
17
- "dev": "vite",
18
- "clean": "rm -rf ./dist/ ",
19
- "build:esm": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
20
- "build:cjs": "rollup -c rollup.config.js",
21
- "build": "yarn clean && yarn build:esm && yarn build:cjs",
22
- "test": "vitest",
23
- "coverage": "vitest run --coverage",
24
- "deploy": "yarn build && yarn publish --access=public"
25
- },
26
- "devDependencies": {
27
- "@rollup/plugin-commonjs": "^22.0.2",
28
- "@rollup/plugin-node-resolve": "^14.0.1",
29
- "@rollup/plugin-typescript": "^8.5.0",
30
- "@typescript-eslint/eslint-plugin": "^5.36.2",
31
- "@typescript-eslint/parser": "^5.36.2",
32
- "eslint": "^8.23.0",
33
- "eslint-config-prettier": "^8.5.0",
34
- "prettier": "^2.7.1",
35
- "rollup": "^2.79.0",
36
- "tsc-alias": "^1.7.0",
37
- "typescript": "^4.8.2",
38
- "vite-tsconfig-paths": "^3.5.0",
39
- "vitest": "^0.23.1"
40
- },
41
- "dependencies": {
42
- "mdast-util-from-markdown": "^1.2.0",
43
- "ts-dedent": "^2.2.0"
44
- },
45
- "repository": {
46
- "type": "git",
47
- "url": "git@github.com:k4a-l/dirtreeist.git"
48
- }
2
+ "name": "@k4a_l/dirtreeist",
3
+ "version": "1.0.0",
4
+ "main": "./dist/index.js",
5
+ "exports": {
6
+ ".": "./dist/index.js"
7
+ },
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "author": "kasahala",
13
+ "license": "MIT",
14
+ "type": "module",
15
+ "scripts": {
16
+ "tsc": "tsc -noEmit",
17
+ "tsc:watch": "tsc -noEmit --watch",
18
+ "build": "tsdown",
19
+ "test": "vitest",
20
+ "coverage": "vitest run --coverage",
21
+ "lint": "biome lint --write",
22
+ "format": "biome format --write && remark . --output",
23
+ "check": "biome check --write",
24
+ "ci": "biome ci",
25
+ "prepare": "husky"
26
+ },
27
+ "devDependencies": {
28
+ "@biomejs/biome": "^2.5.5",
29
+ "@vitest/coverage-v8": "^4.1.10",
30
+ "husky": "^9.1.7",
31
+ "remark": "^15.0.1",
32
+ "remark-cli": "^12.0.1",
33
+ "remark-preset-lint-recommended": "^7.0.1",
34
+ "tsdown": "^0.15.12",
35
+ "typescript": "^5.9.3",
36
+ "vitest": "^4.1.10"
37
+ },
38
+ "dependencies": {
39
+ "mdast-util-from-markdown": "^2.0.3",
40
+ "ts-dedent": "^2.3.0"
41
+ },
42
+ "repository": {
43
+ "type": "git",
44
+ "url": "git@github.com:k4a-l/dirtreeist.git"
45
+ }
49
46
  }
package/.eslint.js DELETED
@@ -1,16 +0,0 @@
1
- module.exports = {
2
- root: true, // .eslintrc.jsがプロジェクトのルートに配置させているか(指定がないと上位階層へ設定ファイルを探索される)
3
- parser: "@typescript-eslint/parser", // ESLintにTypeScriptを理解させる
4
- parserOptions: {},
5
- plugins: [
6
- "@typescript-eslint", // ESLintのTypeScriptプラグインのルールを適用できる様にする(/eslint-pluginは省略可)
7
- ],
8
- extends: [
9
- "eslint:recommended", // ESLintのJavaScriptルールセットを適用
10
- "plugin:@typescript-eslint/eslint-recommended", // eslint:recommendedに含まれるルールを型チェックでカバーできるものは無効化
11
- "plugin:@typescript-eslint/recommended", // 型チェックが不要なルールを適用
12
- "plugin:@typescript-eslint/recommended-requiring-type-checking", // 型チェックが必要なルールを適用
13
- "prettier",
14
- "prettier/@typescript-eslint", // eslint-config-prettierがv8.0.0以上の場合不要です
15
- ],
16
- };
@@ -1,24 +0,0 @@
1
- name: Release
2
- on:
3
- push:
4
- tags:
5
- - 'v*.*.*'
6
- permissions:
7
- contents: write
8
- id-token: write
9
- jobs:
10
- publish:
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v4
14
- - uses: actions/setup-node@v4
15
- with:
16
- node-version: '24'
17
- registry-url: 'https://registry.npmjs.org'
18
- - run: yarn install --frozen-lockfile
19
- - run: yarn build
20
- - run: npm publish
21
- - name: Create GitHub Release
22
- uses: softprops/action-gh-release@v2
23
- with:
24
- generate_release_notes: true
package/.prettierrc DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "semi": false,
3
- "singleQuote": true,
4
- "htmlWhitespaceSensitivity": "ignore",
5
- "endOfLine": "auto",
6
- "printWidth": 80
7
- }
package/babel.config.js DELETED
@@ -1,13 +0,0 @@
1
- module.exports = {
2
- presets: [
3
- [
4
- '@babel/preset-env',
5
- {
6
- targets: {
7
- node: 'current',
8
- },
9
- },
10
- ],
11
- ],
12
- plugins: ['@babel/plugin-transform-modules-commonjs'],
13
- }
@@ -1,8 +0,0 @@
1
- import { OptionsBase, SymbolSet } from '../types';
2
- declare const symbolSets: {
3
- [key in OptionsBase['treeType']]: SymbolSet;
4
- };
5
- declare const defaultOptions: OptionsBase;
6
- declare const treeTypeValues: readonly ["normal", "bold", "ascii"];
7
- export { symbolSets, defaultOptions, treeTypeValues };
8
- //# sourceMappingURL=constant.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../../src/constants/constant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEjD,QAAA,MAAM,UAAU,EAAE;KACf,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,SAAS;CAuB5C,CAAA;AAED,QAAA,MAAM,cAAc,EAAE,WAKrB,CAAA;AAED,QAAA,MAAM,cAAc,sCAAuC,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,CAAA"}
@@ -1,32 +0,0 @@
1
- const symbolSets = {
2
- normal: {
3
- vertical: '│',
4
- horizontal: '─',
5
- crossing: '├',
6
- end: '└',
7
- space: ' ',
8
- },
9
- bold: {
10
- vertical: '┃',
11
- horizontal: '━',
12
- crossing: '┣',
13
- end: '┗',
14
- space: ' ',
15
- },
16
- ascii: {
17
- vertical: '|',
18
- horizontal: '-',
19
- crossing: '+',
20
- end: '+',
21
- space: ' ',
22
- },
23
- };
24
- const defaultOptions = {
25
- treeType: 'normal',
26
- spaceBeforeName: false,
27
- spaceSize: 2,
28
- emptyBeforeUpperHierarche: false,
29
- };
30
- const treeTypeValues = ['normal', 'bold', 'ascii'];
31
- export { symbolSets, defaultOptions, treeTypeValues };
32
- //# sourceMappingURL=constant.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/constants/constant.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAEZ;IACF,MAAM,EAAE;QACN,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,GAAG;QACb,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;KACX;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,GAAG;QACb,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;KACX;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,GAAG;QACb,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,GAAG;KACX;CACF,CAAA;AAED,MAAM,cAAc,GAAgB;IAClC,QAAQ,EAAE,QAAQ;IAClB,eAAe,EAAE,KAAK;IACtB,SAAS,EAAE,CAAC;IACZ,yBAAyB,EAAE,KAAK;CACjC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAU,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,CAAA"}