├── .eslintrc.json ├── .gitattributes ├── .gitignore ├── .npmignore ├── .prettierignore ├── .prettierrc.json ├── .vscode ├── extensions.json └── settings.json ├── code ├── index.ts ├── kink.ts ├── leaf │ ├── form.ts │ └── index.ts ├── sift │ ├── form.ts │ ├── index.ts │ └── show.ts └── tree │ ├── form.ts │ ├── index.ts │ └── show.ts ├── license.md ├── package.json ├── pnpm-lock.yaml ├── readme.md ├── test ├── .vscode │ └── settings.json ├── file │ ├── all.note │ ├── deck.note │ ├── index.note │ ├── interpolated-end.note │ ├── interpolated-prop.note │ ├── interpolated-start-prop.note │ ├── interpolation-nesting.note │ ├── interpolation-with-path.note │ ├── kink │ │ ├── invalid-leading-space.note │ │ ├── invalid-nested-term.note │ │ └── invalid-term.note │ ├── line-nick.note │ ├── line.note │ ├── nesting-basic-revert.note │ ├── nesting-basic.note │ ├── nesting-ugly.note │ ├── path.note │ ├── sink.note │ ├── term-interpolation-complex.note │ ├── text-lines.note │ ├── text-multiline.note │ ├── text.note │ └── values.note └── index.test.ts ├── tsconfig.json └── view ├── base.logo.svg ├── clover.png ├── lace.png ├── mine.png ├── snap.png ├── snap2.png ├── snap5.png ├── snap7.png ├── tree.png └── tree.svg /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "parserOptions": { 7 | "ecmaVersion": "latest", 8 | "sourceType": "module", 9 | "project": ["./tsconfig.json"] 10 | }, 11 | "parser": "@typescript-eslint/parser", 12 | "plugins": [ 13 | "@typescript-eslint", 14 | "import", 15 | "simple-import-sort", 16 | "prettier" 17 | ], 18 | "extends": ["prettier"], 19 | "rules": { 20 | "curly": 2, 21 | "@typescript-eslint/quotes": [ 22 | "error", 23 | "single", 24 | { 25 | "avoidEscape": true, 26 | "allowTemplateLiterals": true 27 | } 28 | ], 29 | "@typescript-eslint/no-unnecessary-condition": 0, 30 | "@typescript-eslint/array-type": [ 31 | 2, 32 | { 33 | "default": "generic" 34 | } 35 | ], 36 | "@typescript-eslint/await-thenable": "error", 37 | "@typescript-eslint/consistent-type-definitions": [2, "type"], 38 | "@typescript-eslint/consistent-type-exports": "error", 39 | "@typescript-eslint/method-signature-style": "error", 40 | "@typescript-eslint/naming-convention": 0, 41 | "@typescript-eslint/no-explicit-any": "error", 42 | "@typescript-eslint/no-for-in-array": "error", 43 | "@typescript-eslint/no-namespace": "off", 44 | "@typescript-eslint/no-non-null-assertion": "error", 45 | "@typescript-eslint/no-require-imports": "error", 46 | "@typescript-eslint/no-this-alias": "error", 47 | "@typescript-eslint/no-unsafe-argument": "error", 48 | "@typescript-eslint/no-unsafe-assignment": "error", 49 | "@typescript-eslint/no-unsafe-member-access": "error", 50 | "@typescript-eslint/no-unsafe-return": "error", 51 | "@typescript-eslint/no-useless-empty-export": "error", 52 | "@typescript-eslint/prefer-function-type": "error", 53 | "no-array-constructor": "off", 54 | "@typescript-eslint/no-array-constructor": "error", 55 | "no-throw-literal": "off", 56 | "@typescript-eslint/no-throw-literal": "error", 57 | "lines-between-class-members": "off", 58 | "@typescript-eslint/lines-between-class-members": "error", 59 | "object-curly-spacing": "off", 60 | "@typescript-eslint/object-curly-spacing": [2, "always"], 61 | "padding-line-between-statements": "off", 62 | "@typescript-eslint/padding-line-between-statements": [ 63 | "error", 64 | { 65 | "blankLine": "always", 66 | "prev": "*", 67 | "next": ["type"] 68 | } 69 | ], 70 | "space-before-blocks": "off", 71 | "@typescript-eslint/space-before-blocks": ["error", "always"], 72 | "@typescript-eslint/type-annotation-spacing": [ 73 | "error", 74 | { "after": true } 75 | ], 76 | "import/first": "error", 77 | "import/newline-after-import": "error", 78 | "import/no-duplicates": "error", 79 | "prettier/prettier": 2, 80 | "@typescript-eslint/no-unused-vars": "off", 81 | "default-case": "error", 82 | "default-case-last": "error" 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Set default behavior to automatically normalize line endings. 2 | * text=auto 3 | 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.vsix 3 | /host 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /tool 2 | /view 3 | node_modules 4 | .vscode 5 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | host 2 | node_modules 3 | tmp 4 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "trailingComma": "all", 4 | "singleQuote": true, 5 | "printWidth": 72, 6 | "tabWidth": 2, 7 | "useTabs": false, 8 | "arrowParens": "avoid", 9 | "quoteProps": "as-needed", 10 | "bracketSpacing": true, 11 | "proseWrap": "always", 12 | "endOfLine": "lf", 13 | "singleAttributePerLine": true, 14 | "prettierPath": "./node_modules/prettier", 15 | "importOrder": ["^\\w(.*)$", "^@(.*)$", "~(.*)$", "\\..(.*)$", "\\.(.*)$"], 16 | "importOrderSeparation": true, 17 | "importOrderSortSpecifiers": true 18 | } 19 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "esbenp.prettier-vscode", 4 | "dbaeumer.vscode-eslint" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "editor.formatOnSave": true, 4 | "eslint.format.enable": true, 5 | "editor.codeActionsOnSave": { 6 | "source.fixAll.eslint": "explicit" 7 | }, 8 | "eslint.validate": ["javascript", "typescript"], 9 | "eslint.nodePath": "./node_modules/eslint" 10 | } 11 | -------------------------------------------------------------------------------- /code/index.ts: -------------------------------------------------------------------------------- 1 | import make from './tree/index.js' 2 | 3 | export default make 4 | 5 | export * from './tree/form.js' 6 | -------------------------------------------------------------------------------- /code/kink.ts: -------------------------------------------------------------------------------- 1 | import Kink from '@termsurf/kink' 2 | import { makeKinkText } from '@termsurf/kink-text' 3 | import tint from '@termsurf/tint-text' 4 | import { LeafBand } from './leaf/form.js' 5 | import { haveText } from '@termsurf/have' 6 | import { isNode } from 'browser-or-node' 7 | 8 | const VIEW_SIZE = (isNode ? process.stdout.columns : 80) ?? 80 9 | 10 | const host = '@termsurf/tree' 11 | 12 | type Base = { 13 | syntax_error: { 14 | take: { 15 | file: string 16 | text: Array 17 | band: LeafBand 18 | } 19 | base: { 20 | file: string 21 | band: LeafBand 22 | hint?: string 23 | } 24 | fill: { 25 | text: string 26 | } 27 | } 28 | not_implemented: { 29 | take: { 30 | file: string 31 | form: string 32 | } 33 | } 34 | invalid_nesting: { 35 | take: { 36 | file: string 37 | text: Array 38 | band: LeafBand 39 | hint?: string 40 | } 41 | base: { 42 | file: string 43 | band: LeafBand 44 | hint?: string 45 | } 46 | fill: { 47 | text: string 48 | } 49 | } 50 | invalid_indentation: { 51 | take: { 52 | file: string 53 | text: Array 54 | band: LeafBand 55 | hint?: string 56 | } 57 | base: { 58 | file: string 59 | band: LeafBand 60 | hint?: string 61 | } 62 | fill: { 63 | text: string 64 | } 65 | } 66 | } 67 | 68 | type Name = keyof Base 69 | 70 | Kink.base( 71 | host, 72 | 'syntax_error', 73 | (take: Base['syntax_error']['take']) => ({ 74 | code: 1, 75 | note: 'Error in the structure of the TreeCode Tree', 76 | }), 77 | ) 78 | 79 | Kink.load( 80 | host, 81 | 'syntax_error', 82 | (take: Base['syntax_error']['take']) => ({ 83 | file: take.file, 84 | band: take.band, 85 | }), 86 | ) 87 | 88 | Kink.fill( 89 | host, 90 | 'syntax_error', 91 | ( 92 | take: Base['syntax_error']['take'], 93 | base: Base['syntax_error']['base'], 94 | ) => ({ 95 | file: `${base.file}:${base.band.base.line + 1}:${ 96 | base.band.base.mark + 1 97 | }`, 98 | text: makeShowText(take.text, take.band), 99 | }), 100 | ) 101 | 102 | Kink.base( 103 | host, 104 | 'invalid_nesting', 105 | (take: Base['invalid_nesting']['take']) => ({ 106 | code: 2, 107 | note: 'The Link Tree has invalid nesting', 108 | }), 109 | ) 110 | 111 | Kink.load( 112 | host, 113 | 'invalid_nesting', 114 | (take: Base['invalid_nesting']['take']) => ({ 115 | file: take.file, 116 | band: take.band, 117 | hint: take.hint, 118 | }), 119 | ) 120 | 121 | Kink.fill( 122 | host, 123 | 'invalid_nesting', 124 | ( 125 | take: Base['invalid_nesting']['take'], 126 | base: Base['invalid_nesting']['base'], 127 | ) => ({ 128 | file: `${base.file}:${base.band.base.line + 1}:${ 129 | base.band.base.mark + 1 130 | }`, 131 | text: makeShowText(take.text, take.band), 132 | hint: take.hint, 133 | }), 134 | ) 135 | 136 | Kink.base( 137 | host, 138 | 'invalid_indentation', 139 | (take: Base['invalid_indentation']['take']) => ({ 140 | code: 3, 141 | note: 'The Link Tree has invalid indentation', 142 | }), 143 | ) 144 | 145 | Kink.load( 146 | host, 147 | 'invalid_indentation', 148 | (take: Base['invalid_indentation']['take']) => ({ 149 | file: take.file, 150 | band: take.band, 151 | hint: take.hint, 152 | }), 153 | ) 154 | 155 | Kink.fill( 156 | host, 157 | 'invalid_indentation', 158 | ( 159 | take: Base['invalid_indentation']['take'], 160 | base: Base['invalid_indentation']['base'], 161 | ) => ({ 162 | file: `${base.file}:${base.band.base.line + 1}:${ 163 | base.band.base.mark + 1 164 | }`, 165 | text: makeShowText(take.text, take.band), 166 | hint: take.hint, 167 | }), 168 | ) 169 | 170 | Kink.base(host, 'not_implemented', () => ({ 171 | code: 2, 172 | note: `This feature hasn't been implemented yet`, 173 | })) 174 | 175 | Kink.load( 176 | host, 177 | 'not_implemented', 178 | (link: Base['not_implemented']['take']) => ({ 179 | file: link.file, 180 | form: link.form, 181 | }), 182 | ) 183 | 184 | Kink.code(host, (code: number) => code.toString(16).padStart(4, '0')) 185 | 186 | export default function makeBase( 187 | form: N, 188 | link?: Base[N]['take'], 189 | ) { 190 | return Kink.make(host, form, link) 191 | } 192 | 193 | export function makeFill( 194 | form: N, 195 | link?: Base[N]['take'], 196 | ) { 197 | return Kink 198 | } 199 | 200 | export { makeKinkText } 201 | 202 | export function makeShowText( 203 | lineText: Array, 204 | band: LeafBand, 205 | ): string { 206 | const headLine = Math.min(band.base.line + 4, lineText.length - 1) 207 | const headLineString = lineText[headLine] 208 | haveText(headLineString, `text[${headLine}]`) 209 | 210 | const headMark = headLineString.length - 1 211 | const bindBand: LeafBand = { 212 | head: { 213 | mark: headMark, 214 | line: headLine, 215 | }, 216 | base: { 217 | mark: 0, 218 | line: Math.max(0, band.base.line - 4), 219 | }, 220 | } 221 | 222 | const text = makeBandText(bindBand, lineText, band) 223 | 224 | return text 225 | } 226 | 227 | export function makeBandText( 228 | bond: LeafBand, 229 | lineText: Array, 230 | band: LeafBand, 231 | ): string { 232 | const lineList: Array = [] 233 | let i = bond.base.line 234 | let n = bond.head.line 235 | let pad = String(n + 1).length 236 | const defaultIndent = new Array(pad + 1).join(' ') 237 | const W = { tone: 'white' } 238 | const WB = { tone: 'whiteBright' } 239 | const R = { tone: 'red' } 240 | lineList.push(tint(`${defaultIndent} |`, W)) 241 | 242 | while (i <= n) { 243 | let line = lineText[i] 244 | haveText(line, 'line') 245 | const x = i + 1 246 | let z = x.toString().padStart(pad, ' ') 247 | 248 | if (band.base.line === i) { 249 | let size = z.length + 3 + line.length 250 | let diff = size > VIEW_SIZE ? size - VIEW_SIZE : 0 251 | line = line.slice(0, line.length - diff) 252 | const a = line.slice(0, band.base.mark) 253 | const b = line.slice(band.base.mark, band.head.mark) 254 | const c = line.slice(band.head.mark) 255 | lineList.push(tint(`${z} | ${a}${tint(b, R)}${c}`, WB)) 256 | const indentA = new Array(z.length + 1).join(' ') 257 | const indentB = new Array(band.base.mark + 1).join(' ') 258 | let haltText = new Array( 259 | band.head.mark - band.base.mark + 1, 260 | ).join('~') 261 | size = indentA.length + 3 + indentB.length + haltText.length 262 | diff = size > VIEW_SIZE ? size - VIEW_SIZE : 0 263 | haltText = haltText.slice(0, haltText.length - diff) 264 | lineList.push( 265 | tint(`${indentA} | ${indentB}`, W) + tint(`${haltText}`, R), 266 | ) 267 | } else { 268 | let size = z.length + 3 + line.length 269 | let diff = size > VIEW_SIZE ? size - VIEW_SIZE : 0 270 | line = line.slice(0, line.length - diff) 271 | lineList.push(tint(`${z} | ${line}`, W)) 272 | } 273 | i++ 274 | } 275 | 276 | lineList.push(tint(`${defaultIndent} |`, W)) 277 | 278 | return lineList.join('\n') 279 | } 280 | -------------------------------------------------------------------------------- /code/leaf/form.ts: -------------------------------------------------------------------------------- 1 | export enum LeafForm { 2 | Base = 'base', 3 | Line = 'line', 4 | Text = 'text', 5 | Nick = 'nick', 6 | Term = 'term', 7 | } 8 | 9 | export enum LeafName { 10 | FallNick = 'leaf-fall-nick', 11 | FallHold = 'leaf-fall-hold', 12 | FallText = 'leaf-fall-text', 13 | Link = 'leaf-link', 14 | Note = 'leaf-note', 15 | Comb = 'leaf-comb', 16 | Code = 'leaf-code', 17 | RiseNick = 'leaf-rise-nick', 18 | RiseHold = 'leaf-rise-hold', 19 | RiseText = 'leaf-rise-text', 20 | SlotLine = 'leaf-slot-line', 21 | Cord = 'leaf-cord', 22 | Size = 'leaf-size', 23 | Slot = 'leaf-slot', 24 | Knit = 'leaf-knit', 25 | } 26 | 27 | export type LeafBandSlot = { 28 | mark: number 29 | line: number 30 | } 31 | 32 | export type LeafBand = { 33 | base: LeafBandSlot 34 | head: LeafBandSlot 35 | } 36 | 37 | export type LeafComb = LeafBase & { 38 | form: LeafName.Comb 39 | } 40 | 41 | export type LeafSize = LeafBase & { 42 | form: LeafName.Size 43 | } 44 | 45 | export type LeafRiseHold = LeafBase & { 46 | form: LeafName.RiseHold 47 | } 48 | 49 | export type LeafFallHold = LeafBase & { 50 | form: LeafName.FallHold 51 | } 52 | 53 | export type LeafRiseText = LeafBase & { 54 | form: LeafName.RiseText 55 | } 56 | 57 | export type LeafSlot = LeafBase & { 58 | form: LeafName.Slot 59 | } 60 | 61 | export type LeafFallText = LeafBase & { 62 | form: LeafName.FallText 63 | } 64 | 65 | export type LeafRiseNick = LeafBase & { 66 | form: LeafName.RiseNick 67 | } 68 | 69 | export type LeafFallNick = LeafBase & { 70 | form: LeafName.FallNick 71 | } 72 | 73 | export type LeafLink = LeafBase & { 74 | form: LeafName.Link 75 | } 76 | 77 | export type LeafCode = LeafBase & { 78 | form: LeafName.Code 79 | } 80 | 81 | export type LeafNote = LeafBase & { 82 | form: LeafName.Note 83 | } 84 | 85 | export type LeafSlotLine = LeafBase & { 86 | form: LeafName.SlotLine 87 | } 88 | 89 | export type LeafCord = LeafBase & { 90 | form: LeafName.Cord 91 | } 92 | 93 | export type LeafKnit = LeafBase & { 94 | form: LeafName.Knit 95 | } 96 | 97 | export type LeafCallTree = { 98 | file: string 99 | text: string 100 | } 101 | 102 | export type LeafBase = { 103 | band: LeafBand 104 | text: string 105 | // linked list 106 | back?: Leaf 107 | head?: Leaf 108 | } 109 | 110 | export type LeafSeed = { 111 | test: RegExp 112 | } 113 | 114 | export type LeafCallCast = LeafCallTree & { 115 | head?: Leaf 116 | lineText: Array 117 | } 118 | 119 | export type Leaf = 120 | | LeafFallNick 121 | | LeafFallHold 122 | | LeafFallText 123 | | LeafLink 124 | | LeafNote 125 | | LeafComb 126 | | LeafCode 127 | | LeafRiseNick 128 | | LeafRiseHold 129 | | LeafRiseText 130 | | LeafSlotLine 131 | | LeafCord 132 | | LeafSize 133 | | LeafSlot 134 | | LeafKnit 135 | -------------------------------------------------------------------------------- /code/leaf/index.ts: -------------------------------------------------------------------------------- 1 | import Kink from '@termsurf/kink' 2 | import { haveMesh } from '@termsurf/have' 3 | import kink from '../kink.js' 4 | import { 5 | LeafForm, 6 | Leaf, 7 | LeafCallCast, 8 | LeafCallTree, 9 | LeafName, 10 | LeafSeed, 11 | } from './form.js' 12 | 13 | export const LINE_TEST_LIST: Array = [LeafName.RiseNick] 14 | 15 | export const NICK_TEST_LIST: Array = [ 16 | LeafName.FallNick, 17 | LeafName.FallHold, 18 | LeafName.FallText, 19 | LeafName.Link, 20 | LeafName.Note, 21 | LeafName.Comb, 22 | LeafName.Code, 23 | LeafName.SlotLine, 24 | LeafName.RiseNick, 25 | LeafName.RiseHold, 26 | LeafName.RiseText, 27 | LeafName.Knit, 28 | LeafName.Size, 29 | LeafName.Slot, 30 | ] 31 | 32 | export const TEXT_TEST_LIST: Array = [ 33 | LeafName.RiseNick, 34 | LeafName.FallText, 35 | LeafName.Cord, 36 | ] 37 | 38 | export const KNIT_TEST_LIST: Array = [ 39 | LeafName.RiseNick, 40 | LeafName.Knit, 41 | ] 42 | 43 | export const NAME: Array = [ 44 | LeafName.FallNick, 45 | LeafName.FallHold, 46 | LeafName.FallText, 47 | LeafName.Link, 48 | LeafName.Note, 49 | LeafName.Comb, 50 | LeafName.Code, 51 | LeafName.SlotLine, 52 | LeafName.RiseNick, 53 | LeafName.RiseHold, 54 | LeafName.RiseText, 55 | LeafName.Cord, 56 | LeafName.Size, 57 | LeafName.Knit, 58 | ] 59 | 60 | export const BASE_TEST_LIST: Array = [ 61 | LeafName.FallNick, 62 | LeafName.FallHold, 63 | LeafName.FallText, 64 | LeafName.Link, 65 | LeafName.Note, 66 | LeafName.Comb, 67 | LeafName.Code, 68 | LeafName.SlotLine, 69 | LeafName.RiseNick, 70 | LeafName.RiseHold, 71 | LeafName.RiseText, 72 | LeafName.Size, 73 | LeafName.Slot, 74 | LeafName.Knit, 75 | ] 76 | 77 | export const FORM: Record> = { 78 | [LeafForm.Line]: LINE_TEST_LIST, 79 | [LeafForm.Text]: TEXT_TEST_LIST, 80 | [LeafForm.Nick]: NICK_TEST_LIST, 81 | [LeafForm.Term]: KNIT_TEST_LIST, 82 | [LeafForm.Base]: BASE_TEST_LIST, 83 | } 84 | 85 | /** 86 | * These are _flexible_ matchers, so that 87 | * you can get error handling that the thing 88 | * was incorrect, rather than it just not matching 89 | * at all. 90 | */ 91 | 92 | const TEST: Record = { 93 | [LeafName.FallNick]: { 94 | test: /^\}+/, 95 | }, 96 | [LeafName.FallHold]: { 97 | test: /^\)/, 98 | }, 99 | [LeafName.FallText]: { 100 | test: /^>/, 101 | }, 102 | [LeafName.Link]: { 103 | test: /^, */, 104 | }, 105 | [LeafName.Note]: { 106 | test: /^# +[^\n]+/, 107 | }, 108 | [LeafName.Comb]: { 109 | test: /^-?\d+\.\d+/, 110 | }, 111 | [LeafName.Code]: { 112 | test: /^#\w+/, 113 | }, 114 | [LeafName.SlotLine]: { 115 | test: /^\n/, 116 | }, 117 | [LeafName.RiseNick]: { 118 | test: /^\{+/, 119 | }, 120 | [LeafName.RiseHold]: { 121 | test: /^\(/, 122 | }, 123 | [LeafName.RiseText]: { 124 | test: /^\{\}])+|[^\{>\\]+/, 137 | }, 138 | } 139 | 140 | /** 141 | * This module is ideally very lenient with what it accepts so it can throw 142 | * helpful error messages if you forget the proper case and such. 143 | */ 144 | 145 | export default function makeTextList( 146 | link: LeafCallTree, 147 | ): LeafCallCast | Array { 148 | const cast: LeafCallCast = { 149 | ...link, 150 | lineText: link.text.split('\n'), 151 | } 152 | const nickList: Array = [] 153 | 154 | let formList = [LeafForm.Base] 155 | 156 | let line = 0 157 | let mark = 0 158 | 159 | let back: Leaf | undefined = undefined 160 | 161 | function save(hunk: Leaf) { 162 | if (!cast.head) { 163 | saveBond(cast, 'head', hunk) 164 | } else if (back) { 165 | saveBond(hunk, 'back', back) 166 | saveBond(back, 'head', hunk) 167 | } 168 | } 169 | 170 | for (let textLine of cast.lineText) { 171 | // append `\n` so test matching works as expected 172 | textLine = `${textLine}\n` 173 | 174 | while (textLine) { 175 | const textLeafForm: LeafForm = 176 | formList[formList.length - 1] || LeafForm.Base 177 | 178 | const testList = FORM[textLeafForm] 179 | 180 | let move = false 181 | 182 | walk: for (const form of testList) { 183 | const seed = TEST[form] 184 | 185 | haveMesh(seed, 'seed') 186 | 187 | let find = textLine.match(seed.test) 188 | 189 | // console.log(form, textLeafForm, find) 190 | 191 | if (!find) { 192 | continue 193 | } 194 | 195 | move = true 196 | 197 | let findSize = find[0].length 198 | let findText = textLine.slice(0, findSize) 199 | 200 | if (form === LeafName.FallNick) { 201 | const last = nickList[nickList.length - 1] 202 | if (last) { 203 | findSize = last.length 204 | findText = findText.slice(0, last.length) 205 | } 206 | } 207 | 208 | const stem: Leaf = { 209 | band: { 210 | head: { 211 | mark: mark + findSize, 212 | line, 213 | }, 214 | base: { 215 | mark, 216 | line, 217 | }, 218 | }, 219 | text: findText, 220 | form: form as Leaf['form'], 221 | } 222 | save(stem) 223 | 224 | back = stem 225 | 226 | textLine = textLine.slice(findSize) 227 | mark += findSize 228 | 229 | if (form === LeafName.RiseNick) { 230 | nickList.push(findText) 231 | } else if (form === LeafName.FallNick) { 232 | nickList.pop() 233 | } 234 | 235 | switch (form) { 236 | case LeafName.SlotLine: { 237 | line++ 238 | mark = 0 239 | break 240 | } 241 | case LeafName.RiseNick: { 242 | formList.push(LeafForm.Nick) 243 | break 244 | } 245 | case LeafName.FallNick: { 246 | formList.pop() 247 | break 248 | } 249 | case LeafName.RiseText: { 250 | formList.push(LeafForm.Text) 251 | break 252 | } 253 | case LeafName.FallText: { 254 | formList.pop() 255 | break 256 | } 257 | default: 258 | break 259 | } 260 | 261 | break walk 262 | } 263 | 264 | if (!move && back) { 265 | haveMesh(back, 'back') 266 | return [ 267 | kink('syntax_error', { 268 | text: cast.lineText, 269 | band: back.band, 270 | file: link.file, 271 | }), 272 | ] 273 | } 274 | } 275 | 276 | if (textLine.length && back) { 277 | return [ 278 | kink('syntax_error', { 279 | text: cast.lineText, 280 | band: back.band, 281 | file: link.file, 282 | }), 283 | ] 284 | } 285 | } 286 | 287 | return cast 288 | } 289 | 290 | function saveBond( 291 | mesh: Record, 292 | name: string, 293 | bond: unknown, 294 | ) { 295 | Object.defineProperty(mesh, name, { 296 | value: bond, 297 | enumerable: false, 298 | writable: true, 299 | }) 300 | } 301 | -------------------------------------------------------------------------------- /code/sift/form.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | LeafCallCast, 3 | LeafFallNick, 4 | LeafFallText, 5 | LeafNote, 6 | LeafComb, 7 | LeafCode, 8 | LeafRiseNick, 9 | LeafRiseText, 10 | LeafCord, 11 | LeafSize, 12 | LeafSlot, 13 | LeafSlotLine, 14 | } from '../leaf/form.js' 15 | import haveHalt from '@termsurf/have/make/halt.js' 16 | 17 | export enum SiftName { 18 | FallNest = 'sift-fall-nest', 19 | FallNick = 'sift-fall-nick', 20 | FallText = 'sift-fall-text', 21 | FallLine = 'sift-fall-line', 22 | Note = 'sift-note', 23 | Comb = 'sift-comb', 24 | Code = 'sift-code', 25 | RiseNest = 'sift-rise-nest', 26 | RiseNick = 'sift-rise-nick', 27 | RiseText = 'sift-rise-text', 28 | RiseLine = 'sift-rise-line', 29 | Cord = 'sift-cord', 30 | Size = 'sift-size', 31 | RiseFork = 'sift-rise-fork', 32 | FallFork = 'sift-fall-fork', 33 | RiseKnit = 'sift-rise-knit', 34 | FallKnit = 'sift-fall-knit', 35 | } 36 | 37 | export type SiftHash = { 38 | 'sift-fall-nest': SiftFallNest 39 | 'sift-fall-nick': SiftFallNick 40 | 'sift-fall-text': SiftFallText 41 | 'sift-note': SiftNote 42 | 'sift-comb': SiftComb 43 | 'sift-code': SiftCode 44 | 'sift-rise-nest': SiftRiseNest 45 | 'sift-rise-nick': SiftRiseNick 46 | 'sift-rise-text': SiftRiseText 47 | 'sift-cord': SiftCord 48 | 'sift-size': SiftSize 49 | // this should be called fork 50 | 'sift-rise-fork': SiftRiseFork 51 | 'sift-fall-fork': SiftFallFork 52 | 'sift-rise-knit': SiftRiseKnit 53 | 'sift-fall-knit': SiftFallKnit 54 | 'sift-rise-line': SiftRiseLine 55 | 'sift-fall-line': SiftFallLine 56 | } 57 | 58 | export type SiftRiseLine = { 59 | form: SiftName.RiseLine 60 | } 61 | 62 | export type SiftFallLine = { 63 | form: SiftName.FallLine 64 | } 65 | 66 | export type SiftRiseKnit = { 67 | form: SiftName.RiseKnit 68 | } 69 | 70 | export type SiftFallKnit = { 71 | form: SiftName.FallKnit 72 | } 73 | 74 | export type SiftRiseFork = { 75 | form: SiftName.RiseFork 76 | leaf?: LeafSlot | LeafSlotLine 77 | } 78 | 79 | export type SiftFallFork = { 80 | form: SiftName.FallFork 81 | } 82 | 83 | export type SiftFallNest = { 84 | form: SiftName.FallNest 85 | } 86 | 87 | export type SiftFallNick = { 88 | form: SiftName.FallNick 89 | leaf: LeafFallNick 90 | } 91 | 92 | export type SiftFallText = { 93 | form: SiftName.FallText 94 | leaf: LeafFallText 95 | } 96 | 97 | export type SiftNote = { 98 | form: SiftName.Note 99 | leaf: LeafNote 100 | } 101 | 102 | export type SiftComb = { 103 | form: SiftName.Comb 104 | bond: number 105 | leaf: LeafComb 106 | } 107 | 108 | export type SiftCode = { 109 | bond: number 110 | mold: string 111 | form: SiftName.Code 112 | leaf: LeafCode 113 | } 114 | 115 | export type Sift = 116 | | SiftFallNick 117 | // can get rid of nest, and use fork instead 118 | | SiftRiseNest 119 | | SiftFallNest 120 | | SiftFallText 121 | | SiftNote 122 | | SiftComb 123 | | SiftCode 124 | | SiftRiseNick 125 | | SiftRiseText 126 | | SiftCord 127 | | SiftSize 128 | | SiftRiseFork 129 | | SiftFallFork 130 | | SiftRiseKnit 131 | | SiftFallKnit 132 | | SiftRiseLine 133 | | SiftFallLine 134 | 135 | export type SiftRiseNest = { 136 | form: SiftName.RiseNest 137 | } 138 | 139 | export type SiftRiseNick = { 140 | size: number 141 | form: SiftName.RiseNick 142 | leaf: LeafRiseNick 143 | } 144 | 145 | export type SiftRiseText = { 146 | form: SiftName.RiseText 147 | leaf: LeafRiseText 148 | } 149 | 150 | export type SiftCallCast = LeafCallCast & { 151 | siftList: Array 152 | } 153 | 154 | export type SiftCord = { 155 | form: SiftName.Cord 156 | leaf: LeafCord 157 | } 158 | 159 | export type SiftSize = { 160 | form: SiftName.Size 161 | bond: number 162 | leaf: LeafSize 163 | } 164 | 165 | export function testSiftForm( 166 | lead: unknown, 167 | name: N, 168 | ): lead is SiftHash[N] { 169 | return (lead as Sift).form === name 170 | } 171 | 172 | export function haveSiftForm( 173 | lead: unknown, 174 | name: N, 175 | ): asserts lead is SiftHash[N] { 176 | if (!testSiftForm(lead, name)) { 177 | throw haveHalt('form_miss', { call: name, need: 'sift' }) 178 | } 179 | } 180 | -------------------------------------------------------------------------------- /code/sift/index.ts: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | 3 | import type { 4 | LeafCallCast, 5 | LeafCode, 6 | LeafComb, 7 | LeafFallHold, 8 | LeafFallNick, 9 | LeafFallText, 10 | Leaf, 11 | LeafKnit, 12 | LeafLink, 13 | LeafRiseNick, 14 | LeafCord, 15 | LeafRiseText, 16 | LeafSlot, 17 | LeafSize, 18 | LeafRiseHold, 19 | } from '../leaf/form.js' 20 | import { LeafName } from '../leaf/form.js' 21 | import { SiftName } from './form.js' 22 | import type { SiftCallCast, Sift } from './form.js' 23 | import Kink from '@termsurf/kink' 24 | import kink from '../kink.js' 25 | 26 | export * from './form.js' 27 | 28 | export type SiftCallLink = LeafCallCast 29 | 30 | enum Form { 31 | Card = 'card', 32 | Knit = 'knit', 33 | Text = 'text', 34 | Nick = 'nick', 35 | Line = 'line', 36 | Fork = 'fork', 37 | Nest = 'nest', 38 | } 39 | 40 | type ReadNote = { 41 | tick: number 42 | line?: boolean 43 | have: boolean 44 | } 45 | 46 | type Head = { 47 | form: Form 48 | seed?: Leaf 49 | } 50 | 51 | export default function makeSiftList( 52 | link: SiftCallLink, 53 | ): SiftCallCast | Array { 54 | const siftList: Array = [] 55 | 56 | const cast = { 57 | ...link, 58 | siftList, 59 | } 60 | 61 | // console.log(link.list) 62 | 63 | function makeHead(form: Form, seed?: Leaf) { 64 | return { form, seed } 65 | } 66 | 67 | function saveHead(head: Head) { 68 | headList.push(head) 69 | } 70 | 71 | function readHead() { 72 | return headList[headList.length - 1] 73 | } 74 | 75 | function tossHead() { 76 | headList.pop() 77 | } 78 | 79 | let leaf: Leaf | undefined = link.head 80 | 81 | const headList: Array = [makeHead(Form.Card)] 82 | const readNoteList: Array = [ 83 | { 84 | tick: 0, 85 | have: true, 86 | line: true, 87 | }, 88 | ] 89 | 90 | let textSlot = 0 91 | let slotLine = true 92 | // how far the start of the previous line is indented 93 | let lastTick = 0 94 | 95 | const haltList = [] 96 | const kinkList: Array = [] 97 | 98 | function saveReadNote(move = 0) { 99 | readNoteList.push({ 100 | tick: lastTick + move, 101 | have: true, 102 | line: true, 103 | }) 104 | } 105 | 106 | function tossReadNote() { 107 | const readNote = loadReadNote() 108 | if (readNote.line) { 109 | if (readNote.tick !== lastTick) { 110 | haltList.push(`Invalid indentation`) 111 | } 112 | } 113 | readNoteList.pop() 114 | } 115 | 116 | // function saveReadNoteLine(bond: boolean) { 117 | // const last = loadReadNote() 118 | // if (last) { 119 | // last.line = bond 120 | // } 121 | // } 122 | 123 | // function saveReadNoteHave(bond: boolean) { 124 | // const last = loadReadNote() 125 | // if (last) { 126 | // last.have = bond 127 | // } 128 | // } 129 | 130 | function loadReadNote() { 131 | return readNoteList[readNoteList.length - 1] as ReadNote 132 | } 133 | 134 | if (leaf) { 135 | do { 136 | // console.log(leaf.form, leaf.text) 137 | 138 | switch (leaf.form) { 139 | case LeafName.RiseNick: 140 | castRiseNick(leaf) 141 | break 142 | case LeafName.FallNick: 143 | castFallNick(leaf) 144 | break 145 | case LeafName.RiseText: 146 | slotLine = false 147 | castRiseText(leaf) 148 | break 149 | case LeafName.FallText: 150 | castFallText(leaf) 151 | break 152 | case LeafName.RiseHold: 153 | castRiseHold(leaf) 154 | break 155 | case LeafName.FallHold: 156 | castFallHold(leaf) 157 | break 158 | case LeafName.Link: { 159 | castLink(leaf) 160 | break 161 | } 162 | case LeafName.Note: 163 | slotLine = false 164 | break 165 | case LeafName.Comb: 166 | slotLine = false 167 | castComb(leaf) 168 | break 169 | case LeafName.Code: 170 | slotLine = false 171 | castCode(leaf) 172 | break 173 | case LeafName.Slot: 174 | castSlot(leaf) 175 | break 176 | case LeafName.SlotLine: 177 | fallBond() 178 | textSlot = 0 179 | slotLine = true 180 | break 181 | case LeafName.Cord: 182 | slotLine = false 183 | castCord(leaf) 184 | break 185 | // term templates 186 | case LeafName.Knit: 187 | slotLine = false 188 | castKnit(leaf) 189 | break 190 | case LeafName.Size: 191 | slotLine = false 192 | castSize(leaf) 193 | break 194 | default: 195 | break 196 | } 197 | } while ((leaf = leaf.head)) 198 | } 199 | 200 | fallBond() 201 | 202 | // siftList.push({ form: SiftName.FallNest }) 203 | 204 | // console.log(show(cast.siftList)) 205 | // process.exit() 206 | 207 | return kinkList.length ? kinkList : cast 208 | 209 | /** 210 | * Handle if it's the first item in the line. 211 | * 212 | * Call this for every _content_ node (i.e. not punctuation). 213 | */ 214 | 215 | function testBaseLine() { 216 | const readNote = loadReadNote() 217 | // if we are the first item on a new line... 218 | if (slotLine) { 219 | slotLine = false 220 | 221 | // we started on the same line as the opening context 222 | // so no indentation allowed then. 223 | if (readNote.line === false) { 224 | haltList.push(new Error('Invalid indentation')) 225 | } else { 226 | // we are multiple lines 227 | readNote.line = true 228 | } 229 | 230 | // if the content is not one greater 231 | // than the context wrapper indentation, 232 | // then that's an issue. 233 | if (lastTick < readNote.tick + 1) { 234 | haltList.push(new Error('Invalid indentation')) 235 | } 236 | 237 | // otherwise we are not in a new line. 238 | } else { 239 | // if we are the first item 240 | if (!readNote.have) { 241 | readNote.line = false 242 | } 243 | } 244 | 245 | readNote.have = true 246 | } 247 | 248 | function castRiseHold(seed: LeafRiseHold) { 249 | const head = readHead() 250 | 251 | if (head?.form === Form.Knit) { 252 | tossHead() 253 | siftList.push({ 254 | form: SiftName.FallKnit, 255 | }) 256 | } 257 | 258 | // saveHead(makeHead(Form.Nest)) 259 | // siftList.push({ 260 | // form: SiftName.RiseNest, 261 | // }) 262 | } 263 | 264 | function castSlot(seed: LeafSlot) { 265 | // close the knit, if present 266 | walk: while (true) { 267 | const head = readHead() 268 | 269 | switch (head?.form) { 270 | case Form.Knit: 271 | siftList.push({ 272 | form: SiftName.FallKnit, 273 | }) 274 | tossHead() 275 | break 276 | default: 277 | break walk 278 | } 279 | } 280 | 281 | if (slotLine) { 282 | slotLine = false 283 | 284 | const readNote = loadReadNote() 285 | 286 | let tick = Math.floor(seed.text.length / 2) 287 | 288 | if (seed.text.length % 2 !== 0) { 289 | kinkList.push( 290 | kink('invalid_nesting', { 291 | band: seed.band, 292 | text: link.lineText, 293 | file: link.file, 294 | }), 295 | ) 296 | // try fixing the code and seeing what happens 297 | tick = readNote.tick + 1 298 | } else if (tick > lastTick + 1) { 299 | // kinkList.push( 300 | // kink('invalid_nesting', { 301 | // band: seed.band, 302 | // text: link.lineText, 303 | // file: link.file, 304 | // }), 305 | // ) 306 | // try fixing the code and seeing what happens 307 | tick = lastTick + 1 308 | } else if (tick < readNote.tick) { 309 | // kinkList.push( 310 | // kink('invalid_nesting', { 311 | // band: seed.band, 312 | // text: link.lineText, 313 | // file: link.file, 314 | // }), 315 | // ) 316 | // try fixing the code and seeing what happens 317 | tick = readNote.tick + 1 318 | } 319 | 320 | let diff = tick - readNote.tick 321 | 322 | while (diff-- > 0) { 323 | saveHead(makeHead(Form.Nest)) 324 | 325 | siftList.push({ 326 | form: SiftName.RiseNest, 327 | // TODO: add new leaf here 328 | }) 329 | } 330 | 331 | lastTick = tick 332 | } else { 333 | // saveHead(makeHead(Form.Nest)) 334 | // siftList.push({ 335 | // form: SiftName.RiseNest, 336 | // // TODO: add new leaf here 337 | // }) 338 | 339 | switch (seed.back?.form) { 340 | case LeafName.Size: 341 | kinkList.push( 342 | kink('invalid_nesting', { 343 | band: seed.band, 344 | text: link.lineText, 345 | file: link.file, 346 | }), 347 | ) 348 | break 349 | default: 350 | break 351 | } 352 | } 353 | } 354 | 355 | function castRiseText(seed: LeafRiseText) { 356 | saveReadNote(1) 357 | saveHead(makeHead(Form.Text)) 358 | siftList.push({ 359 | form: SiftName.RiseText, 360 | leaf: seed, 361 | }) 362 | const readNote = loadReadNote() 363 | if (tailSlot(seed)) { 364 | readNote.line = true 365 | } else { 366 | readNote.line = false 367 | } 368 | } 369 | 370 | function tailSlot(seed: Leaf): boolean { 371 | if (seed.head) { 372 | if (seed.head.form === LeafName.Cord) { 373 | return Boolean(seed.head.text.match(/^\s*\n$/)) 374 | } 375 | } 376 | return false 377 | } 378 | 379 | function castFallText(seed: LeafFallText) { 380 | siftList.push({ 381 | leaf: seed, 382 | form: SiftName.FallText, 383 | }) 384 | tossHead() 385 | tossReadNote() 386 | } 387 | 388 | function castCode(seed: LeafCode) { 389 | testBaseLine() 390 | 391 | if (seed.text.match(/#([xbo])([0-9a-f]+)/i)) { 392 | const mold = RegExp.$1 393 | const bond = readCode(mold, RegExp.$2) 394 | siftList.push({ 395 | form: SiftName.Code, 396 | bond, 397 | mold, 398 | leaf: seed, 399 | }) 400 | } else if (seed.text.match(/#(\d+)n(\w+)/)) { 401 | const mold = RegExp.$1 402 | const bond = parseInt(RegExp.$2, parseInt(mold, 10)) 403 | siftList.push({ 404 | form: SiftName.Code, 405 | bond, 406 | mold, 407 | leaf: seed, 408 | }) 409 | } else { 410 | haltList.push(new Error('Invalid code')) 411 | } 412 | } 413 | 414 | function castComb(seed: LeafComb) { 415 | testBaseLine() 416 | 417 | const bond = parseFloat(seed.text) 418 | if (Number.isNaN(bond)) { 419 | haltList.push(new Error('Invalid size')) 420 | } 421 | siftList.push({ 422 | form: SiftName.Comb, 423 | bond, 424 | leaf: seed, 425 | }) 426 | } 427 | 428 | function castCord(seed: LeafCord) { 429 | const readNote = loadReadNote() 430 | 431 | if (readNote.line) { 432 | // TODO: create a new seed 433 | // remove the indentation 434 | seed.text = seed.text.slice(readNote.tick * 2).trimEnd() 435 | } 436 | 437 | const last = siftList[siftList.length - 1] 438 | 439 | // merge with last to keep things cleaner 440 | // keep multiline 441 | if (last?.form === SiftName.Cord && readNote.line) { 442 | if (seed.text) { 443 | if (last.leaf.text) { 444 | if (last.leaf.text.endsWith('\n')) { 445 | last.leaf.text = `${last.leaf.text}${seed.text}` 446 | } else { 447 | last.leaf.text = `${last.leaf.text} ${seed.text}` 448 | } 449 | } else { 450 | last.leaf.text = seed.text 451 | } 452 | } else if (seed.head && seed.head.form === LeafName.Cord) { 453 | last.leaf.text += '\n\n' 454 | } 455 | } else { 456 | siftList.push({ 457 | form: SiftName.Cord, 458 | leaf: seed, 459 | }) 460 | } 461 | } 462 | 463 | function castSize(seed: LeafSize) { 464 | testBaseLine() 465 | 466 | siftList.push({ 467 | form: SiftName.Size, 468 | leaf: seed, 469 | bond: parseInt(seed.text), 470 | }) 471 | } 472 | 473 | function readCode(mold: string, bond: string) { 474 | switch (mold) { 475 | case 'b': 476 | return parseInt(bond, 2) 477 | case 'o': 478 | return parseInt(bond, 8) 479 | case 'x': 480 | default: 481 | return parseInt(bond, 16) 482 | } 483 | } 484 | 485 | /** 486 | * Handle the comma in Link Text. 487 | */ 488 | 489 | function castLink(seed: LeafLink) { 490 | const head = seed.head 491 | if (head) { 492 | if (head.form !== LeafName.Slot) { 493 | haltList.push(new Error('Invalid character')) 494 | } else { 495 | if (head.text.length !== 1) { 496 | haltList.push(new Error('Invalid spacing')) 497 | } 498 | } 499 | } 500 | 501 | // close potential open knit. 502 | const find = readHead() 503 | switch (find?.form) { 504 | case Form.Knit: { 505 | castFallKnit() 506 | castFallFork() 507 | break 508 | } 509 | default: 510 | break 511 | } 512 | } 513 | 514 | function castFallFork() { 515 | tossHead() 516 | siftList.push({ 517 | form: SiftName.FallFork, 518 | }) 519 | } 520 | 521 | function castFallKnit() { 522 | tossHead() 523 | siftList.push({ 524 | form: SiftName.FallKnit, 525 | }) 526 | } 527 | 528 | function castKnit(seed: LeafKnit) { 529 | castRiseKnit(seed) 530 | 531 | // if (seed.text.match(/\/{2,}/)) { 532 | // haltList.push(new Error('Invalid knit')) 533 | // } else if (!seed.text.match(/^[0-9a-z-\/]+$/)) { 534 | // haltList.push(new Error('Invalid knit')) 535 | // } 536 | 537 | siftList.push({ 538 | form: SiftName.Cord, 539 | leaf: { 540 | form: LeafName.Cord, 541 | band: seed.band, 542 | text: seed.text, 543 | back: seed.back, 544 | head: seed.head, 545 | }, 546 | }) 547 | } 548 | 549 | function castRiseKnit(seed: LeafKnit) { 550 | const last = seed.back 551 | switch (last?.form) { 552 | case LeafName.SlotLine: 553 | case LeafName.Link: 554 | case LeafName.RiseNick: 555 | case LeafName.RiseHold: 556 | case LeafName.Slot: 557 | case undefined: { 558 | siftList.push({ 559 | form: SiftName.RiseFork, 560 | }) 561 | saveHead(makeHead(Form.Fork)) 562 | break 563 | } 564 | default: 565 | break 566 | } 567 | 568 | switch (last?.form) { 569 | case LeafName.Slot: 570 | case LeafName.SlotLine: 571 | case LeafName.Link: 572 | case LeafName.RiseNick: 573 | case LeafName.RiseHold: 574 | case undefined: { 575 | testBaseLine() 576 | siftList.push({ 577 | form: SiftName.RiseKnit, 578 | }) 579 | saveHead(makeHead(Form.Knit)) 580 | break 581 | } 582 | default: 583 | break 584 | } 585 | } 586 | 587 | function castRiseNick(seed: LeafRiseNick) { 588 | switch (seed.back?.form) { 589 | // we are starting a fresh interpolation 590 | case LeafName.Slot: 591 | case LeafName.SlotLine: 592 | case undefined: 593 | saveHead(makeHead(Form.Fork)) 594 | siftList.push({ 595 | form: SiftName.RiseFork, 596 | }) 597 | saveHead(makeHead(Form.Knit)) 598 | siftList.push({ 599 | form: SiftName.RiseKnit, 600 | }) 601 | break 602 | default: 603 | break 604 | } 605 | 606 | saveHead(makeHead(Form.Nick, seed)) 607 | siftList.push({ 608 | form: SiftName.RiseNick, 609 | leaf: seed, 610 | size: seed.text.length, 611 | }) 612 | saveReadNote(1) 613 | } 614 | 615 | /** 616 | * Handle close parenthesis. 617 | * 618 | * Parentheses can only be on one line. 619 | */ 620 | 621 | function castFallHold(seed: LeafFallHold) { 622 | walk: while (true) { 623 | const head = readHead() 624 | switch (head?.form) { 625 | case Form.Nest: 626 | siftList.push({ form: SiftName.FallNest }) 627 | tossHead() 628 | break 629 | case Form.Fork: 630 | siftList.push({ form: SiftName.FallFork }) 631 | tossHead() 632 | break 633 | case Form.Knit: 634 | siftList.push({ form: SiftName.FallKnit }) 635 | tossHead() 636 | break 637 | default: 638 | break walk 639 | } 640 | } 641 | } 642 | 643 | /** 644 | * Close interpolation. 645 | * 646 | * Can be on a separate line. 647 | */ 648 | 649 | function castFallNick(seed: LeafFallNick) { 650 | walk: while (true) { 651 | const head = readHead() 652 | switch (head?.form) { 653 | case Form.Knit: 654 | siftList.push({ 655 | form: SiftName.FallKnit, 656 | }) 657 | tossHead() 658 | break 659 | case Form.Nest: 660 | siftList.push({ form: SiftName.FallNest }) 661 | tossHead() 662 | break 663 | case Form.Fork: 664 | siftList.push({ form: SiftName.FallFork }) 665 | tossHead() 666 | break 667 | case Form.Nick: 668 | siftList.push({ 669 | leaf: seed, 670 | form: SiftName.FallNick, 671 | }) 672 | tossHead() 673 | break walk 674 | default: 675 | break walk 676 | } 677 | } 678 | 679 | tossReadNote() 680 | } 681 | 682 | // // close the parentheses 683 | function fallBond() { 684 | walk: while (true) { 685 | const head = readHead() 686 | tick: switch (head?.form) { 687 | case Form.Fork: 688 | siftList.push({ 689 | form: SiftName.FallFork, 690 | }) 691 | tossHead() 692 | break tick 693 | case Form.Nest: 694 | siftList.push({ form: SiftName.FallNest }) 695 | tossHead() 696 | break tick 697 | case Form.Knit: 698 | siftList.push({ 699 | form: SiftName.FallKnit, 700 | }) 701 | tossHead() 702 | break tick 703 | case Form.Line: 704 | siftList.push({ 705 | form: SiftName.FallLine, 706 | }) 707 | tossHead() 708 | break tick 709 | case Form.Card: 710 | break walk 711 | default: 712 | break walk 713 | } 714 | } 715 | } 716 | } 717 | 718 | function saveBond( 719 | mesh: Record, 720 | name: string, 721 | bond: unknown, 722 | ) { 723 | Object.defineProperty(mesh, name, { 724 | value: bond, 725 | enumerable: false, 726 | writable: true, 727 | }) 728 | } 729 | -------------------------------------------------------------------------------- /code/sift/show.ts: -------------------------------------------------------------------------------- 1 | import { Sift } from './form.js' 2 | 3 | export default function show(foldList: Array) { 4 | const list: Array = [] 5 | 6 | let move = 0 7 | 8 | foldList.forEach(fold => { 9 | if (fold.form.match('rise')) { 10 | list.push( 11 | `${makeTextMove(move++)}${fold.form.slice(5)}+ ${ 12 | ('leaf' in fold && 13 | fold.leaf && 14 | 'text' in fold.leaf && 15 | lead(fold.leaf.text)) || 16 | '' 17 | }`, 18 | ) 19 | } else if (fold.form.match('fall')) { 20 | list.push( 21 | `${makeTextMove(--move)}${fold.form.slice(5)}- ${ 22 | ('leaf' in fold && 23 | fold.leaf && 24 | 'text' in fold.leaf && 25 | lead(fold.leaf.text)) || 26 | '' 27 | }`, 28 | ) 29 | } else { 30 | list.push( 31 | `${makeTextMove(move)}[${fold.form.slice(5)}] ${ 32 | ('leaf' in fold && 33 | fold.leaf && 34 | 'text' in fold.leaf && 35 | lead(fold.leaf.text)) || 36 | '' 37 | }`, 38 | ) 39 | } 40 | }) 41 | 42 | return list.join('\n') 43 | } 44 | 45 | function makeTextMove(move: number) { 46 | return new Array(Math.max(0, move + 1)).join(' ') 47 | } 48 | 49 | function lead(text: string) { 50 | return text.replace(/\n/g, '\\n') 51 | // .replace(/^ +/g, _ => 52 | // _.split('') 53 | // .map(x => `\\s`) 54 | // .join(''), 55 | // ) 56 | } 57 | -------------------------------------------------------------------------------- /code/tree/form.ts: -------------------------------------------------------------------------------- 1 | import type { Leaf } from '../leaf/form.js' 2 | import haveHalt from '@termsurf/have/make/halt.js' 3 | 4 | export enum TreeHint { 5 | // Code = 'code', 6 | // nick == interpolated == dynamic 7 | NickKnit = 'nick-knit', 8 | NickText = 'nick-text', 9 | Void = 'void', 10 | // Size = 'size', 11 | Knit = 'knit', 12 | Text = 'text', 13 | } 14 | 15 | export enum TreeName { 16 | Comb = 'tree-comb', 17 | Code = 'tree-code', 18 | Knit = 'tree-knit', 19 | Nick = 'tree-nick', 20 | Text = 'tree-text', 21 | Cord = 'tree-cord', 22 | Fork = 'tree-fork', 23 | Size = 'tree-size', 24 | Line = 'tree-line', 25 | } 26 | 27 | export type TreeHash = { 28 | 'tree-comb': TreeComb 29 | 'tree-code': TreeCode 30 | 'tree-knit': TreeKnit 31 | 'tree-nick': TreeNick 32 | 'tree-cord': TreeCord 33 | 'tree-text': TreeText 34 | 'tree-fork': TreeFork 35 | 'tree-size': TreeSize 36 | 'tree-line': TreeLine 37 | } 38 | 39 | export const TREE_FORM = [ 40 | TreeName.Comb, 41 | TreeName.Code, 42 | TreeName.Knit, 43 | TreeName.Nick, 44 | TreeName.Text, 45 | TreeName.Cord, 46 | TreeName.Fork, 47 | TreeName.Size, 48 | TreeName.Line, 49 | ] 50 | 51 | export type TreeCallCast = { 52 | tree: TreeLine 53 | } 54 | 55 | export type TreeFold = { 56 | base?: Leaf 57 | head?: Leaf 58 | } 59 | 60 | export type TreeLine = { 61 | nest: Array 62 | form: TreeName.Line 63 | } 64 | 65 | export type TreeFork = { 66 | fold?: TreeFold 67 | nest: Array< 68 | | TreeText 69 | | TreeFork 70 | | TreeSize 71 | | TreeText 72 | | TreeCord 73 | | TreeNick 74 | | TreeComb 75 | | TreeCode 76 | | TreeKnit 77 | > 78 | base?: TreeFork | TreeNick 79 | form: TreeName.Fork 80 | } 81 | 82 | export type TreeComb = { 83 | form: TreeName.Comb 84 | bond: number 85 | base?: TreeFork 86 | leaf: Leaf 87 | } 88 | 89 | export type TreeCode = { 90 | bond: number 91 | mold: string 92 | base?: TreeFork 93 | form: TreeName.Code 94 | leaf: Leaf 95 | } 96 | 97 | export type TreeKnit = { 98 | base?: TreeFork 99 | nest: Array 100 | form: TreeName.Knit 101 | fold?: TreeFold 102 | } 103 | 104 | export type TreeNick = { 105 | nest?: TreeFork 106 | base?: TreeKnit | TreeText 107 | size: number 108 | form: TreeName.Nick 109 | fold?: TreeFold 110 | } 111 | 112 | export type TreeCord = { 113 | form: TreeName.Cord 114 | base?: TreeText | TreeKnit 115 | leaf: Leaf 116 | } 117 | 118 | /** 119 | * This gets a base and head leaf, 120 | * so we know where it starts and ends easily. 121 | */ 122 | 123 | export type TreeText = { 124 | nest: Array 125 | form: TreeName.Text 126 | base?: TreeFork 127 | fold?: TreeFold 128 | } 129 | 130 | export type TreeSize = { 131 | form: TreeName.Size 132 | bond: number 133 | base?: TreeFork 134 | leaf: Leaf 135 | } 136 | 137 | export type Tree = 138 | | TreeComb 139 | | TreeCode 140 | | TreeKnit 141 | | TreeNick 142 | | TreeCord 143 | | TreeText 144 | | TreeFork 145 | | TreeSize 146 | | TreeLine 147 | 148 | export function testTreeForm( 149 | lead: unknown, 150 | name: N, 151 | ): lead is TreeHash[N] { 152 | return (lead as Tree).form === name 153 | } 154 | 155 | export function haveTreeForm( 156 | lead: unknown, 157 | name: N, 158 | ): asserts lead is TreeHash[N] { 159 | if (!testTreeForm(lead, name)) { 160 | throw haveHalt('form_miss', { call: name, need: 'tree' }) 161 | } 162 | } 163 | 164 | export function testTree(lead: unknown): lead is Tree { 165 | return TREE_FORM.includes((lead as Tree).form) 166 | } 167 | 168 | export function haveTree( 169 | lead: unknown, 170 | call: string, 171 | ): asserts lead is Tree { 172 | if (!testTree(lead)) { 173 | throw haveHalt('form_miss', { call, need: 'tree' }) 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /code/tree/index.ts: -------------------------------------------------------------------------------- 1 | import makeSiftList, { 2 | SiftCallCast, 3 | SiftHash, 4 | SiftName, 5 | } from '../sift/index.js' 6 | import makeTextList from '../leaf/index.js' 7 | import { LeafCallTree } from '../leaf/form.js' 8 | import { 9 | Tree, 10 | TreeCallCast, 11 | TreeCord, 12 | TreeLine, 13 | TreeHint, 14 | TreeKnit, 15 | TreeName, 16 | TreeNick, 17 | TreeFork, 18 | haveTree, 19 | TreeText, 20 | TreeSize, 21 | TreeComb, 22 | TreeCode, 23 | } from './form.js' 24 | import kink from '../kink.js' 25 | import { haveMesh } from '@termsurf/have' 26 | import Kink, { KinkList } from '@termsurf/kink' 27 | 28 | export * from '../sift/index.js' 29 | export * from '../leaf/index.js' 30 | export * from './form.js' 31 | 32 | export * from './show.js' 33 | 34 | type TreeCallTree = SiftCallCast & { 35 | wall: Array 36 | seed: SiftHash[T] 37 | kinkList: Array 38 | } 39 | 40 | type Slab = { 41 | line: Array 42 | nest: Array 43 | slot: number 44 | } 45 | 46 | function readSiftTree(link: SiftCallCast): TreeCallCast | KinkList { 47 | const tree: TreeLine = { 48 | form: TreeName.Line, 49 | nest: [], 50 | } 51 | const line: Array = [tree] 52 | const nest: Array = [tree] 53 | 54 | const slab: Slab = { 55 | line, 56 | nest, 57 | slot: 0, 58 | } 59 | 60 | const wall: Array = [slab] 61 | const kinkList: Array = [] 62 | 63 | let tick = 0 64 | 65 | while (tick < link.siftList.length) { 66 | const seed = link.siftList[tick] 67 | haveMesh(seed, 'seed') 68 | 69 | // console.log(seed) 70 | 71 | switch (seed.form) { 72 | case SiftName.RiseKnit: 73 | readRiseKnit({ 74 | ...link, 75 | wall, 76 | kinkList, 77 | seed, 78 | }) 79 | break 80 | case SiftName.FallKnit: 81 | readFallKnit({ 82 | ...link, 83 | wall, 84 | kinkList, 85 | seed, 86 | }) 87 | break 88 | case SiftName.RiseFork: 89 | readRiseFork({ 90 | ...link, 91 | wall, 92 | kinkList, 93 | seed, 94 | }) 95 | break 96 | case SiftName.FallFork: 97 | readFallFork({ 98 | ...link, 99 | wall, 100 | kinkList, 101 | seed, 102 | }) 103 | break 104 | case SiftName.RiseNick: 105 | readRiseNick({ 106 | ...link, 107 | wall, 108 | kinkList, 109 | seed, 110 | }) 111 | break 112 | case SiftName.FallNick: 113 | readFallNick({ 114 | ...link, 115 | wall, 116 | kinkList, 117 | seed, 118 | }) 119 | break 120 | case SiftName.Size: 121 | readSize({ 122 | ...link, 123 | wall, 124 | kinkList, 125 | seed, 126 | }) 127 | break 128 | case SiftName.RiseText: 129 | readRiseText({ 130 | ...link, 131 | wall, 132 | kinkList, 133 | seed, 134 | }) 135 | break 136 | case SiftName.FallText: 137 | readFallText({ 138 | ...link, 139 | wall, 140 | kinkList, 141 | seed, 142 | }) 143 | break 144 | case SiftName.Cord: 145 | readCord({ 146 | ...link, 147 | wall, 148 | kinkList, 149 | seed, 150 | }) 151 | break 152 | case SiftName.Comb: 153 | readComb({ 154 | ...link, 155 | wall, 156 | kinkList, 157 | seed, 158 | }) 159 | break 160 | case SiftName.Code: 161 | readCode({ 162 | ...link, 163 | wall, 164 | kinkList, 165 | seed, 166 | }) 167 | break 168 | case SiftName.RiseNest: 169 | readRiseNest({ 170 | ...link, 171 | wall, 172 | kinkList, 173 | seed, 174 | }) 175 | break 176 | case SiftName.FallNest: 177 | readFallNest({ 178 | ...link, 179 | wall, 180 | kinkList, 181 | seed, 182 | }) 183 | break 184 | default: 185 | throw kink('not_implemented', { 186 | form: seed.form, 187 | file: link.file, 188 | }) 189 | } 190 | 191 | tick++ 192 | } 193 | 194 | return kinkList.length 195 | ? new KinkList(kinkList) 196 | : { 197 | ...link, 198 | tree, 199 | } 200 | } 201 | 202 | function readRiseNest(link: TreeCallTree): void { 203 | const slab = link.wall[link.wall.length - 1] 204 | haveMesh(slab, 'slab') 205 | slab.slot++ 206 | const base = slab.nest[slab.slot] as Tree 207 | slab.line = [base] 208 | } 209 | 210 | function readFallNest(link: TreeCallTree): void { 211 | const slab = link.wall[link.wall.length - 1] 212 | haveMesh(slab, 'slab') 213 | slab.slot-- 214 | const base = slab.nest[slab.slot] as Tree 215 | slab.line = [base] 216 | } 217 | 218 | function readFallNick(link: TreeCallTree): void { 219 | link.wall.pop() 220 | } 221 | 222 | function readFallFork(link: TreeCallTree): void { 223 | const slab = link.wall[link.wall.length - 1] 224 | slab?.line.pop() 225 | } 226 | 227 | function readFallKnit(link: TreeCallTree): void { 228 | const slab = link.wall[link.wall.length - 1] 229 | slab?.line.pop() 230 | } 231 | 232 | function readFallText(link: TreeCallTree): void { 233 | const slab = link.wall[link.wall.length - 1] 234 | slab?.line.pop() 235 | } 236 | 237 | function readBase(link: TreeCallTree) { 238 | const slab = link.wall[link.wall.length - 1] 239 | haveMesh(slab, 'slab') 240 | const base = slab.line[slab.line.length - 1] as Tree 241 | return { slab, base, wall: link.wall } 242 | } 243 | 244 | function readComb(link: TreeCallTree): void { 245 | const { base, slab } = readBase(link) 246 | 247 | switch (base.form) { 248 | case TreeName.Fork: { 249 | const comb: TreeComb = { 250 | form: TreeName.Comb, 251 | leaf: link.seed.leaf, 252 | bond: link.seed.bond, 253 | } 254 | 255 | linkBase(comb, base) 256 | 257 | base.nest.push(comb) 258 | break 259 | } 260 | default: 261 | haveTree(base, 'base') 262 | throw kink('not_implemented', { 263 | form: base.form, 264 | file: link.file, 265 | }) 266 | } 267 | } 268 | 269 | function readCode(link: TreeCallTree): void { 270 | const { base, slab } = readBase(link) 271 | 272 | switch (base.form) { 273 | case TreeName.Fork: { 274 | const code: TreeCode = { 275 | form: TreeName.Code, 276 | leaf: link.seed.leaf, 277 | bond: link.seed.bond, 278 | mold: link.seed.mold, 279 | } 280 | 281 | linkBase(code, base) 282 | 283 | base.nest.push(code) 284 | break 285 | } 286 | default: 287 | haveTree(base, 'base') 288 | throw kink('not_implemented', { 289 | form: base.form, 290 | file: link.file, 291 | }) 292 | } 293 | } 294 | 295 | function readRiseFork(link: TreeCallTree): void { 296 | const { base, slab, wall } = readBase(link) 297 | 298 | switch (base.form) { 299 | case TreeName.Line: { 300 | const fork: TreeFork = { 301 | nest: [], 302 | form: TreeName.Fork, 303 | } 304 | 305 | base.nest.push(fork) 306 | slab.line.push(fork) 307 | 308 | linkBase(fork, base) 309 | 310 | takeSlab(slab, fork) 311 | break 312 | } 313 | case TreeName.Fork: { 314 | const fork: TreeFork = { 315 | nest: [], 316 | form: TreeName.Fork, 317 | } 318 | 319 | base.nest.push(fork) 320 | slab.line.push(fork) 321 | 322 | linkBase(fork, base) 323 | 324 | takeSlab(slab, fork) 325 | break 326 | } 327 | case TreeName.Nick: { 328 | const fork: TreeFork = { 329 | nest: [], 330 | form: TreeName.Fork, 331 | } 332 | 333 | base.nest = fork 334 | slab.line.push(fork) 335 | 336 | linkBase(fork, base) 337 | 338 | takeSlab(slab, fork) 339 | break 340 | } 341 | default: 342 | haveTree(base, 'base') 343 | throw kink('not_implemented', { 344 | form: base.form, 345 | file: link.file, 346 | }) 347 | } 348 | } 349 | 350 | function readRiseNick(link: TreeCallTree): void { 351 | const { base, wall } = readBase(link) 352 | 353 | switch (base.form) { 354 | case TreeName.Knit: { 355 | const nick: TreeNick = { 356 | form: TreeName.Nick, 357 | size: link.seed.size, 358 | // fold: link.seed.leaf, 359 | } 360 | base.nest.push(nick) 361 | // slab.line.push(nick) 362 | 363 | makeSlab(wall, nick) 364 | 365 | linkBase(nick, base) 366 | break 367 | } 368 | case TreeName.Text: { 369 | const nick: TreeNick = { 370 | form: TreeName.Nick, 371 | size: link.seed.size, 372 | // fold: link.seed.leaf, 373 | } 374 | base.nest.push(nick) 375 | // slab.line.push(nick) 376 | 377 | makeSlab(wall, nick) 378 | 379 | linkBase(nick, base) 380 | break 381 | } 382 | default: 383 | haveMesh(base, 'base') 384 | throw kink('not_implemented', { 385 | form: base.form, 386 | file: link.file, 387 | }) 388 | } 389 | } 390 | 391 | function readRiseKnit(link: TreeCallTree): void { 392 | const { base, slab } = readBase(link) 393 | 394 | switch (base.form) { 395 | case TreeName.Fork: { 396 | const knit: TreeKnit = { 397 | form: TreeName.Knit, 398 | nest: [], 399 | } 400 | 401 | base.nest.push(knit) 402 | slab.line.push(knit) 403 | 404 | linkBase(knit, base) 405 | 406 | takeSlab(slab, knit) 407 | break 408 | } 409 | default: 410 | haveTree(base, 'base') 411 | throw kink('not_implemented', { 412 | form: base.form, 413 | file: link.file, 414 | }) 415 | } 416 | } 417 | 418 | function readRiseText(link: TreeCallTree): void { 419 | const { base, slab } = readBase(link) 420 | 421 | switch (base.form) { 422 | case TreeName.Fork: { 423 | const text: TreeText = { 424 | form: TreeName.Text, 425 | nest: [], 426 | } 427 | base.nest.push(text) 428 | slab.line.push(text) 429 | break 430 | } 431 | default: 432 | haveTree(base, 'base') 433 | throw kink('not_implemented', { 434 | form: base.form, 435 | file: link.file, 436 | }) 437 | } 438 | } 439 | 440 | function readCord(link: TreeCallTree): void { 441 | const { base } = readBase(link) 442 | 443 | switch (base.form) { 444 | case TreeName.Knit: { 445 | const cord: TreeCord = { 446 | form: TreeName.Cord, 447 | leaf: link.seed.leaf, 448 | } 449 | 450 | base.nest.push(cord) 451 | 452 | linkBase(cord, base) 453 | break 454 | } 455 | case TreeName.Text: { 456 | const cord: TreeCord = { 457 | form: TreeName.Cord, 458 | leaf: link.seed.leaf, 459 | } 460 | 461 | base.nest.push(cord) 462 | 463 | linkBase(cord, base) 464 | break 465 | } 466 | default: 467 | haveTree(base, 'base') 468 | throw kink('not_implemented', { 469 | form: base.form, 470 | file: link.file, 471 | }) 472 | } 473 | } 474 | 475 | function readSize(link: TreeCallTree): void { 476 | const { base } = readBase(link) 477 | 478 | switch (base.form) { 479 | case TreeName.Fork: { 480 | const size: TreeSize = { 481 | form: TreeName.Size, 482 | leaf: link.seed.leaf, 483 | bond: link.seed.bond, 484 | } 485 | 486 | base.nest.push(size) 487 | 488 | linkBase(size, base) 489 | break 490 | } 491 | case TreeName.Line: { 492 | link.kinkList.push( 493 | kink('invalid_nesting', { 494 | file: link.file, 495 | band: link.seed.leaf.band, 496 | text: link.lineText, 497 | hint: `Size values (numbers) shouldn't be used as terms.`, 498 | }), 499 | ) 500 | break 501 | } 502 | default: 503 | haveTree(base, 'base') 504 | throw kink('not_implemented', { 505 | form: base.form, 506 | file: link.file, 507 | }) 508 | } 509 | } 510 | 511 | export const LINK_HINT_TEXT: Record = { 512 | [TreeHint.NickText]: 'nick text', 513 | [TreeHint.NickKnit]: 'nick line', 514 | [TreeHint.Void]: 'void', 515 | [TreeHint.Text]: 'text', 516 | [TreeHint.Knit]: 'line', 517 | } 518 | 519 | export default function makeTreeFork( 520 | link: LeafCallTree, 521 | ): TreeCallCast | KinkList { 522 | const lead = makeTextList(link) 523 | 524 | if (Array.isArray(lead)) { 525 | return new KinkList(lead) 526 | } else { 527 | const siftLead = makeSiftList(lead) 528 | if (Array.isArray(siftLead)) { 529 | return new KinkList(siftLead) 530 | } 531 | return readSiftTree(siftLead) 532 | } 533 | } 534 | 535 | function linkBase(head: Tree, base: Tree) { 536 | Object.defineProperty(head, 'base', { 537 | value: base, 538 | enumerable: false, 539 | writable: true, 540 | }) 541 | } 542 | 543 | function takeSlab(slab: Slab, head: Tree) { 544 | if (slab.line.length === 2) { 545 | slab.nest = slab.nest.slice(0, slab.slot + 1) 546 | slab.nest.push(head) 547 | } 548 | } 549 | 550 | function makeSlab(wall: Array, head: Tree) { 551 | wall.push({ 552 | line: [head], 553 | nest: [head], 554 | slot: 0, 555 | }) 556 | } 557 | -------------------------------------------------------------------------------- /code/tree/show.ts: -------------------------------------------------------------------------------- 1 | import { Tree, TreeName } from './form.js' 2 | 3 | export function showTreeLine(base: Tree): string { 4 | const list: Array = [''] 5 | 6 | showTreeTreeBase(base).forEach(line => { 7 | list.push(`${line}`) 8 | }) 9 | 10 | // console.log(JSON.stringify(base, null, 2)) 11 | 12 | list.push('') 13 | 14 | return list.join('\n') 15 | } 16 | 17 | // export function showParserMesh(base: Tree): string { 18 | // const list: Array = [''] 19 | 20 | // showParserMeshDetails(base).forEach(line => { 21 | // list.push(` ${line}`) 22 | // }) 23 | 24 | // list.push('') 25 | 26 | // return list.join('\n') 27 | // } 28 | 29 | function showTreeTreeBase( 30 | seed: Tree, 31 | flat = false, 32 | nestSize = 0, 33 | ): Array { 34 | const list: Array = [] 35 | 36 | switch (seed.form) { 37 | case TreeName.Line: { 38 | seed.nest.forEach(seed => { 39 | list.push(...showTreeTreeBase(seed)) 40 | }) 41 | break 42 | } 43 | case TreeName.Cord: { 44 | list.push(seed.leaf.text) 45 | break 46 | } 47 | case TreeName.Fork: { 48 | const head: Array = [] 49 | const nestHead = seed.nest[0] 50 | if (nestHead) { 51 | showTreeTreeBase(nestHead, true, nestSize).forEach(line => { 52 | head.push(`${line}`) 53 | }) 54 | } 55 | 56 | const nest: Array = [] 57 | seed.nest.slice(1).forEach(el => { 58 | showTreeTreeBase(el, flat, nestSize + 1).forEach(line => { 59 | nest.push(`${line}`) 60 | }) 61 | }) 62 | 63 | if (flat) { 64 | const text = nest.join(', ').trim() 65 | if (text) { 66 | list.push(`${head.join('')}(${text})`) 67 | } else { 68 | list.push(`${head.join('')}`) 69 | } 70 | } else { 71 | list.push(...head) 72 | nest.forEach(line => { 73 | if (line) { 74 | list.push(` ${line}`) 75 | } 76 | }) 77 | } 78 | break 79 | } 80 | case TreeName.Size: { 81 | list.push(`${seed.bond}`) 82 | break 83 | } 84 | case TreeName.Text: { 85 | const string: Array = [] 86 | seed.nest.forEach(seg => { 87 | showTreeTreeBase(seg, true, nestSize + 1).forEach(line => { 88 | string.push(`${line}`) 89 | }) 90 | }) 91 | list.push(`<${string.join('')}>`) 92 | break 93 | } 94 | case TreeName.Nick: { 95 | if (seed.nest) { 96 | const plugin: Array = [] 97 | showTreeTreeBase(seed.nest, true, nestSize + 1).forEach( 98 | line => { 99 | plugin.push(`${line}`) 100 | }, 101 | ) 102 | const text = plugin.join('') 103 | if (text) { 104 | list.push( 105 | '{'.repeat(seed.size) + text + '}'.repeat(seed.size), 106 | ) 107 | } 108 | } 109 | break 110 | } 111 | case TreeName.Comb: { 112 | list.push(`${seed.bond}`) 113 | break 114 | } 115 | case TreeName.Code: { 116 | switch (seed.mold) { 117 | case 'b': 118 | list.push(`#${seed.mold}${seed.bond.toString(2)}`) 119 | break 120 | case 'o': 121 | list.push(`#${seed.mold}${seed.bond.toString(8)}`) 122 | break 123 | case 'x': 124 | list.push(`#${seed.mold}${seed.bond.toString(16)}`) 125 | break 126 | default: 127 | list.push( 128 | `#${seed.mold}${seed.bond.toString(parseInt(seed.mold))}`, 129 | ) 130 | break 131 | } 132 | break 133 | } 134 | case TreeName.Knit: { 135 | const line: Array = [] 136 | seed.nest.forEach((seg, i) => { 137 | showTreeTreeBase(seg, true, nestSize + 1).forEach(l => { 138 | if (i > 0 && seg.form !== TreeName.Nick) { 139 | line.push('') 140 | } 141 | line.push(l) 142 | }) 143 | }) 144 | const text = line.join('') 145 | if (text) { 146 | list.push(text) 147 | } 148 | break 149 | } 150 | default: 151 | throw new Error() 152 | } 153 | 154 | return list 155 | } 156 | 157 | // function showParserMeshDetails(seed: Tree): Array { 158 | // const list: Array = [] 159 | 160 | // const title = chalk.white(seed.form) 161 | 162 | // switch (seed.form) { 163 | // case TreeName.Text: { 164 | // list.push(`${title} ${chalk.green(seed.bond)}`) 165 | // break 166 | // } 167 | // case TreeName.Line: { 168 | // list.push(`${title}`) 169 | // if (seed.head) { 170 | // list.push(chalk.gray(` head:`)) 171 | // showParserMeshDetails(seed.head).forEach(line => { 172 | // list.push(` ${line}`) 173 | // }) 174 | // } else { 175 | // list.push(chalk.gray(' hook: undefined')) 176 | // } 177 | // if (seed.nest.length) { 178 | // list.push(chalk.gray(` nest:`)) 179 | // seed.nest.forEach(el => { 180 | // showParserMeshDetails(el).forEach(line => { 181 | // list.push(` ${line}`) 182 | // }) 183 | // }) 184 | // } 185 | // break 186 | // } 187 | // case TreeName.Size: { 188 | // list.push(`${title} ${seed.bond}`) 189 | // break 190 | // } 191 | // case TreeName.Text: { 192 | // list.push(`${title}`) 193 | // seed.list.forEach(seg => { 194 | // showParserMeshDetails(seg).forEach(line => { 195 | // list.push(` ${line}`) 196 | // }) 197 | // }) 198 | // break 199 | // } 200 | // case TreeName.Nick: { 201 | // list.push(`${title}`) 202 | // list.push(chalk.gray(` size: ${seed.size}`)) 203 | // if (seed.nest.length) { 204 | // list.push(chalk.gray(` nest:`)) 205 | // seed.nest.forEach(nest => { 206 | // showParserMeshDetails(nest).forEach(line => { 207 | // list.push(` ${line}`) 208 | // }) 209 | // }) 210 | // } 211 | // break 212 | // } 213 | // case TreeName.Cull: { 214 | // list.push(`${title}`) 215 | // list.push(chalk.gray(` nest:`)) 216 | // seed.nest.forEach(nest => { 217 | // showParserMeshDetails(nest).forEach(line => { 218 | // list.push(` ${line}`) 219 | // }) 220 | // }) 221 | // break 222 | // } 223 | // case TreeName.Comb: { 224 | // list.push(`${title} ${seed.bond}`) 225 | // break 226 | // } 227 | // case TreeName.Code: { 228 | // list.push(`${title} #${seed.system}${seed.code}`) 229 | // break 230 | // } 231 | // case TreeName.Term: { 232 | // list.push(`${title}`) 233 | // seed.list.forEach(seg => { 234 | // showParserMeshDetails(seg).forEach(line => { 235 | // list.push(` ${line}`) 236 | // }) 237 | // }) 238 | // break 239 | // } 240 | // case TreeName.Line: { 241 | // list.push(`${title}`) 242 | // seed.list.forEach(seg => { 243 | // showParserMeshDetails(seg).forEach(line => { 244 | // list.push(` ${line}`) 245 | // }) 246 | // }) 247 | // break 248 | // } 249 | // default: 250 | // throw kink('not_implemented', { form: undefined) 251 | // file: } 252 | 253 | // return list 254 | // } 255 | 256 | function move(size: number) { 257 | return new Array(size + 1).join(' ') 258 | } 259 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright © 2024 ClueSurf 4 | 5 | Permission is hereby granted, free of charge, to any person 6 | obtaining a copy of this software and associated documentation 7 | files (the "Software"), to deal in the Software without 8 | restriction, including without limitation the rights to use, 9 | copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the 11 | Software is furnished to do so, subject to the following 12 | conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 | OTHER DEALINGS IN THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@cluesurf/tree", 3 | "type": "module", 4 | "version": "1.1.3", 5 | "license": "MIT", 6 | "main": "./host/code/index.js", 7 | "scripts": { 8 | "make": "tsc && tsc-alias", 9 | "scan": "concurrently --kill-others \"tsc -w\" \"tsc-alias -w\"", 10 | "test": "tsx test/index.test.ts", 11 | "host": "rm -rf host && pnpm make && npm publish --access=public" 12 | }, 13 | "devDependencies": { 14 | "@trivago/prettier-plugin-sort-imports": "^4.0.0", 15 | "@types/eslint": "^8.40.0", 16 | "@types/lodash": "^4.14.194", 17 | "@types/node": "^18.11.17", 18 | "@types/prettier": "^2.7.2", 19 | "@typescript-eslint/eslint-plugin": "^5.46.1", 20 | "@typescript-eslint/parser": "^5.46.1", 21 | "concurrently": "^7.6.0", 22 | "eslint": "^8.31.0", 23 | "eslint-config-prettier": "^8.5.0", 24 | "eslint-config-standard-with-typescript": "^24.0.0", 25 | "eslint-import-resolver-typescript": "^3.5.2", 26 | "eslint-plugin-import": "^2.26.0", 27 | "eslint-plugin-n": "^15.6.0", 28 | "eslint-plugin-prettier": "^4.2.1", 29 | "eslint-plugin-promise": "^6.1.1", 30 | "eslint-plugin-simple-import-sort": "^8.0.0", 31 | "eslint-plugin-sort-exports": "^0.8.0", 32 | "prettier": "^2.8.1", 33 | "strip-ansi": "^7.1.0", 34 | "ts-node": "^10.9.1", 35 | "tsc-alias": "^1.8.2", 36 | "tsx": "^3.12.7", 37 | "typescript": "^4.9.4" 38 | }, 39 | "dependencies": { 40 | "@lancejpollard/configured-quadratic-residue-prng.js": "^1.0.0", 41 | "@cluesurf/have": "^0.2.0", 42 | "@cluesurf/kink": "^0.x.x", 43 | "@cluesurf/kink-text": "^0.x.x", 44 | "@cluesurf/tint-text": "^0.x.x", 45 | "browser-or-node": "^2.1.1" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@lancejpollard/configured-quadratic-residue-prng.js': 9 | specifier: ^1.0.0 10 | version: 1.0.0 11 | '@termsurf/have': 12 | specifier: ^0.2.0 13 | version: 0.2.0 14 | '@termsurf/kink': 15 | specifier: ^0.1.2 16 | version: 0.1.2 17 | '@termsurf/kink-text': 18 | specifier: ^0.0.1 19 | version: 0.0.1 20 | '@termsurf/tint-text': 21 | specifier: ^0.0.3 22 | version: 0.0.3 23 | browser-or-node: 24 | specifier: ^2.1.1 25 | version: 2.1.1 26 | 27 | devDependencies: 28 | '@trivago/prettier-plugin-sort-imports': 29 | specifier: ^4.3.0 30 | version: 4.3.0(prettier@2.8.8) 31 | '@types/eslint': 32 | specifier: ^8.44.9 33 | version: 8.44.9 34 | '@types/lodash': 35 | specifier: ^4.14.202 36 | version: 4.14.202 37 | '@types/node': 38 | specifier: ^18.19.3 39 | version: 18.19.3 40 | '@types/prettier': 41 | specifier: ^2.7.3 42 | version: 2.7.3 43 | '@typescript-eslint/eslint-plugin': 44 | specifier: ^5.62.0 45 | version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@4.9.5) 46 | '@typescript-eslint/parser': 47 | specifier: ^5.62.0 48 | version: 5.62.0(eslint@8.55.0)(typescript@4.9.5) 49 | concurrently: 50 | specifier: ^7.6.0 51 | version: 7.6.0 52 | eslint: 53 | specifier: ^8.55.0 54 | version: 8.55.0 55 | eslint-config-prettier: 56 | specifier: ^8.10.0 57 | version: 8.10.0(eslint@8.55.0) 58 | eslint-config-standard-with-typescript: 59 | specifier: ^24.0.0 60 | version: 24.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.29.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.55.0)(typescript@4.9.5) 61 | eslint-import-resolver-typescript: 62 | specifier: ^3.6.1 63 | version: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.55.0) 64 | eslint-plugin-import: 65 | specifier: ^2.29.0 66 | version: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0) 67 | eslint-plugin-n: 68 | specifier: ^15.7.0 69 | version: 15.7.0(eslint@8.55.0) 70 | eslint-plugin-prettier: 71 | specifier: ^4.2.1 72 | version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.55.0)(prettier@2.8.8) 73 | eslint-plugin-promise: 74 | specifier: ^6.1.1 75 | version: 6.1.1(eslint@8.55.0) 76 | eslint-plugin-simple-import-sort: 77 | specifier: ^8.0.0 78 | version: 8.0.0(eslint@8.55.0) 79 | eslint-plugin-sort-exports: 80 | specifier: ^0.8.0 81 | version: 0.8.0(eslint@8.55.0) 82 | prettier: 83 | specifier: ^2.8.8 84 | version: 2.8.8 85 | strip-ansi: 86 | specifier: ^7.1.0 87 | version: 7.1.0 88 | ts-node: 89 | specifier: ^10.9.2 90 | version: 10.9.2(@types/node@18.19.3)(typescript@4.9.5) 91 | tsc-alias: 92 | specifier: ^1.8.8 93 | version: 1.8.8 94 | tsx: 95 | specifier: ^3.14.0 96 | version: 3.14.0 97 | typescript: 98 | specifier: ^4.9.5 99 | version: 4.9.5 100 | 101 | packages: 102 | 103 | /@aashutoshrathi/word-wrap@1.2.6: 104 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 105 | engines: {node: '>=0.10.0'} 106 | dev: true 107 | 108 | /@babel/code-frame@7.23.5: 109 | resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} 110 | engines: {node: '>=6.9.0'} 111 | dependencies: 112 | '@babel/highlight': 7.23.4 113 | chalk: 2.4.2 114 | dev: true 115 | 116 | /@babel/generator@7.17.7: 117 | resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} 118 | engines: {node: '>=6.9.0'} 119 | dependencies: 120 | '@babel/types': 7.17.0 121 | jsesc: 2.5.2 122 | source-map: 0.5.7 123 | dev: true 124 | 125 | /@babel/generator@7.23.6: 126 | resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} 127 | engines: {node: '>=6.9.0'} 128 | dependencies: 129 | '@babel/types': 7.23.6 130 | '@jridgewell/gen-mapping': 0.3.3 131 | '@jridgewell/trace-mapping': 0.3.20 132 | jsesc: 2.5.2 133 | dev: true 134 | 135 | /@babel/helper-environment-visitor@7.22.20: 136 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 137 | engines: {node: '>=6.9.0'} 138 | dev: true 139 | 140 | /@babel/helper-function-name@7.23.0: 141 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 142 | engines: {node: '>=6.9.0'} 143 | dependencies: 144 | '@babel/template': 7.22.15 145 | '@babel/types': 7.23.6 146 | dev: true 147 | 148 | /@babel/helper-hoist-variables@7.22.5: 149 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 150 | engines: {node: '>=6.9.0'} 151 | dependencies: 152 | '@babel/types': 7.23.6 153 | dev: true 154 | 155 | /@babel/helper-split-export-declaration@7.22.6: 156 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 157 | engines: {node: '>=6.9.0'} 158 | dependencies: 159 | '@babel/types': 7.23.6 160 | dev: true 161 | 162 | /@babel/helper-string-parser@7.23.4: 163 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 164 | engines: {node: '>=6.9.0'} 165 | dev: true 166 | 167 | /@babel/helper-validator-identifier@7.22.20: 168 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 169 | engines: {node: '>=6.9.0'} 170 | dev: true 171 | 172 | /@babel/highlight@7.23.4: 173 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 174 | engines: {node: '>=6.9.0'} 175 | dependencies: 176 | '@babel/helper-validator-identifier': 7.22.20 177 | chalk: 2.4.2 178 | js-tokens: 4.0.0 179 | dev: true 180 | 181 | /@babel/parser@7.23.6: 182 | resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} 183 | engines: {node: '>=6.0.0'} 184 | hasBin: true 185 | dependencies: 186 | '@babel/types': 7.17.0 187 | dev: true 188 | 189 | /@babel/runtime@7.23.6: 190 | resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} 191 | engines: {node: '>=6.9.0'} 192 | dependencies: 193 | regenerator-runtime: 0.14.0 194 | dev: true 195 | 196 | /@babel/template@7.22.15: 197 | resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} 198 | engines: {node: '>=6.9.0'} 199 | dependencies: 200 | '@babel/code-frame': 7.23.5 201 | '@babel/parser': 7.23.6 202 | '@babel/types': 7.23.6 203 | dev: true 204 | 205 | /@babel/traverse@7.23.2: 206 | resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} 207 | engines: {node: '>=6.9.0'} 208 | dependencies: 209 | '@babel/code-frame': 7.23.5 210 | '@babel/generator': 7.23.6 211 | '@babel/helper-environment-visitor': 7.22.20 212 | '@babel/helper-function-name': 7.23.0 213 | '@babel/helper-hoist-variables': 7.22.5 214 | '@babel/helper-split-export-declaration': 7.22.6 215 | '@babel/parser': 7.23.6 216 | '@babel/types': 7.23.6 217 | debug: 4.3.4 218 | globals: 11.12.0 219 | transitivePeerDependencies: 220 | - supports-color 221 | dev: true 222 | 223 | /@babel/types@7.17.0: 224 | resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} 225 | engines: {node: '>=6.9.0'} 226 | dependencies: 227 | '@babel/helper-validator-identifier': 7.22.20 228 | to-fast-properties: 2.0.0 229 | dev: true 230 | 231 | /@babel/types@7.23.6: 232 | resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} 233 | engines: {node: '>=6.9.0'} 234 | dependencies: 235 | '@babel/helper-string-parser': 7.23.4 236 | '@babel/helper-validator-identifier': 7.22.20 237 | to-fast-properties: 2.0.0 238 | dev: true 239 | 240 | /@cspotcode/source-map-support@0.8.1: 241 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 242 | engines: {node: '>=12'} 243 | dependencies: 244 | '@jridgewell/trace-mapping': 0.3.9 245 | dev: true 246 | 247 | /@cspotcode/source-map@0.8.0: 248 | resolution: {integrity: sha512-LJ8rJH2SyApMpjKeL+h9IIF9VbVMX9lel0bkUIWV0G7GlAj/riWBWkUDt6GB4wZiqxPv25hFNa57hPZDrRWrqA==} 249 | engines: {node: '>= 12'} 250 | dev: false 251 | 252 | /@esbuild/android-arm64@0.18.20: 253 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 254 | engines: {node: '>=12'} 255 | cpu: [arm64] 256 | os: [android] 257 | requiresBuild: true 258 | dev: true 259 | optional: true 260 | 261 | /@esbuild/android-arm@0.18.20: 262 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 263 | engines: {node: '>=12'} 264 | cpu: [arm] 265 | os: [android] 266 | requiresBuild: true 267 | dev: true 268 | optional: true 269 | 270 | /@esbuild/android-x64@0.18.20: 271 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 272 | engines: {node: '>=12'} 273 | cpu: [x64] 274 | os: [android] 275 | requiresBuild: true 276 | dev: true 277 | optional: true 278 | 279 | /@esbuild/darwin-arm64@0.18.20: 280 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 281 | engines: {node: '>=12'} 282 | cpu: [arm64] 283 | os: [darwin] 284 | requiresBuild: true 285 | dev: true 286 | optional: true 287 | 288 | /@esbuild/darwin-x64@0.18.20: 289 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 290 | engines: {node: '>=12'} 291 | cpu: [x64] 292 | os: [darwin] 293 | requiresBuild: true 294 | dev: true 295 | optional: true 296 | 297 | /@esbuild/freebsd-arm64@0.18.20: 298 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 299 | engines: {node: '>=12'} 300 | cpu: [arm64] 301 | os: [freebsd] 302 | requiresBuild: true 303 | dev: true 304 | optional: true 305 | 306 | /@esbuild/freebsd-x64@0.18.20: 307 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 308 | engines: {node: '>=12'} 309 | cpu: [x64] 310 | os: [freebsd] 311 | requiresBuild: true 312 | dev: true 313 | optional: true 314 | 315 | /@esbuild/linux-arm64@0.18.20: 316 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 317 | engines: {node: '>=12'} 318 | cpu: [arm64] 319 | os: [linux] 320 | requiresBuild: true 321 | dev: true 322 | optional: true 323 | 324 | /@esbuild/linux-arm@0.18.20: 325 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 326 | engines: {node: '>=12'} 327 | cpu: [arm] 328 | os: [linux] 329 | requiresBuild: true 330 | dev: true 331 | optional: true 332 | 333 | /@esbuild/linux-ia32@0.18.20: 334 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 335 | engines: {node: '>=12'} 336 | cpu: [ia32] 337 | os: [linux] 338 | requiresBuild: true 339 | dev: true 340 | optional: true 341 | 342 | /@esbuild/linux-loong64@0.18.20: 343 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 344 | engines: {node: '>=12'} 345 | cpu: [loong64] 346 | os: [linux] 347 | requiresBuild: true 348 | dev: true 349 | optional: true 350 | 351 | /@esbuild/linux-mips64el@0.18.20: 352 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 353 | engines: {node: '>=12'} 354 | cpu: [mips64el] 355 | os: [linux] 356 | requiresBuild: true 357 | dev: true 358 | optional: true 359 | 360 | /@esbuild/linux-ppc64@0.18.20: 361 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 362 | engines: {node: '>=12'} 363 | cpu: [ppc64] 364 | os: [linux] 365 | requiresBuild: true 366 | dev: true 367 | optional: true 368 | 369 | /@esbuild/linux-riscv64@0.18.20: 370 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 371 | engines: {node: '>=12'} 372 | cpu: [riscv64] 373 | os: [linux] 374 | requiresBuild: true 375 | dev: true 376 | optional: true 377 | 378 | /@esbuild/linux-s390x@0.18.20: 379 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 380 | engines: {node: '>=12'} 381 | cpu: [s390x] 382 | os: [linux] 383 | requiresBuild: true 384 | dev: true 385 | optional: true 386 | 387 | /@esbuild/linux-x64@0.18.20: 388 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 389 | engines: {node: '>=12'} 390 | cpu: [x64] 391 | os: [linux] 392 | requiresBuild: true 393 | dev: true 394 | optional: true 395 | 396 | /@esbuild/netbsd-x64@0.18.20: 397 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 398 | engines: {node: '>=12'} 399 | cpu: [x64] 400 | os: [netbsd] 401 | requiresBuild: true 402 | dev: true 403 | optional: true 404 | 405 | /@esbuild/openbsd-x64@0.18.20: 406 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 407 | engines: {node: '>=12'} 408 | cpu: [x64] 409 | os: [openbsd] 410 | requiresBuild: true 411 | dev: true 412 | optional: true 413 | 414 | /@esbuild/sunos-x64@0.18.20: 415 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 416 | engines: {node: '>=12'} 417 | cpu: [x64] 418 | os: [sunos] 419 | requiresBuild: true 420 | dev: true 421 | optional: true 422 | 423 | /@esbuild/win32-arm64@0.18.20: 424 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 425 | engines: {node: '>=12'} 426 | cpu: [arm64] 427 | os: [win32] 428 | requiresBuild: true 429 | dev: true 430 | optional: true 431 | 432 | /@esbuild/win32-ia32@0.18.20: 433 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 434 | engines: {node: '>=12'} 435 | cpu: [ia32] 436 | os: [win32] 437 | requiresBuild: true 438 | dev: true 439 | optional: true 440 | 441 | /@esbuild/win32-x64@0.18.20: 442 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 443 | engines: {node: '>=12'} 444 | cpu: [x64] 445 | os: [win32] 446 | requiresBuild: true 447 | dev: true 448 | optional: true 449 | 450 | /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): 451 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 452 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 453 | peerDependencies: 454 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 455 | dependencies: 456 | eslint: 8.55.0 457 | eslint-visitor-keys: 3.4.3 458 | dev: true 459 | 460 | /@eslint-community/regexpp@4.10.0: 461 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 462 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 463 | dev: true 464 | 465 | /@eslint/eslintrc@2.1.4: 466 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 467 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 468 | dependencies: 469 | ajv: 6.12.6 470 | debug: 4.3.4 471 | espree: 9.6.1 472 | globals: 13.24.0 473 | ignore: 5.3.0 474 | import-fresh: 3.3.0 475 | js-yaml: 4.1.0 476 | minimatch: 3.1.2 477 | strip-json-comments: 3.1.1 478 | transitivePeerDependencies: 479 | - supports-color 480 | dev: true 481 | 482 | /@eslint/js@8.55.0: 483 | resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} 484 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 485 | dev: true 486 | 487 | /@humanwhocodes/config-array@0.11.13: 488 | resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} 489 | engines: {node: '>=10.10.0'} 490 | dependencies: 491 | '@humanwhocodes/object-schema': 2.0.1 492 | debug: 4.3.4 493 | minimatch: 3.1.2 494 | transitivePeerDependencies: 495 | - supports-color 496 | dev: true 497 | 498 | /@humanwhocodes/module-importer@1.0.1: 499 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 500 | engines: {node: '>=12.22'} 501 | dev: true 502 | 503 | /@humanwhocodes/object-schema@2.0.1: 504 | resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} 505 | dev: true 506 | 507 | /@jridgewell/gen-mapping@0.3.3: 508 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 509 | engines: {node: '>=6.0.0'} 510 | dependencies: 511 | '@jridgewell/set-array': 1.1.2 512 | '@jridgewell/sourcemap-codec': 1.4.15 513 | '@jridgewell/trace-mapping': 0.3.20 514 | dev: true 515 | 516 | /@jridgewell/resolve-uri@3.1.1: 517 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 518 | engines: {node: '>=6.0.0'} 519 | dev: true 520 | 521 | /@jridgewell/set-array@1.1.2: 522 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 523 | engines: {node: '>=6.0.0'} 524 | dev: true 525 | 526 | /@jridgewell/sourcemap-codec@1.4.15: 527 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 528 | dev: true 529 | 530 | /@jridgewell/trace-mapping@0.3.20: 531 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 532 | dependencies: 533 | '@jridgewell/resolve-uri': 3.1.1 534 | '@jridgewell/sourcemap-codec': 1.4.15 535 | dev: true 536 | 537 | /@jridgewell/trace-mapping@0.3.9: 538 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 539 | dependencies: 540 | '@jridgewell/resolve-uri': 3.1.1 541 | '@jridgewell/sourcemap-codec': 1.4.15 542 | dev: true 543 | 544 | /@lancejpollard/configured-quadratic-residue-prng.js@1.0.0: 545 | resolution: {integrity: sha512-TGKhTiD1v3aHCjfYnSkzW5VG4/r75RO8ZkSSIyFrlH0uXh+0s0w5ElUUZ1g9I3TYRceTV+ZdsnWvTAwxq/LppQ==} 546 | dependencies: 547 | '@lancejpollard/quadratic-residue-prng.js': 1.0.0 548 | dev: false 549 | 550 | /@lancejpollard/quadratic-residue-prng.js@1.0.0: 551 | resolution: {integrity: sha512-njr7owTIRuTAncZeO5yZWZ2mBuSXZu0wqFqZsJm5gGcUKL+p+lyjOel+dKG3rouB0q//Nw1uYLa8foM89bnehQ==} 552 | dev: false 553 | 554 | /@nodelib/fs.scandir@2.1.5: 555 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 556 | engines: {node: '>= 8'} 557 | dependencies: 558 | '@nodelib/fs.stat': 2.0.5 559 | run-parallel: 1.2.0 560 | dev: true 561 | 562 | /@nodelib/fs.stat@2.0.5: 563 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 564 | engines: {node: '>= 8'} 565 | dev: true 566 | 567 | /@nodelib/fs.walk@1.2.8: 568 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 569 | engines: {node: '>= 8'} 570 | dependencies: 571 | '@nodelib/fs.scandir': 2.1.5 572 | fastq: 1.15.0 573 | dev: true 574 | 575 | /@termsurf/have@0.2.0: 576 | resolution: {integrity: sha512-ZopW9vLIKzMhvNkEw0rY0gZpmlKKgqsER82VvCbQqCZxckVlIBDsWid7vfdSVN3ZuOKn9H4mKnpAcx8ndnENkg==} 577 | dependencies: 578 | '@termsurf/kink': 0.1.2 579 | '@termsurf/kink-text': 0.0.1 580 | lodash: 4.17.21 581 | dev: false 582 | 583 | /@termsurf/kink-text@0.0.1: 584 | resolution: {integrity: sha512-h9Klew4UhXTc85q8N+Q/yg+U6m8yavTg2fImhZ3hrQJyMSdKxGnVgml0GKPzNCsgQzMg7GJ2tA/gARLuxDSpaw==} 585 | dependencies: 586 | '@cspotcode/source-map': 0.8.0 587 | '@termsurf/kink': 0.1.2 588 | '@termsurf/tint-text': 0.0.3 589 | dev: false 590 | 591 | /@termsurf/kink@0.1.2: 592 | resolution: {integrity: sha512-8mnZrai6q48jc7CbfNM1kQz/5aVKtwHarCnz30KJjecIlgsWpU7gL5L5Xh5ZIrlIvY8m+cO+vuxoljn9CGyBFA==} 593 | dependencies: 594 | ts-custom-error: 3.3.1 595 | dev: false 596 | 597 | /@termsurf/tint-text@0.0.3: 598 | resolution: {integrity: sha512-7UKCfcACkjD3URTTMhy91YRmq2oCNZk7YwUx0KakqXS1L2fI7Fsh+kMSjpPzIEgDPvXo5gX4LOBuHjBpBOLdMg==} 599 | dependencies: 600 | chalk: 5.3.0 601 | dev: false 602 | 603 | /@trivago/prettier-plugin-sort-imports@4.3.0(prettier@2.8.8): 604 | resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} 605 | peerDependencies: 606 | '@vue/compiler-sfc': 3.x 607 | prettier: 2.x - 3.x 608 | peerDependenciesMeta: 609 | '@vue/compiler-sfc': 610 | optional: true 611 | dependencies: 612 | '@babel/generator': 7.17.7 613 | '@babel/parser': 7.23.6 614 | '@babel/traverse': 7.23.2 615 | '@babel/types': 7.17.0 616 | javascript-natural-sort: 0.7.1 617 | lodash: 4.17.21 618 | prettier: 2.8.8 619 | transitivePeerDependencies: 620 | - supports-color 621 | dev: true 622 | 623 | /@tsconfig/node10@1.0.9: 624 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 625 | dev: true 626 | 627 | /@tsconfig/node12@1.0.11: 628 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 629 | dev: true 630 | 631 | /@tsconfig/node14@1.0.3: 632 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 633 | dev: true 634 | 635 | /@tsconfig/node16@1.0.4: 636 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 637 | dev: true 638 | 639 | /@types/eslint@8.44.9: 640 | resolution: {integrity: sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==} 641 | dependencies: 642 | '@types/estree': 1.0.5 643 | '@types/json-schema': 7.0.15 644 | dev: true 645 | 646 | /@types/estree@1.0.5: 647 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 648 | dev: true 649 | 650 | /@types/json-schema@7.0.15: 651 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 652 | dev: true 653 | 654 | /@types/json5@0.0.29: 655 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 656 | dev: true 657 | 658 | /@types/lodash@4.14.202: 659 | resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} 660 | dev: true 661 | 662 | /@types/node@18.19.3: 663 | resolution: {integrity: sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==} 664 | dependencies: 665 | undici-types: 5.26.5 666 | dev: true 667 | 668 | /@types/prettier@2.7.3: 669 | resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} 670 | dev: true 671 | 672 | /@types/semver@7.5.6: 673 | resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} 674 | dev: true 675 | 676 | /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@4.9.5): 677 | resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} 678 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 679 | peerDependencies: 680 | '@typescript-eslint/parser': ^5.0.0 681 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 682 | typescript: '*' 683 | peerDependenciesMeta: 684 | typescript: 685 | optional: true 686 | dependencies: 687 | '@eslint-community/regexpp': 4.10.0 688 | '@typescript-eslint/parser': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 689 | '@typescript-eslint/scope-manager': 5.62.0 690 | '@typescript-eslint/type-utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 691 | '@typescript-eslint/utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 692 | debug: 4.3.4 693 | eslint: 8.55.0 694 | graphemer: 1.4.0 695 | ignore: 5.3.0 696 | natural-compare-lite: 1.4.0 697 | semver: 7.5.4 698 | tsutils: 3.21.0(typescript@4.9.5) 699 | typescript: 4.9.5 700 | transitivePeerDependencies: 701 | - supports-color 702 | dev: true 703 | 704 | /@typescript-eslint/parser@5.62.0(eslint@8.55.0)(typescript@4.9.5): 705 | resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} 706 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 707 | peerDependencies: 708 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 709 | typescript: '*' 710 | peerDependenciesMeta: 711 | typescript: 712 | optional: true 713 | dependencies: 714 | '@typescript-eslint/scope-manager': 5.62.0 715 | '@typescript-eslint/types': 5.62.0 716 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) 717 | debug: 4.3.4 718 | eslint: 8.55.0 719 | typescript: 4.9.5 720 | transitivePeerDependencies: 721 | - supports-color 722 | dev: true 723 | 724 | /@typescript-eslint/scope-manager@5.62.0: 725 | resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} 726 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 727 | dependencies: 728 | '@typescript-eslint/types': 5.62.0 729 | '@typescript-eslint/visitor-keys': 5.62.0 730 | dev: true 731 | 732 | /@typescript-eslint/type-utils@5.62.0(eslint@8.55.0)(typescript@4.9.5): 733 | resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} 734 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 735 | peerDependencies: 736 | eslint: '*' 737 | typescript: '*' 738 | peerDependenciesMeta: 739 | typescript: 740 | optional: true 741 | dependencies: 742 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) 743 | '@typescript-eslint/utils': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 744 | debug: 4.3.4 745 | eslint: 8.55.0 746 | tsutils: 3.21.0(typescript@4.9.5) 747 | typescript: 4.9.5 748 | transitivePeerDependencies: 749 | - supports-color 750 | dev: true 751 | 752 | /@typescript-eslint/types@5.62.0: 753 | resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} 754 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 755 | dev: true 756 | 757 | /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): 758 | resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} 759 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 760 | peerDependencies: 761 | typescript: '*' 762 | peerDependenciesMeta: 763 | typescript: 764 | optional: true 765 | dependencies: 766 | '@typescript-eslint/types': 5.62.0 767 | '@typescript-eslint/visitor-keys': 5.62.0 768 | debug: 4.3.4 769 | globby: 11.1.0 770 | is-glob: 4.0.3 771 | semver: 7.5.4 772 | tsutils: 3.21.0(typescript@4.9.5) 773 | typescript: 4.9.5 774 | transitivePeerDependencies: 775 | - supports-color 776 | dev: true 777 | 778 | /@typescript-eslint/utils@5.62.0(eslint@8.55.0)(typescript@4.9.5): 779 | resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} 780 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 781 | peerDependencies: 782 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 783 | dependencies: 784 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) 785 | '@types/json-schema': 7.0.15 786 | '@types/semver': 7.5.6 787 | '@typescript-eslint/scope-manager': 5.62.0 788 | '@typescript-eslint/types': 5.62.0 789 | '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) 790 | eslint: 8.55.0 791 | eslint-scope: 5.1.1 792 | semver: 7.5.4 793 | transitivePeerDependencies: 794 | - supports-color 795 | - typescript 796 | dev: true 797 | 798 | /@typescript-eslint/visitor-keys@5.62.0: 799 | resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} 800 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 801 | dependencies: 802 | '@typescript-eslint/types': 5.62.0 803 | eslint-visitor-keys: 3.4.3 804 | dev: true 805 | 806 | /@ungap/structured-clone@1.2.0: 807 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 808 | dev: true 809 | 810 | /acorn-jsx@5.3.2(acorn@8.11.2): 811 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 812 | peerDependencies: 813 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 814 | dependencies: 815 | acorn: 8.11.2 816 | dev: true 817 | 818 | /acorn-walk@8.3.1: 819 | resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} 820 | engines: {node: '>=0.4.0'} 821 | dev: true 822 | 823 | /acorn@8.11.2: 824 | resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 825 | engines: {node: '>=0.4.0'} 826 | hasBin: true 827 | dev: true 828 | 829 | /ajv@6.12.6: 830 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 831 | dependencies: 832 | fast-deep-equal: 3.1.3 833 | fast-json-stable-stringify: 2.1.0 834 | json-schema-traverse: 0.4.1 835 | uri-js: 4.4.1 836 | dev: true 837 | 838 | /ansi-regex@5.0.1: 839 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 840 | engines: {node: '>=8'} 841 | dev: true 842 | 843 | /ansi-regex@6.0.1: 844 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 845 | engines: {node: '>=12'} 846 | dev: true 847 | 848 | /ansi-styles@3.2.1: 849 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 850 | engines: {node: '>=4'} 851 | dependencies: 852 | color-convert: 1.9.3 853 | dev: true 854 | 855 | /ansi-styles@4.3.0: 856 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 857 | engines: {node: '>=8'} 858 | dependencies: 859 | color-convert: 2.0.1 860 | dev: true 861 | 862 | /anymatch@3.1.3: 863 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 864 | engines: {node: '>= 8'} 865 | dependencies: 866 | normalize-path: 3.0.0 867 | picomatch: 2.3.1 868 | dev: true 869 | 870 | /arg@4.1.3: 871 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 872 | dev: true 873 | 874 | /argparse@2.0.1: 875 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 876 | dev: true 877 | 878 | /array-buffer-byte-length@1.0.0: 879 | resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} 880 | dependencies: 881 | call-bind: 1.0.5 882 | is-array-buffer: 3.0.2 883 | dev: true 884 | 885 | /array-includes@3.1.7: 886 | resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} 887 | engines: {node: '>= 0.4'} 888 | dependencies: 889 | call-bind: 1.0.5 890 | define-properties: 1.2.1 891 | es-abstract: 1.22.3 892 | get-intrinsic: 1.2.2 893 | is-string: 1.0.7 894 | dev: true 895 | 896 | /array-union@2.1.0: 897 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 898 | engines: {node: '>=8'} 899 | dev: true 900 | 901 | /array.prototype.findlastindex@1.2.3: 902 | resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} 903 | engines: {node: '>= 0.4'} 904 | dependencies: 905 | call-bind: 1.0.5 906 | define-properties: 1.2.1 907 | es-abstract: 1.22.3 908 | es-shim-unscopables: 1.0.2 909 | get-intrinsic: 1.2.2 910 | dev: true 911 | 912 | /array.prototype.flat@1.3.2: 913 | resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 914 | engines: {node: '>= 0.4'} 915 | dependencies: 916 | call-bind: 1.0.5 917 | define-properties: 1.2.1 918 | es-abstract: 1.22.3 919 | es-shim-unscopables: 1.0.2 920 | dev: true 921 | 922 | /array.prototype.flatmap@1.3.2: 923 | resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} 924 | engines: {node: '>= 0.4'} 925 | dependencies: 926 | call-bind: 1.0.5 927 | define-properties: 1.2.1 928 | es-abstract: 1.22.3 929 | es-shim-unscopables: 1.0.2 930 | dev: true 931 | 932 | /arraybuffer.prototype.slice@1.0.2: 933 | resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} 934 | engines: {node: '>= 0.4'} 935 | dependencies: 936 | array-buffer-byte-length: 1.0.0 937 | call-bind: 1.0.5 938 | define-properties: 1.2.1 939 | es-abstract: 1.22.3 940 | get-intrinsic: 1.2.2 941 | is-array-buffer: 3.0.2 942 | is-shared-array-buffer: 1.0.2 943 | dev: true 944 | 945 | /available-typed-arrays@1.0.5: 946 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 947 | engines: {node: '>= 0.4'} 948 | dev: true 949 | 950 | /balanced-match@1.0.2: 951 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 952 | dev: true 953 | 954 | /binary-extensions@2.2.0: 955 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 956 | engines: {node: '>=8'} 957 | dev: true 958 | 959 | /brace-expansion@1.1.11: 960 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 961 | dependencies: 962 | balanced-match: 1.0.2 963 | concat-map: 0.0.1 964 | dev: true 965 | 966 | /braces@3.0.2: 967 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 968 | engines: {node: '>=8'} 969 | dependencies: 970 | fill-range: 7.0.1 971 | dev: true 972 | 973 | /browser-or-node@2.1.1: 974 | resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} 975 | dev: false 976 | 977 | /buffer-from@1.1.2: 978 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 979 | dev: true 980 | 981 | /builtins@5.0.1: 982 | resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} 983 | dependencies: 984 | semver: 7.5.4 985 | dev: true 986 | 987 | /call-bind@1.0.5: 988 | resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 989 | dependencies: 990 | function-bind: 1.1.2 991 | get-intrinsic: 1.2.2 992 | set-function-length: 1.1.1 993 | dev: true 994 | 995 | /callsites@3.1.0: 996 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 997 | engines: {node: '>=6'} 998 | dev: true 999 | 1000 | /chalk@2.4.2: 1001 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1002 | engines: {node: '>=4'} 1003 | dependencies: 1004 | ansi-styles: 3.2.1 1005 | escape-string-regexp: 1.0.5 1006 | supports-color: 5.5.0 1007 | dev: true 1008 | 1009 | /chalk@4.1.2: 1010 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1011 | engines: {node: '>=10'} 1012 | dependencies: 1013 | ansi-styles: 4.3.0 1014 | supports-color: 7.2.0 1015 | dev: true 1016 | 1017 | /chalk@5.3.0: 1018 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} 1019 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1020 | dev: false 1021 | 1022 | /chokidar@3.5.3: 1023 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1024 | engines: {node: '>= 8.10.0'} 1025 | dependencies: 1026 | anymatch: 3.1.3 1027 | braces: 3.0.2 1028 | glob-parent: 5.1.2 1029 | is-binary-path: 2.1.0 1030 | is-glob: 4.0.3 1031 | normalize-path: 3.0.0 1032 | readdirp: 3.6.0 1033 | optionalDependencies: 1034 | fsevents: 2.3.3 1035 | dev: true 1036 | 1037 | /cliui@8.0.1: 1038 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1039 | engines: {node: '>=12'} 1040 | dependencies: 1041 | string-width: 4.2.3 1042 | strip-ansi: 6.0.1 1043 | wrap-ansi: 7.0.0 1044 | dev: true 1045 | 1046 | /color-convert@1.9.3: 1047 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1048 | dependencies: 1049 | color-name: 1.1.3 1050 | dev: true 1051 | 1052 | /color-convert@2.0.1: 1053 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1054 | engines: {node: '>=7.0.0'} 1055 | dependencies: 1056 | color-name: 1.1.4 1057 | dev: true 1058 | 1059 | /color-name@1.1.3: 1060 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1061 | dev: true 1062 | 1063 | /color-name@1.1.4: 1064 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1065 | dev: true 1066 | 1067 | /commander@9.5.0: 1068 | resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} 1069 | engines: {node: ^12.20.0 || >=14} 1070 | dev: true 1071 | 1072 | /concat-map@0.0.1: 1073 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1074 | dev: true 1075 | 1076 | /concurrently@7.6.0: 1077 | resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} 1078 | engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} 1079 | hasBin: true 1080 | dependencies: 1081 | chalk: 4.1.2 1082 | date-fns: 2.30.0 1083 | lodash: 4.17.21 1084 | rxjs: 7.8.1 1085 | shell-quote: 1.8.1 1086 | spawn-command: 0.0.2-1 1087 | supports-color: 8.1.1 1088 | tree-kill: 1.2.2 1089 | yargs: 17.7.2 1090 | dev: true 1091 | 1092 | /create-require@1.1.1: 1093 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 1094 | dev: true 1095 | 1096 | /cross-spawn@7.0.3: 1097 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1098 | engines: {node: '>= 8'} 1099 | dependencies: 1100 | path-key: 3.1.1 1101 | shebang-command: 2.0.0 1102 | which: 2.0.2 1103 | dev: true 1104 | 1105 | /date-fns@2.30.0: 1106 | resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} 1107 | engines: {node: '>=0.11'} 1108 | dependencies: 1109 | '@babel/runtime': 7.23.6 1110 | dev: true 1111 | 1112 | /debug@3.2.7: 1113 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 1114 | peerDependencies: 1115 | supports-color: '*' 1116 | peerDependenciesMeta: 1117 | supports-color: 1118 | optional: true 1119 | dependencies: 1120 | ms: 2.1.3 1121 | dev: true 1122 | 1123 | /debug@4.3.4: 1124 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1125 | engines: {node: '>=6.0'} 1126 | peerDependencies: 1127 | supports-color: '*' 1128 | peerDependenciesMeta: 1129 | supports-color: 1130 | optional: true 1131 | dependencies: 1132 | ms: 2.1.2 1133 | dev: true 1134 | 1135 | /deep-is@0.1.4: 1136 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1137 | dev: true 1138 | 1139 | /define-data-property@1.1.1: 1140 | resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 1141 | engines: {node: '>= 0.4'} 1142 | dependencies: 1143 | get-intrinsic: 1.2.2 1144 | gopd: 1.0.1 1145 | has-property-descriptors: 1.0.1 1146 | dev: true 1147 | 1148 | /define-properties@1.2.1: 1149 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 1150 | engines: {node: '>= 0.4'} 1151 | dependencies: 1152 | define-data-property: 1.1.1 1153 | has-property-descriptors: 1.0.1 1154 | object-keys: 1.1.1 1155 | dev: true 1156 | 1157 | /diff@4.0.2: 1158 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 1159 | engines: {node: '>=0.3.1'} 1160 | dev: true 1161 | 1162 | /dir-glob@3.0.1: 1163 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1164 | engines: {node: '>=8'} 1165 | dependencies: 1166 | path-type: 4.0.0 1167 | dev: true 1168 | 1169 | /doctrine@2.1.0: 1170 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 1171 | engines: {node: '>=0.10.0'} 1172 | dependencies: 1173 | esutils: 2.0.3 1174 | dev: true 1175 | 1176 | /doctrine@3.0.0: 1177 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1178 | engines: {node: '>=6.0.0'} 1179 | dependencies: 1180 | esutils: 2.0.3 1181 | dev: true 1182 | 1183 | /emoji-regex@8.0.0: 1184 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1185 | dev: true 1186 | 1187 | /enhanced-resolve@5.15.0: 1188 | resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} 1189 | engines: {node: '>=10.13.0'} 1190 | dependencies: 1191 | graceful-fs: 4.2.11 1192 | tapable: 2.2.1 1193 | dev: true 1194 | 1195 | /es-abstract@1.22.3: 1196 | resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} 1197 | engines: {node: '>= 0.4'} 1198 | dependencies: 1199 | array-buffer-byte-length: 1.0.0 1200 | arraybuffer.prototype.slice: 1.0.2 1201 | available-typed-arrays: 1.0.5 1202 | call-bind: 1.0.5 1203 | es-set-tostringtag: 2.0.2 1204 | es-to-primitive: 1.2.1 1205 | function.prototype.name: 1.1.6 1206 | get-intrinsic: 1.2.2 1207 | get-symbol-description: 1.0.0 1208 | globalthis: 1.0.3 1209 | gopd: 1.0.1 1210 | has-property-descriptors: 1.0.1 1211 | has-proto: 1.0.1 1212 | has-symbols: 1.0.3 1213 | hasown: 2.0.0 1214 | internal-slot: 1.0.6 1215 | is-array-buffer: 3.0.2 1216 | is-callable: 1.2.7 1217 | is-negative-zero: 2.0.2 1218 | is-regex: 1.1.4 1219 | is-shared-array-buffer: 1.0.2 1220 | is-string: 1.0.7 1221 | is-typed-array: 1.1.12 1222 | is-weakref: 1.0.2 1223 | object-inspect: 1.13.1 1224 | object-keys: 1.1.1 1225 | object.assign: 4.1.5 1226 | regexp.prototype.flags: 1.5.1 1227 | safe-array-concat: 1.0.1 1228 | safe-regex-test: 1.0.0 1229 | string.prototype.trim: 1.2.8 1230 | string.prototype.trimend: 1.0.7 1231 | string.prototype.trimstart: 1.0.7 1232 | typed-array-buffer: 1.0.0 1233 | typed-array-byte-length: 1.0.0 1234 | typed-array-byte-offset: 1.0.0 1235 | typed-array-length: 1.0.4 1236 | unbox-primitive: 1.0.2 1237 | which-typed-array: 1.1.13 1238 | dev: true 1239 | 1240 | /es-set-tostringtag@2.0.2: 1241 | resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} 1242 | engines: {node: '>= 0.4'} 1243 | dependencies: 1244 | get-intrinsic: 1.2.2 1245 | has-tostringtag: 1.0.0 1246 | hasown: 2.0.0 1247 | dev: true 1248 | 1249 | /es-shim-unscopables@1.0.2: 1250 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 1251 | dependencies: 1252 | hasown: 2.0.0 1253 | dev: true 1254 | 1255 | /es-to-primitive@1.2.1: 1256 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 1257 | engines: {node: '>= 0.4'} 1258 | dependencies: 1259 | is-callable: 1.2.7 1260 | is-date-object: 1.0.5 1261 | is-symbol: 1.0.4 1262 | dev: true 1263 | 1264 | /esbuild@0.18.20: 1265 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1266 | engines: {node: '>=12'} 1267 | hasBin: true 1268 | requiresBuild: true 1269 | optionalDependencies: 1270 | '@esbuild/android-arm': 0.18.20 1271 | '@esbuild/android-arm64': 0.18.20 1272 | '@esbuild/android-x64': 0.18.20 1273 | '@esbuild/darwin-arm64': 0.18.20 1274 | '@esbuild/darwin-x64': 0.18.20 1275 | '@esbuild/freebsd-arm64': 0.18.20 1276 | '@esbuild/freebsd-x64': 0.18.20 1277 | '@esbuild/linux-arm': 0.18.20 1278 | '@esbuild/linux-arm64': 0.18.20 1279 | '@esbuild/linux-ia32': 0.18.20 1280 | '@esbuild/linux-loong64': 0.18.20 1281 | '@esbuild/linux-mips64el': 0.18.20 1282 | '@esbuild/linux-ppc64': 0.18.20 1283 | '@esbuild/linux-riscv64': 0.18.20 1284 | '@esbuild/linux-s390x': 0.18.20 1285 | '@esbuild/linux-x64': 0.18.20 1286 | '@esbuild/netbsd-x64': 0.18.20 1287 | '@esbuild/openbsd-x64': 0.18.20 1288 | '@esbuild/sunos-x64': 0.18.20 1289 | '@esbuild/win32-arm64': 0.18.20 1290 | '@esbuild/win32-ia32': 0.18.20 1291 | '@esbuild/win32-x64': 0.18.20 1292 | dev: true 1293 | 1294 | /escalade@3.1.1: 1295 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1296 | engines: {node: '>=6'} 1297 | dev: true 1298 | 1299 | /escape-string-regexp@1.0.5: 1300 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1301 | engines: {node: '>=0.8.0'} 1302 | dev: true 1303 | 1304 | /escape-string-regexp@4.0.0: 1305 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1306 | engines: {node: '>=10'} 1307 | dev: true 1308 | 1309 | /eslint-config-prettier@8.10.0(eslint@8.55.0): 1310 | resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} 1311 | hasBin: true 1312 | peerDependencies: 1313 | eslint: '>=7.0.0' 1314 | dependencies: 1315 | eslint: 8.55.0 1316 | dev: true 1317 | 1318 | /eslint-config-standard-with-typescript@24.0.0(@typescript-eslint/eslint-plugin@5.62.0)(eslint-plugin-import@2.29.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.55.0)(typescript@4.9.5): 1319 | resolution: {integrity: sha512-vEnGXZ5aiR1enl9652iIP4nTpY3GPcNEwuhrsPbKO3Ce3D6T3yCqZdkUPk8nJetfdL/yO0DLsHg2d/l9iECIdg==} 1320 | peerDependencies: 1321 | '@typescript-eslint/eslint-plugin': ^5.0.0 1322 | eslint: ^8.0.1 1323 | eslint-plugin-import: ^2.25.2 1324 | eslint-plugin-n: ^15.0.0 1325 | eslint-plugin-promise: ^6.0.0 1326 | typescript: '*' 1327 | dependencies: 1328 | '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.55.0)(typescript@4.9.5) 1329 | '@typescript-eslint/parser': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 1330 | eslint: 8.55.0 1331 | eslint-config-standard: 17.0.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.55.0) 1332 | eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0) 1333 | eslint-plugin-n: 15.7.0(eslint@8.55.0) 1334 | eslint-plugin-promise: 6.1.1(eslint@8.55.0) 1335 | typescript: 4.9.5 1336 | transitivePeerDependencies: 1337 | - supports-color 1338 | dev: true 1339 | 1340 | /eslint-config-standard@17.0.0(eslint-plugin-import@2.29.0)(eslint-plugin-n@15.7.0)(eslint-plugin-promise@6.1.1)(eslint@8.55.0): 1341 | resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} 1342 | peerDependencies: 1343 | eslint: ^8.0.1 1344 | eslint-plugin-import: ^2.25.2 1345 | eslint-plugin-n: ^15.0.0 1346 | eslint-plugin-promise: ^6.0.0 1347 | dependencies: 1348 | eslint: 8.55.0 1349 | eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0) 1350 | eslint-plugin-n: 15.7.0(eslint@8.55.0) 1351 | eslint-plugin-promise: 6.1.1(eslint@8.55.0) 1352 | dev: true 1353 | 1354 | /eslint-import-resolver-node@0.3.9: 1355 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 1356 | dependencies: 1357 | debug: 3.2.7 1358 | is-core-module: 2.13.1 1359 | resolve: 1.22.8 1360 | transitivePeerDependencies: 1361 | - supports-color 1362 | dev: true 1363 | 1364 | /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.55.0): 1365 | resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} 1366 | engines: {node: ^14.18.0 || >=16.0.0} 1367 | peerDependencies: 1368 | eslint: '*' 1369 | eslint-plugin-import: '*' 1370 | dependencies: 1371 | debug: 4.3.4 1372 | enhanced-resolve: 5.15.0 1373 | eslint: 8.55.0 1374 | eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0) 1375 | eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0) 1376 | fast-glob: 3.3.2 1377 | get-tsconfig: 4.7.2 1378 | is-core-module: 2.13.1 1379 | is-glob: 4.0.3 1380 | transitivePeerDependencies: 1381 | - '@typescript-eslint/parser' 1382 | - eslint-import-resolver-node 1383 | - eslint-import-resolver-webpack 1384 | - supports-color 1385 | dev: true 1386 | 1387 | /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0): 1388 | resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} 1389 | engines: {node: '>=4'} 1390 | peerDependencies: 1391 | '@typescript-eslint/parser': '*' 1392 | eslint: '*' 1393 | eslint-import-resolver-node: '*' 1394 | eslint-import-resolver-typescript: '*' 1395 | eslint-import-resolver-webpack: '*' 1396 | peerDependenciesMeta: 1397 | '@typescript-eslint/parser': 1398 | optional: true 1399 | eslint: 1400 | optional: true 1401 | eslint-import-resolver-node: 1402 | optional: true 1403 | eslint-import-resolver-typescript: 1404 | optional: true 1405 | eslint-import-resolver-webpack: 1406 | optional: true 1407 | dependencies: 1408 | '@typescript-eslint/parser': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 1409 | debug: 3.2.7 1410 | eslint: 8.55.0 1411 | eslint-import-resolver-node: 0.3.9 1412 | eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.55.0) 1413 | transitivePeerDependencies: 1414 | - supports-color 1415 | dev: true 1416 | 1417 | /eslint-plugin-es@4.1.0(eslint@8.55.0): 1418 | resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} 1419 | engines: {node: '>=8.10.0'} 1420 | peerDependencies: 1421 | eslint: '>=4.19.1' 1422 | dependencies: 1423 | eslint: 8.55.0 1424 | eslint-utils: 2.1.0 1425 | regexpp: 3.2.0 1426 | dev: true 1427 | 1428 | /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0): 1429 | resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} 1430 | engines: {node: '>=4'} 1431 | peerDependencies: 1432 | '@typescript-eslint/parser': '*' 1433 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 1434 | peerDependenciesMeta: 1435 | '@typescript-eslint/parser': 1436 | optional: true 1437 | dependencies: 1438 | '@typescript-eslint/parser': 5.62.0(eslint@8.55.0)(typescript@4.9.5) 1439 | array-includes: 3.1.7 1440 | array.prototype.findlastindex: 1.2.3 1441 | array.prototype.flat: 1.3.2 1442 | array.prototype.flatmap: 1.3.2 1443 | debug: 3.2.7 1444 | doctrine: 2.1.0 1445 | eslint: 8.55.0 1446 | eslint-import-resolver-node: 0.3.9 1447 | eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.55.0) 1448 | hasown: 2.0.0 1449 | is-core-module: 2.13.1 1450 | is-glob: 4.0.3 1451 | minimatch: 3.1.2 1452 | object.fromentries: 2.0.7 1453 | object.groupby: 1.0.1 1454 | object.values: 1.1.7 1455 | semver: 6.3.1 1456 | tsconfig-paths: 3.14.2 1457 | transitivePeerDependencies: 1458 | - eslint-import-resolver-typescript 1459 | - eslint-import-resolver-webpack 1460 | - supports-color 1461 | dev: true 1462 | 1463 | /eslint-plugin-n@15.7.0(eslint@8.55.0): 1464 | resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} 1465 | engines: {node: '>=12.22.0'} 1466 | peerDependencies: 1467 | eslint: '>=7.0.0' 1468 | dependencies: 1469 | builtins: 5.0.1 1470 | eslint: 8.55.0 1471 | eslint-plugin-es: 4.1.0(eslint@8.55.0) 1472 | eslint-utils: 3.0.0(eslint@8.55.0) 1473 | ignore: 5.3.0 1474 | is-core-module: 2.13.1 1475 | minimatch: 3.1.2 1476 | resolve: 1.22.8 1477 | semver: 7.5.4 1478 | dev: true 1479 | 1480 | /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.55.0)(prettier@2.8.8): 1481 | resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} 1482 | engines: {node: '>=12.0.0'} 1483 | peerDependencies: 1484 | eslint: '>=7.28.0' 1485 | eslint-config-prettier: '*' 1486 | prettier: '>=2.0.0' 1487 | peerDependenciesMeta: 1488 | eslint-config-prettier: 1489 | optional: true 1490 | dependencies: 1491 | eslint: 8.55.0 1492 | eslint-config-prettier: 8.10.0(eslint@8.55.0) 1493 | prettier: 2.8.8 1494 | prettier-linter-helpers: 1.0.0 1495 | dev: true 1496 | 1497 | /eslint-plugin-promise@6.1.1(eslint@8.55.0): 1498 | resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} 1499 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1500 | peerDependencies: 1501 | eslint: ^7.0.0 || ^8.0.0 1502 | dependencies: 1503 | eslint: 8.55.0 1504 | dev: true 1505 | 1506 | /eslint-plugin-simple-import-sort@8.0.0(eslint@8.55.0): 1507 | resolution: {integrity: sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==} 1508 | peerDependencies: 1509 | eslint: '>=5.0.0' 1510 | dependencies: 1511 | eslint: 8.55.0 1512 | dev: true 1513 | 1514 | /eslint-plugin-sort-exports@0.8.0(eslint@8.55.0): 1515 | resolution: {integrity: sha512-5x7kJNjIS5bSyehFJ6Gk2gh2wUPt/rmhwDHF8JPDicSH7bvrLRFdlkhHu74YqYBjEySHYaOZVoKNP90TjI0v6w==} 1516 | peerDependencies: 1517 | eslint: '>=5.0.0' 1518 | dependencies: 1519 | eslint: 8.55.0 1520 | dev: true 1521 | 1522 | /eslint-scope@5.1.1: 1523 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1524 | engines: {node: '>=8.0.0'} 1525 | dependencies: 1526 | esrecurse: 4.3.0 1527 | estraverse: 4.3.0 1528 | dev: true 1529 | 1530 | /eslint-scope@7.2.2: 1531 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1532 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1533 | dependencies: 1534 | esrecurse: 4.3.0 1535 | estraverse: 5.3.0 1536 | dev: true 1537 | 1538 | /eslint-utils@2.1.0: 1539 | resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} 1540 | engines: {node: '>=6'} 1541 | dependencies: 1542 | eslint-visitor-keys: 1.3.0 1543 | dev: true 1544 | 1545 | /eslint-utils@3.0.0(eslint@8.55.0): 1546 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1547 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1548 | peerDependencies: 1549 | eslint: '>=5' 1550 | dependencies: 1551 | eslint: 8.55.0 1552 | eslint-visitor-keys: 2.1.0 1553 | dev: true 1554 | 1555 | /eslint-visitor-keys@1.3.0: 1556 | resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} 1557 | engines: {node: '>=4'} 1558 | dev: true 1559 | 1560 | /eslint-visitor-keys@2.1.0: 1561 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1562 | engines: {node: '>=10'} 1563 | dev: true 1564 | 1565 | /eslint-visitor-keys@3.4.3: 1566 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1567 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1568 | dev: true 1569 | 1570 | /eslint@8.55.0: 1571 | resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} 1572 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1573 | hasBin: true 1574 | dependencies: 1575 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) 1576 | '@eslint-community/regexpp': 4.10.0 1577 | '@eslint/eslintrc': 2.1.4 1578 | '@eslint/js': 8.55.0 1579 | '@humanwhocodes/config-array': 0.11.13 1580 | '@humanwhocodes/module-importer': 1.0.1 1581 | '@nodelib/fs.walk': 1.2.8 1582 | '@ungap/structured-clone': 1.2.0 1583 | ajv: 6.12.6 1584 | chalk: 4.1.2 1585 | cross-spawn: 7.0.3 1586 | debug: 4.3.4 1587 | doctrine: 3.0.0 1588 | escape-string-regexp: 4.0.0 1589 | eslint-scope: 7.2.2 1590 | eslint-visitor-keys: 3.4.3 1591 | espree: 9.6.1 1592 | esquery: 1.5.0 1593 | esutils: 2.0.3 1594 | fast-deep-equal: 3.1.3 1595 | file-entry-cache: 6.0.1 1596 | find-up: 5.0.0 1597 | glob-parent: 6.0.2 1598 | globals: 13.24.0 1599 | graphemer: 1.4.0 1600 | ignore: 5.3.0 1601 | imurmurhash: 0.1.4 1602 | is-glob: 4.0.3 1603 | is-path-inside: 3.0.3 1604 | js-yaml: 4.1.0 1605 | json-stable-stringify-without-jsonify: 1.0.1 1606 | levn: 0.4.1 1607 | lodash.merge: 4.6.2 1608 | minimatch: 3.1.2 1609 | natural-compare: 1.4.0 1610 | optionator: 0.9.3 1611 | strip-ansi: 6.0.1 1612 | text-table: 0.2.0 1613 | transitivePeerDependencies: 1614 | - supports-color 1615 | dev: true 1616 | 1617 | /espree@9.6.1: 1618 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1619 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1620 | dependencies: 1621 | acorn: 8.11.2 1622 | acorn-jsx: 5.3.2(acorn@8.11.2) 1623 | eslint-visitor-keys: 3.4.3 1624 | dev: true 1625 | 1626 | /esquery@1.5.0: 1627 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1628 | engines: {node: '>=0.10'} 1629 | dependencies: 1630 | estraverse: 5.3.0 1631 | dev: true 1632 | 1633 | /esrecurse@4.3.0: 1634 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1635 | engines: {node: '>=4.0'} 1636 | dependencies: 1637 | estraverse: 5.3.0 1638 | dev: true 1639 | 1640 | /estraverse@4.3.0: 1641 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1642 | engines: {node: '>=4.0'} 1643 | dev: true 1644 | 1645 | /estraverse@5.3.0: 1646 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1647 | engines: {node: '>=4.0'} 1648 | dev: true 1649 | 1650 | /esutils@2.0.3: 1651 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1652 | engines: {node: '>=0.10.0'} 1653 | dev: true 1654 | 1655 | /fast-deep-equal@3.1.3: 1656 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1657 | dev: true 1658 | 1659 | /fast-diff@1.3.0: 1660 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 1661 | dev: true 1662 | 1663 | /fast-glob@3.3.2: 1664 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1665 | engines: {node: '>=8.6.0'} 1666 | dependencies: 1667 | '@nodelib/fs.stat': 2.0.5 1668 | '@nodelib/fs.walk': 1.2.8 1669 | glob-parent: 5.1.2 1670 | merge2: 1.4.1 1671 | micromatch: 4.0.5 1672 | dev: true 1673 | 1674 | /fast-json-stable-stringify@2.1.0: 1675 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1676 | dev: true 1677 | 1678 | /fast-levenshtein@2.0.6: 1679 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1680 | dev: true 1681 | 1682 | /fastq@1.15.0: 1683 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1684 | dependencies: 1685 | reusify: 1.0.4 1686 | dev: true 1687 | 1688 | /file-entry-cache@6.0.1: 1689 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1690 | engines: {node: ^10.12.0 || >=12.0.0} 1691 | dependencies: 1692 | flat-cache: 3.2.0 1693 | dev: true 1694 | 1695 | /fill-range@7.0.1: 1696 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1697 | engines: {node: '>=8'} 1698 | dependencies: 1699 | to-regex-range: 5.0.1 1700 | dev: true 1701 | 1702 | /find-up@5.0.0: 1703 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1704 | engines: {node: '>=10'} 1705 | dependencies: 1706 | locate-path: 6.0.0 1707 | path-exists: 4.0.0 1708 | dev: true 1709 | 1710 | /flat-cache@3.2.0: 1711 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1712 | engines: {node: ^10.12.0 || >=12.0.0} 1713 | dependencies: 1714 | flatted: 3.2.9 1715 | keyv: 4.5.4 1716 | rimraf: 3.0.2 1717 | dev: true 1718 | 1719 | /flatted@3.2.9: 1720 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 1721 | dev: true 1722 | 1723 | /for-each@0.3.3: 1724 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1725 | dependencies: 1726 | is-callable: 1.2.7 1727 | dev: true 1728 | 1729 | /fs.realpath@1.0.0: 1730 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1731 | dev: true 1732 | 1733 | /fsevents@2.3.3: 1734 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1735 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1736 | os: [darwin] 1737 | requiresBuild: true 1738 | dev: true 1739 | optional: true 1740 | 1741 | /function-bind@1.1.2: 1742 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1743 | dev: true 1744 | 1745 | /function.prototype.name@1.1.6: 1746 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 1747 | engines: {node: '>= 0.4'} 1748 | dependencies: 1749 | call-bind: 1.0.5 1750 | define-properties: 1.2.1 1751 | es-abstract: 1.22.3 1752 | functions-have-names: 1.2.3 1753 | dev: true 1754 | 1755 | /functions-have-names@1.2.3: 1756 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1757 | dev: true 1758 | 1759 | /get-caller-file@2.0.5: 1760 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1761 | engines: {node: 6.* || 8.* || >= 10.*} 1762 | dev: true 1763 | 1764 | /get-intrinsic@1.2.2: 1765 | resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} 1766 | dependencies: 1767 | function-bind: 1.1.2 1768 | has-proto: 1.0.1 1769 | has-symbols: 1.0.3 1770 | hasown: 2.0.0 1771 | dev: true 1772 | 1773 | /get-symbol-description@1.0.0: 1774 | resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} 1775 | engines: {node: '>= 0.4'} 1776 | dependencies: 1777 | call-bind: 1.0.5 1778 | get-intrinsic: 1.2.2 1779 | dev: true 1780 | 1781 | /get-tsconfig@4.7.2: 1782 | resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} 1783 | dependencies: 1784 | resolve-pkg-maps: 1.0.0 1785 | dev: true 1786 | 1787 | /glob-parent@5.1.2: 1788 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1789 | engines: {node: '>= 6'} 1790 | dependencies: 1791 | is-glob: 4.0.3 1792 | dev: true 1793 | 1794 | /glob-parent@6.0.2: 1795 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1796 | engines: {node: '>=10.13.0'} 1797 | dependencies: 1798 | is-glob: 4.0.3 1799 | dev: true 1800 | 1801 | /glob@7.2.3: 1802 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1803 | dependencies: 1804 | fs.realpath: 1.0.0 1805 | inflight: 1.0.6 1806 | inherits: 2.0.4 1807 | minimatch: 3.1.2 1808 | once: 1.4.0 1809 | path-is-absolute: 1.0.1 1810 | dev: true 1811 | 1812 | /globals@11.12.0: 1813 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1814 | engines: {node: '>=4'} 1815 | dev: true 1816 | 1817 | /globals@13.24.0: 1818 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1819 | engines: {node: '>=8'} 1820 | dependencies: 1821 | type-fest: 0.20.2 1822 | dev: true 1823 | 1824 | /globalthis@1.0.3: 1825 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1826 | engines: {node: '>= 0.4'} 1827 | dependencies: 1828 | define-properties: 1.2.1 1829 | dev: true 1830 | 1831 | /globby@11.1.0: 1832 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1833 | engines: {node: '>=10'} 1834 | dependencies: 1835 | array-union: 2.1.0 1836 | dir-glob: 3.0.1 1837 | fast-glob: 3.3.2 1838 | ignore: 5.3.0 1839 | merge2: 1.4.1 1840 | slash: 3.0.0 1841 | dev: true 1842 | 1843 | /gopd@1.0.1: 1844 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1845 | dependencies: 1846 | get-intrinsic: 1.2.2 1847 | dev: true 1848 | 1849 | /graceful-fs@4.2.11: 1850 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1851 | dev: true 1852 | 1853 | /graphemer@1.4.0: 1854 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1855 | dev: true 1856 | 1857 | /has-bigints@1.0.2: 1858 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1859 | dev: true 1860 | 1861 | /has-flag@3.0.0: 1862 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1863 | engines: {node: '>=4'} 1864 | dev: true 1865 | 1866 | /has-flag@4.0.0: 1867 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1868 | engines: {node: '>=8'} 1869 | dev: true 1870 | 1871 | /has-property-descriptors@1.0.1: 1872 | resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} 1873 | dependencies: 1874 | get-intrinsic: 1.2.2 1875 | dev: true 1876 | 1877 | /has-proto@1.0.1: 1878 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1879 | engines: {node: '>= 0.4'} 1880 | dev: true 1881 | 1882 | /has-symbols@1.0.3: 1883 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1884 | engines: {node: '>= 0.4'} 1885 | dev: true 1886 | 1887 | /has-tostringtag@1.0.0: 1888 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1889 | engines: {node: '>= 0.4'} 1890 | dependencies: 1891 | has-symbols: 1.0.3 1892 | dev: true 1893 | 1894 | /hasown@2.0.0: 1895 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 1896 | engines: {node: '>= 0.4'} 1897 | dependencies: 1898 | function-bind: 1.1.2 1899 | dev: true 1900 | 1901 | /ignore@5.3.0: 1902 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 1903 | engines: {node: '>= 4'} 1904 | dev: true 1905 | 1906 | /import-fresh@3.3.0: 1907 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1908 | engines: {node: '>=6'} 1909 | dependencies: 1910 | parent-module: 1.0.1 1911 | resolve-from: 4.0.0 1912 | dev: true 1913 | 1914 | /imurmurhash@0.1.4: 1915 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1916 | engines: {node: '>=0.8.19'} 1917 | dev: true 1918 | 1919 | /inflight@1.0.6: 1920 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1921 | dependencies: 1922 | once: 1.4.0 1923 | wrappy: 1.0.2 1924 | dev: true 1925 | 1926 | /inherits@2.0.4: 1927 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1928 | dev: true 1929 | 1930 | /internal-slot@1.0.6: 1931 | resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} 1932 | engines: {node: '>= 0.4'} 1933 | dependencies: 1934 | get-intrinsic: 1.2.2 1935 | hasown: 2.0.0 1936 | side-channel: 1.0.4 1937 | dev: true 1938 | 1939 | /is-array-buffer@3.0.2: 1940 | resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} 1941 | dependencies: 1942 | call-bind: 1.0.5 1943 | get-intrinsic: 1.2.2 1944 | is-typed-array: 1.1.12 1945 | dev: true 1946 | 1947 | /is-bigint@1.0.4: 1948 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1949 | dependencies: 1950 | has-bigints: 1.0.2 1951 | dev: true 1952 | 1953 | /is-binary-path@2.1.0: 1954 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1955 | engines: {node: '>=8'} 1956 | dependencies: 1957 | binary-extensions: 2.2.0 1958 | dev: true 1959 | 1960 | /is-boolean-object@1.1.2: 1961 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1962 | engines: {node: '>= 0.4'} 1963 | dependencies: 1964 | call-bind: 1.0.5 1965 | has-tostringtag: 1.0.0 1966 | dev: true 1967 | 1968 | /is-callable@1.2.7: 1969 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1970 | engines: {node: '>= 0.4'} 1971 | dev: true 1972 | 1973 | /is-core-module@2.13.1: 1974 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1975 | dependencies: 1976 | hasown: 2.0.0 1977 | dev: true 1978 | 1979 | /is-date-object@1.0.5: 1980 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1981 | engines: {node: '>= 0.4'} 1982 | dependencies: 1983 | has-tostringtag: 1.0.0 1984 | dev: true 1985 | 1986 | /is-extglob@2.1.1: 1987 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1988 | engines: {node: '>=0.10.0'} 1989 | dev: true 1990 | 1991 | /is-fullwidth-code-point@3.0.0: 1992 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1993 | engines: {node: '>=8'} 1994 | dev: true 1995 | 1996 | /is-glob@4.0.3: 1997 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1998 | engines: {node: '>=0.10.0'} 1999 | dependencies: 2000 | is-extglob: 2.1.1 2001 | dev: true 2002 | 2003 | /is-negative-zero@2.0.2: 2004 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 2005 | engines: {node: '>= 0.4'} 2006 | dev: true 2007 | 2008 | /is-number-object@1.0.7: 2009 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 2010 | engines: {node: '>= 0.4'} 2011 | dependencies: 2012 | has-tostringtag: 1.0.0 2013 | dev: true 2014 | 2015 | /is-number@7.0.0: 2016 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2017 | engines: {node: '>=0.12.0'} 2018 | dev: true 2019 | 2020 | /is-path-inside@3.0.3: 2021 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 2022 | engines: {node: '>=8'} 2023 | dev: true 2024 | 2025 | /is-regex@1.1.4: 2026 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 2027 | engines: {node: '>= 0.4'} 2028 | dependencies: 2029 | call-bind: 1.0.5 2030 | has-tostringtag: 1.0.0 2031 | dev: true 2032 | 2033 | /is-shared-array-buffer@1.0.2: 2034 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 2035 | dependencies: 2036 | call-bind: 1.0.5 2037 | dev: true 2038 | 2039 | /is-string@1.0.7: 2040 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 2041 | engines: {node: '>= 0.4'} 2042 | dependencies: 2043 | has-tostringtag: 1.0.0 2044 | dev: true 2045 | 2046 | /is-symbol@1.0.4: 2047 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 2048 | engines: {node: '>= 0.4'} 2049 | dependencies: 2050 | has-symbols: 1.0.3 2051 | dev: true 2052 | 2053 | /is-typed-array@1.1.12: 2054 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 2055 | engines: {node: '>= 0.4'} 2056 | dependencies: 2057 | which-typed-array: 1.1.13 2058 | dev: true 2059 | 2060 | /is-weakref@1.0.2: 2061 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 2062 | dependencies: 2063 | call-bind: 1.0.5 2064 | dev: true 2065 | 2066 | /isarray@2.0.5: 2067 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 2068 | dev: true 2069 | 2070 | /isexe@2.0.0: 2071 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2072 | dev: true 2073 | 2074 | /javascript-natural-sort@0.7.1: 2075 | resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} 2076 | dev: true 2077 | 2078 | /js-tokens@4.0.0: 2079 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2080 | dev: true 2081 | 2082 | /js-yaml@4.1.0: 2083 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2084 | hasBin: true 2085 | dependencies: 2086 | argparse: 2.0.1 2087 | dev: true 2088 | 2089 | /jsesc@2.5.2: 2090 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2091 | engines: {node: '>=4'} 2092 | hasBin: true 2093 | dev: true 2094 | 2095 | /json-buffer@3.0.1: 2096 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 2097 | dev: true 2098 | 2099 | /json-schema-traverse@0.4.1: 2100 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2101 | dev: true 2102 | 2103 | /json-stable-stringify-without-jsonify@1.0.1: 2104 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 2105 | dev: true 2106 | 2107 | /json5@1.0.2: 2108 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 2109 | hasBin: true 2110 | dependencies: 2111 | minimist: 1.2.8 2112 | dev: true 2113 | 2114 | /keyv@4.5.4: 2115 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 2116 | dependencies: 2117 | json-buffer: 3.0.1 2118 | dev: true 2119 | 2120 | /levn@0.4.1: 2121 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2122 | engines: {node: '>= 0.8.0'} 2123 | dependencies: 2124 | prelude-ls: 1.2.1 2125 | type-check: 0.4.0 2126 | dev: true 2127 | 2128 | /locate-path@6.0.0: 2129 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 2130 | engines: {node: '>=10'} 2131 | dependencies: 2132 | p-locate: 5.0.0 2133 | dev: true 2134 | 2135 | /lodash.merge@4.6.2: 2136 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2137 | dev: true 2138 | 2139 | /lodash@4.17.21: 2140 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2141 | 2142 | /lru-cache@6.0.0: 2143 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2144 | engines: {node: '>=10'} 2145 | dependencies: 2146 | yallist: 4.0.0 2147 | dev: true 2148 | 2149 | /make-error@1.3.6: 2150 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2151 | dev: true 2152 | 2153 | /merge2@1.4.1: 2154 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2155 | engines: {node: '>= 8'} 2156 | dev: true 2157 | 2158 | /micromatch@4.0.5: 2159 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2160 | engines: {node: '>=8.6'} 2161 | dependencies: 2162 | braces: 3.0.2 2163 | picomatch: 2.3.1 2164 | dev: true 2165 | 2166 | /minimatch@3.1.2: 2167 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2168 | dependencies: 2169 | brace-expansion: 1.1.11 2170 | dev: true 2171 | 2172 | /minimist@1.2.8: 2173 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 2174 | dev: true 2175 | 2176 | /ms@2.1.2: 2177 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2178 | dev: true 2179 | 2180 | /ms@2.1.3: 2181 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2182 | dev: true 2183 | 2184 | /mylas@2.1.13: 2185 | resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} 2186 | engines: {node: '>=12.0.0'} 2187 | dev: true 2188 | 2189 | /natural-compare-lite@1.4.0: 2190 | resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} 2191 | dev: true 2192 | 2193 | /natural-compare@1.4.0: 2194 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2195 | dev: true 2196 | 2197 | /normalize-path@3.0.0: 2198 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2199 | engines: {node: '>=0.10.0'} 2200 | dev: true 2201 | 2202 | /object-inspect@1.13.1: 2203 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 2204 | dev: true 2205 | 2206 | /object-keys@1.1.1: 2207 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 2208 | engines: {node: '>= 0.4'} 2209 | dev: true 2210 | 2211 | /object.assign@4.1.5: 2212 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 2213 | engines: {node: '>= 0.4'} 2214 | dependencies: 2215 | call-bind: 1.0.5 2216 | define-properties: 1.2.1 2217 | has-symbols: 1.0.3 2218 | object-keys: 1.1.1 2219 | dev: true 2220 | 2221 | /object.fromentries@2.0.7: 2222 | resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} 2223 | engines: {node: '>= 0.4'} 2224 | dependencies: 2225 | call-bind: 1.0.5 2226 | define-properties: 1.2.1 2227 | es-abstract: 1.22.3 2228 | dev: true 2229 | 2230 | /object.groupby@1.0.1: 2231 | resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} 2232 | dependencies: 2233 | call-bind: 1.0.5 2234 | define-properties: 1.2.1 2235 | es-abstract: 1.22.3 2236 | get-intrinsic: 1.2.2 2237 | dev: true 2238 | 2239 | /object.values@1.1.7: 2240 | resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} 2241 | engines: {node: '>= 0.4'} 2242 | dependencies: 2243 | call-bind: 1.0.5 2244 | define-properties: 1.2.1 2245 | es-abstract: 1.22.3 2246 | dev: true 2247 | 2248 | /once@1.4.0: 2249 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2250 | dependencies: 2251 | wrappy: 1.0.2 2252 | dev: true 2253 | 2254 | /optionator@0.9.3: 2255 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 2256 | engines: {node: '>= 0.8.0'} 2257 | dependencies: 2258 | '@aashutoshrathi/word-wrap': 1.2.6 2259 | deep-is: 0.1.4 2260 | fast-levenshtein: 2.0.6 2261 | levn: 0.4.1 2262 | prelude-ls: 1.2.1 2263 | type-check: 0.4.0 2264 | dev: true 2265 | 2266 | /p-limit@3.1.0: 2267 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2268 | engines: {node: '>=10'} 2269 | dependencies: 2270 | yocto-queue: 0.1.0 2271 | dev: true 2272 | 2273 | /p-locate@5.0.0: 2274 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2275 | engines: {node: '>=10'} 2276 | dependencies: 2277 | p-limit: 3.1.0 2278 | dev: true 2279 | 2280 | /parent-module@1.0.1: 2281 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2282 | engines: {node: '>=6'} 2283 | dependencies: 2284 | callsites: 3.1.0 2285 | dev: true 2286 | 2287 | /path-exists@4.0.0: 2288 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2289 | engines: {node: '>=8'} 2290 | dev: true 2291 | 2292 | /path-is-absolute@1.0.1: 2293 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2294 | engines: {node: '>=0.10.0'} 2295 | dev: true 2296 | 2297 | /path-key@3.1.1: 2298 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2299 | engines: {node: '>=8'} 2300 | dev: true 2301 | 2302 | /path-parse@1.0.7: 2303 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2304 | dev: true 2305 | 2306 | /path-type@4.0.0: 2307 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2308 | engines: {node: '>=8'} 2309 | dev: true 2310 | 2311 | /picomatch@2.3.1: 2312 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2313 | engines: {node: '>=8.6'} 2314 | dev: true 2315 | 2316 | /plimit-lit@1.6.1: 2317 | resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} 2318 | engines: {node: '>=12'} 2319 | dependencies: 2320 | queue-lit: 1.5.2 2321 | dev: true 2322 | 2323 | /prelude-ls@1.2.1: 2324 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2325 | engines: {node: '>= 0.8.0'} 2326 | dev: true 2327 | 2328 | /prettier-linter-helpers@1.0.0: 2329 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 2330 | engines: {node: '>=6.0.0'} 2331 | dependencies: 2332 | fast-diff: 1.3.0 2333 | dev: true 2334 | 2335 | /prettier@2.8.8: 2336 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 2337 | engines: {node: '>=10.13.0'} 2338 | hasBin: true 2339 | dev: true 2340 | 2341 | /punycode@2.3.1: 2342 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2343 | engines: {node: '>=6'} 2344 | dev: true 2345 | 2346 | /queue-lit@1.5.2: 2347 | resolution: {integrity: sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==} 2348 | engines: {node: '>=12'} 2349 | dev: true 2350 | 2351 | /queue-microtask@1.2.3: 2352 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2353 | dev: true 2354 | 2355 | /readdirp@3.6.0: 2356 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2357 | engines: {node: '>=8.10.0'} 2358 | dependencies: 2359 | picomatch: 2.3.1 2360 | dev: true 2361 | 2362 | /regenerator-runtime@0.14.0: 2363 | resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} 2364 | dev: true 2365 | 2366 | /regexp.prototype.flags@1.5.1: 2367 | resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} 2368 | engines: {node: '>= 0.4'} 2369 | dependencies: 2370 | call-bind: 1.0.5 2371 | define-properties: 1.2.1 2372 | set-function-name: 2.0.1 2373 | dev: true 2374 | 2375 | /regexpp@3.2.0: 2376 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2377 | engines: {node: '>=8'} 2378 | dev: true 2379 | 2380 | /require-directory@2.1.1: 2381 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2382 | engines: {node: '>=0.10.0'} 2383 | dev: true 2384 | 2385 | /resolve-from@4.0.0: 2386 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2387 | engines: {node: '>=4'} 2388 | dev: true 2389 | 2390 | /resolve-pkg-maps@1.0.0: 2391 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 2392 | dev: true 2393 | 2394 | /resolve@1.22.8: 2395 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2396 | hasBin: true 2397 | dependencies: 2398 | is-core-module: 2.13.1 2399 | path-parse: 1.0.7 2400 | supports-preserve-symlinks-flag: 1.0.0 2401 | dev: true 2402 | 2403 | /reusify@1.0.4: 2404 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2405 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2406 | dev: true 2407 | 2408 | /rimraf@3.0.2: 2409 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2410 | hasBin: true 2411 | dependencies: 2412 | glob: 7.2.3 2413 | dev: true 2414 | 2415 | /run-parallel@1.2.0: 2416 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2417 | dependencies: 2418 | queue-microtask: 1.2.3 2419 | dev: true 2420 | 2421 | /rxjs@7.8.1: 2422 | resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} 2423 | dependencies: 2424 | tslib: 2.6.2 2425 | dev: true 2426 | 2427 | /safe-array-concat@1.0.1: 2428 | resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} 2429 | engines: {node: '>=0.4'} 2430 | dependencies: 2431 | call-bind: 1.0.5 2432 | get-intrinsic: 1.2.2 2433 | has-symbols: 1.0.3 2434 | isarray: 2.0.5 2435 | dev: true 2436 | 2437 | /safe-regex-test@1.0.0: 2438 | resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} 2439 | dependencies: 2440 | call-bind: 1.0.5 2441 | get-intrinsic: 1.2.2 2442 | is-regex: 1.1.4 2443 | dev: true 2444 | 2445 | /semver@6.3.1: 2446 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2447 | hasBin: true 2448 | dev: true 2449 | 2450 | /semver@7.5.4: 2451 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2452 | engines: {node: '>=10'} 2453 | hasBin: true 2454 | dependencies: 2455 | lru-cache: 6.0.0 2456 | dev: true 2457 | 2458 | /set-function-length@1.1.1: 2459 | resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} 2460 | engines: {node: '>= 0.4'} 2461 | dependencies: 2462 | define-data-property: 1.1.1 2463 | get-intrinsic: 1.2.2 2464 | gopd: 1.0.1 2465 | has-property-descriptors: 1.0.1 2466 | dev: true 2467 | 2468 | /set-function-name@2.0.1: 2469 | resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} 2470 | engines: {node: '>= 0.4'} 2471 | dependencies: 2472 | define-data-property: 1.1.1 2473 | functions-have-names: 1.2.3 2474 | has-property-descriptors: 1.0.1 2475 | dev: true 2476 | 2477 | /shebang-command@2.0.0: 2478 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2479 | engines: {node: '>=8'} 2480 | dependencies: 2481 | shebang-regex: 3.0.0 2482 | dev: true 2483 | 2484 | /shebang-regex@3.0.0: 2485 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2486 | engines: {node: '>=8'} 2487 | dev: true 2488 | 2489 | /shell-quote@1.8.1: 2490 | resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} 2491 | dev: true 2492 | 2493 | /side-channel@1.0.4: 2494 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2495 | dependencies: 2496 | call-bind: 1.0.5 2497 | get-intrinsic: 1.2.2 2498 | object-inspect: 1.13.1 2499 | dev: true 2500 | 2501 | /slash@3.0.0: 2502 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2503 | engines: {node: '>=8'} 2504 | dev: true 2505 | 2506 | /source-map-support@0.5.21: 2507 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2508 | dependencies: 2509 | buffer-from: 1.1.2 2510 | source-map: 0.6.1 2511 | dev: true 2512 | 2513 | /source-map@0.5.7: 2514 | resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} 2515 | engines: {node: '>=0.10.0'} 2516 | dev: true 2517 | 2518 | /source-map@0.6.1: 2519 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2520 | engines: {node: '>=0.10.0'} 2521 | dev: true 2522 | 2523 | /spawn-command@0.0.2-1: 2524 | resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} 2525 | dev: true 2526 | 2527 | /string-width@4.2.3: 2528 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2529 | engines: {node: '>=8'} 2530 | dependencies: 2531 | emoji-regex: 8.0.0 2532 | is-fullwidth-code-point: 3.0.0 2533 | strip-ansi: 6.0.1 2534 | dev: true 2535 | 2536 | /string.prototype.trim@1.2.8: 2537 | resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} 2538 | engines: {node: '>= 0.4'} 2539 | dependencies: 2540 | call-bind: 1.0.5 2541 | define-properties: 1.2.1 2542 | es-abstract: 1.22.3 2543 | dev: true 2544 | 2545 | /string.prototype.trimend@1.0.7: 2546 | resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} 2547 | dependencies: 2548 | call-bind: 1.0.5 2549 | define-properties: 1.2.1 2550 | es-abstract: 1.22.3 2551 | dev: true 2552 | 2553 | /string.prototype.trimstart@1.0.7: 2554 | resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} 2555 | dependencies: 2556 | call-bind: 1.0.5 2557 | define-properties: 1.2.1 2558 | es-abstract: 1.22.3 2559 | dev: true 2560 | 2561 | /strip-ansi@6.0.1: 2562 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2563 | engines: {node: '>=8'} 2564 | dependencies: 2565 | ansi-regex: 5.0.1 2566 | dev: true 2567 | 2568 | /strip-ansi@7.1.0: 2569 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2570 | engines: {node: '>=12'} 2571 | dependencies: 2572 | ansi-regex: 6.0.1 2573 | dev: true 2574 | 2575 | /strip-bom@3.0.0: 2576 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2577 | engines: {node: '>=4'} 2578 | dev: true 2579 | 2580 | /strip-json-comments@3.1.1: 2581 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2582 | engines: {node: '>=8'} 2583 | dev: true 2584 | 2585 | /supports-color@5.5.0: 2586 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2587 | engines: {node: '>=4'} 2588 | dependencies: 2589 | has-flag: 3.0.0 2590 | dev: true 2591 | 2592 | /supports-color@7.2.0: 2593 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2594 | engines: {node: '>=8'} 2595 | dependencies: 2596 | has-flag: 4.0.0 2597 | dev: true 2598 | 2599 | /supports-color@8.1.1: 2600 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2601 | engines: {node: '>=10'} 2602 | dependencies: 2603 | has-flag: 4.0.0 2604 | dev: true 2605 | 2606 | /supports-preserve-symlinks-flag@1.0.0: 2607 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2608 | engines: {node: '>= 0.4'} 2609 | dev: true 2610 | 2611 | /tapable@2.2.1: 2612 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 2613 | engines: {node: '>=6'} 2614 | dev: true 2615 | 2616 | /text-table@0.2.0: 2617 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2618 | dev: true 2619 | 2620 | /to-fast-properties@2.0.0: 2621 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2622 | engines: {node: '>=4'} 2623 | dev: true 2624 | 2625 | /to-regex-range@5.0.1: 2626 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2627 | engines: {node: '>=8.0'} 2628 | dependencies: 2629 | is-number: 7.0.0 2630 | dev: true 2631 | 2632 | /tree-kill@1.2.2: 2633 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 2634 | hasBin: true 2635 | dev: true 2636 | 2637 | /ts-custom-error@3.3.1: 2638 | resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==} 2639 | engines: {node: '>=14.0.0'} 2640 | dev: false 2641 | 2642 | /ts-node@10.9.2(@types/node@18.19.3)(typescript@4.9.5): 2643 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 2644 | hasBin: true 2645 | peerDependencies: 2646 | '@swc/core': '>=1.2.50' 2647 | '@swc/wasm': '>=1.2.50' 2648 | '@types/node': '*' 2649 | typescript: '>=2.7' 2650 | peerDependenciesMeta: 2651 | '@swc/core': 2652 | optional: true 2653 | '@swc/wasm': 2654 | optional: true 2655 | dependencies: 2656 | '@cspotcode/source-map-support': 0.8.1 2657 | '@tsconfig/node10': 1.0.9 2658 | '@tsconfig/node12': 1.0.11 2659 | '@tsconfig/node14': 1.0.3 2660 | '@tsconfig/node16': 1.0.4 2661 | '@types/node': 18.19.3 2662 | acorn: 8.11.2 2663 | acorn-walk: 8.3.1 2664 | arg: 4.1.3 2665 | create-require: 1.1.1 2666 | diff: 4.0.2 2667 | make-error: 1.3.6 2668 | typescript: 4.9.5 2669 | v8-compile-cache-lib: 3.0.1 2670 | yn: 3.1.1 2671 | dev: true 2672 | 2673 | /tsc-alias@1.8.8: 2674 | resolution: {integrity: sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==} 2675 | hasBin: true 2676 | dependencies: 2677 | chokidar: 3.5.3 2678 | commander: 9.5.0 2679 | globby: 11.1.0 2680 | mylas: 2.1.13 2681 | normalize-path: 3.0.0 2682 | plimit-lit: 1.6.1 2683 | dev: true 2684 | 2685 | /tsconfig-paths@3.14.2: 2686 | resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} 2687 | dependencies: 2688 | '@types/json5': 0.0.29 2689 | json5: 1.0.2 2690 | minimist: 1.2.8 2691 | strip-bom: 3.0.0 2692 | dev: true 2693 | 2694 | /tslib@1.14.1: 2695 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2696 | dev: true 2697 | 2698 | /tslib@2.6.2: 2699 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2700 | dev: true 2701 | 2702 | /tsutils@3.21.0(typescript@4.9.5): 2703 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2704 | engines: {node: '>= 6'} 2705 | peerDependencies: 2706 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2707 | dependencies: 2708 | tslib: 1.14.1 2709 | typescript: 4.9.5 2710 | dev: true 2711 | 2712 | /tsx@3.14.0: 2713 | resolution: {integrity: sha512-xHtFaKtHxM9LOklMmJdI3BEnQq/D5F73Of2E1GDrITi9sgoVkvIsrQUTY1G8FlmGtA+awCI4EBlTRRYxkL2sRg==} 2714 | hasBin: true 2715 | dependencies: 2716 | esbuild: 0.18.20 2717 | get-tsconfig: 4.7.2 2718 | source-map-support: 0.5.21 2719 | optionalDependencies: 2720 | fsevents: 2.3.3 2721 | dev: true 2722 | 2723 | /type-check@0.4.0: 2724 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2725 | engines: {node: '>= 0.8.0'} 2726 | dependencies: 2727 | prelude-ls: 1.2.1 2728 | dev: true 2729 | 2730 | /type-fest@0.20.2: 2731 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2732 | engines: {node: '>=10'} 2733 | dev: true 2734 | 2735 | /typed-array-buffer@1.0.0: 2736 | resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} 2737 | engines: {node: '>= 0.4'} 2738 | dependencies: 2739 | call-bind: 1.0.5 2740 | get-intrinsic: 1.2.2 2741 | is-typed-array: 1.1.12 2742 | dev: true 2743 | 2744 | /typed-array-byte-length@1.0.0: 2745 | resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} 2746 | engines: {node: '>= 0.4'} 2747 | dependencies: 2748 | call-bind: 1.0.5 2749 | for-each: 0.3.3 2750 | has-proto: 1.0.1 2751 | is-typed-array: 1.1.12 2752 | dev: true 2753 | 2754 | /typed-array-byte-offset@1.0.0: 2755 | resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} 2756 | engines: {node: '>= 0.4'} 2757 | dependencies: 2758 | available-typed-arrays: 1.0.5 2759 | call-bind: 1.0.5 2760 | for-each: 0.3.3 2761 | has-proto: 1.0.1 2762 | is-typed-array: 1.1.12 2763 | dev: true 2764 | 2765 | /typed-array-length@1.0.4: 2766 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 2767 | dependencies: 2768 | call-bind: 1.0.5 2769 | for-each: 0.3.3 2770 | is-typed-array: 1.1.12 2771 | dev: true 2772 | 2773 | /typescript@4.9.5: 2774 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 2775 | engines: {node: '>=4.2.0'} 2776 | hasBin: true 2777 | dev: true 2778 | 2779 | /unbox-primitive@1.0.2: 2780 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 2781 | dependencies: 2782 | call-bind: 1.0.5 2783 | has-bigints: 1.0.2 2784 | has-symbols: 1.0.3 2785 | which-boxed-primitive: 1.0.2 2786 | dev: true 2787 | 2788 | /undici-types@5.26.5: 2789 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2790 | dev: true 2791 | 2792 | /uri-js@4.4.1: 2793 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2794 | dependencies: 2795 | punycode: 2.3.1 2796 | dev: true 2797 | 2798 | /v8-compile-cache-lib@3.0.1: 2799 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 2800 | dev: true 2801 | 2802 | /which-boxed-primitive@1.0.2: 2803 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 2804 | dependencies: 2805 | is-bigint: 1.0.4 2806 | is-boolean-object: 1.1.2 2807 | is-number-object: 1.0.7 2808 | is-string: 1.0.7 2809 | is-symbol: 1.0.4 2810 | dev: true 2811 | 2812 | /which-typed-array@1.1.13: 2813 | resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} 2814 | engines: {node: '>= 0.4'} 2815 | dependencies: 2816 | available-typed-arrays: 1.0.5 2817 | call-bind: 1.0.5 2818 | for-each: 0.3.3 2819 | gopd: 1.0.1 2820 | has-tostringtag: 1.0.0 2821 | dev: true 2822 | 2823 | /which@2.0.2: 2824 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2825 | engines: {node: '>= 8'} 2826 | hasBin: true 2827 | dependencies: 2828 | isexe: 2.0.0 2829 | dev: true 2830 | 2831 | /wrap-ansi@7.0.0: 2832 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2833 | engines: {node: '>=10'} 2834 | dependencies: 2835 | ansi-styles: 4.3.0 2836 | string-width: 4.2.3 2837 | strip-ansi: 6.0.1 2838 | dev: true 2839 | 2840 | /wrappy@1.0.2: 2841 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2842 | dev: true 2843 | 2844 | /y18n@5.0.8: 2845 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2846 | engines: {node: '>=10'} 2847 | dev: true 2848 | 2849 | /yallist@4.0.0: 2850 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2851 | dev: true 2852 | 2853 | /yargs-parser@21.1.1: 2854 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 2855 | engines: {node: '>=12'} 2856 | dev: true 2857 | 2858 | /yargs@17.7.2: 2859 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 2860 | engines: {node: '>=12'} 2861 | dependencies: 2862 | cliui: 8.0.1 2863 | escalade: 3.1.1 2864 | get-caller-file: 2.0.5 2865 | require-directory: 2.1.1 2866 | string-width: 4.2.3 2867 | y18n: 5.0.8 2868 | yargs-parser: 21.1.1 2869 | dev: true 2870 | 2871 | /yn@3.1.1: 2872 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 2873 | engines: {node: '>=6'} 2874 | dev: true 2875 | 2876 | /yocto-queue@0.1.0: 2877 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2878 | engines: {node: '>=10'} 2879 | dev: true 2880 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | 9 |

10 | 11 |

12 | 13 |

tree

14 |

15 | A Modeling Notation 16 |

17 | 18 |
19 |
20 |
21 | 22 | ## Welcome 23 | 24 | [TreeCode](https://tree.surf) is a little more than a markup language, 25 | tending toward a programming language. In fact, it can be used for a 26 | programming language, but I like to think of it as a "Data Modeling 27 | Programming Language". It is a way to model information and computation 28 | in an easy to read and write format, suitable for hierarchical note 29 | taking and other means of capturing data down into structured form. 30 | 31 | ## Theory 32 | 33 | There are two types of TreeCode: 34 | 35 | - `TreeFlow`: Simple tree structure, non-circular, expanded 36 | interpolations. This is "simple form" of TreeCode, which can be used 37 | to construct serializable data like JSON. 38 | - `TreeMesh`: Code tree structure, possibly circular, linked 39 | interpolations. This is the "complex form" of TreeCode, which can be 40 | used to write complex code. 41 | 42 | Upon parsing, we should be able to say whether or not the TreeCode 43 | passes the threshold for being called `TreeFlow`, otherwise it is by 44 | default considered `TreeMesh`. 45 | 46 | In principle, two separate parsers can be developed for these two forms, 47 | `TreeFlow` being optimized for not handling all the complex cases of 48 | circular reasoning and interpolation, just sticking to basic expanding 49 | data structures like JSON. 50 | 51 | ## Installation 52 | 53 | ``` 54 | pnpm add @cluesurf/tree 55 | ``` 56 | 57 | ## Usage 58 | 59 | ```ts 60 | import makeTree from '@cluesurf/tree' 61 | 62 | const file = './base.tree' 63 | const text = `deck <@cluesurf/wolf> 64 | bear ./code 65 | test ./test 66 | mark <0.0.1>` 67 | const tree = makeTree({ file, text }) 68 | ``` 69 | 70 | ## VSCode Integration 71 | 72 | Install the 73 | [syntax highlighter](https://marketplace.visualstudio.com/items?itemName=cluesurf.tree-code) 74 | VSCode extension and get aworkin! 75 | 76 | 77 | 78 | ## State of Library 79 | 80 | Tests pass for positive cases (`pnpm test`), but fail on some crazy 81 | error cases it should handle nicely. So still have some work to do on 82 | making this robust, but it should parse the basic structures fine, just 83 | not commplicated interpolation styles with nesting. 84 | 85 | ## License 86 | 87 | MIT 88 | 89 | ## ClueSurf 90 | 91 | This is being developed by the folks at [ClueSurf](https://clue.surf), a 92 | California-based project for helping humanity master information and 93 | computation. Find us on [X](https://twitter.com/cluesurf), 94 | [LinkedIn](https://www.linkedin.com/company/cluesurf), and 95 | [Facebook](https://www.facebook.com/cluesurf). Check out our other 96 | [GitHub projects](https://github.com/cluesurf) as well! 97 | -------------------------------------------------------------------------------- /test/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.trimTrailingWhitespace": false 3 | } 4 | -------------------------------------------------------------------------------- /test/file/all.note: -------------------------------------------------------------------------------- 1 | 2 | a 3 | a b 4 | a b c 5 | a b c d 6 | a b c 7 | d 8 | 9 | --- 10 | 11 | a 12 | a 13 | b 14 | a 15 | b 16 | c 17 | a 18 | b 19 | c 20 | d 21 | a 22 | b 23 | c 24 | d 25 | -------------------------------------------------------------------------------- /test/file/deck.note: -------------------------------------------------------------------------------- 1 | 2 | deck <@termsurf/wolf> 3 | bear ./code 4 | test ./test 5 | mark <0.0.1> 6 | 7 | deck @termsurf/wolf 8 | bear ./code 9 | mark <0.0.1> 10 | test ./test{{{another 12}}}two/one 11 | 12 | --- 13 | 14 | deck 15 | <@termsurf/wolf> 16 | bear 17 | ./code 18 | test 19 | ./test 20 | mark 21 | <0.0.1> 22 | deck 23 | @termsurf/wolf 24 | bear 25 | ./code 26 | mark 27 | <0.0.1> 28 | test 29 | ./test{{{another(12)}}}two/one 30 | -------------------------------------------------------------------------------- /test/file/index.note: -------------------------------------------------------------------------------- 1 | 2 | some thing/{another(a/b/c, 1, foo bar baz)} 3 | 4 | --- 5 | 6 | some 7 | thing/{another(a/b/c, 1, foo(bar(baz)))} 8 | -------------------------------------------------------------------------------- /test/file/interpolated-end.note: -------------------------------------------------------------------------------- 1 | 2 | a {{a}}{{b}} 3 | c 4 | {{x}}{{y}} 5 | {{d}} a 6 | {{w}}-{{m}} f {or}{{{why}}} 7 | {{v}}/{{o}} 8 | 9 | --- 10 | 11 | a 12 | {{a}}{{b}} 13 | c 14 | {{x}}{{y}} 15 | {{d}} 16 | a 17 | {{w}}-{{m}} 18 | f 19 | {or}{{{why}}} 20 | {{v}}/{{o}} 21 | -------------------------------------------------------------------------------- /test/file/interpolated-prop.note: -------------------------------------------------------------------------------- 1 | 2 | take {name} 3 | like index 4 | like t 5 | like p 6 | 7 | --- 8 | 9 | take 10 | {name} 11 | like 12 | index 13 | like 14 | t 15 | like 16 | p 17 | -------------------------------------------------------------------------------- /test/file/interpolated-start-prop.note: -------------------------------------------------------------------------------- 1 | 2 | bear ./mark 3 | {{something}}-strange here 4 | 5 | --- 6 | 7 | bear 8 | ./mark 9 | {{something}}-strange 10 | here 11 | -------------------------------------------------------------------------------- /test/file/interpolation-nesting.note: -------------------------------------------------------------------------------- 1 | 2 | {a{b-y(10)}{c}} x 3 | 4 | --- 5 | 6 | {a{b-y(10)}{c}} 7 | x 8 | -------------------------------------------------------------------------------- /test/file/interpolation-with-path.note: -------------------------------------------------------------------------------- 1 | 2 | deck ./{base/link} 3 | 4 | --- 5 | 6 | deck 7 | ./{base/link} 8 | -------------------------------------------------------------------------------- /test/file/kink/invalid-leading-space.note: -------------------------------------------------------------------------------- 1 | 2 | foo 3 | bar 4 | 5 | --- 6 | 7 | Invalid whitespace 8 | -------------------------------------------------------------------------------- /test/file/kink/invalid-nested-term.note: -------------------------------------------------------------------------------- 1 | 2 | foo 123 bar 3 | 4 | --- 5 | 6 | The Link Tree has invalid nesting 7 | -------------------------------------------------------------------------------- /test/file/kink/invalid-term.note: -------------------------------------------------------------------------------- 1 | 2 | 123 term 3 | 4 | --- 5 | 6 | The Link Tree has invalid nesting 7 | -------------------------------------------------------------------------------- /test/file/line-nick.note: -------------------------------------------------------------------------------- 1 | 2 | bear ./{base/env/host}/cord 3 | 4 | --- 5 | 6 | bear 7 | ./{base/env/host}/cord 8 | -------------------------------------------------------------------------------- /test/file/line.note: -------------------------------------------------------------------------------- 1 | 2 | deck @termsurf/wolf 3 | 4 | --- 5 | 6 | deck 7 | @termsurf/wolf 8 | -------------------------------------------------------------------------------- /test/file/nesting-basic-revert.note: -------------------------------------------------------------------------------- 1 | 2 | a b c d e f g 3 | h i j k 4 | l m n 5 | o p 6 | q 7 | 8 | --- 9 | 10 | a 11 | b 12 | c 13 | d 14 | e 15 | f 16 | g 17 | h 18 | i 19 | j 20 | k 21 | l 22 | m 23 | n 24 | o 25 | p 26 | q 27 | -------------------------------------------------------------------------------- /test/file/nesting-basic.note: -------------------------------------------------------------------------------- 1 | a b c d e f g a sd f 2 | x y z w y 3 | abc 4 | 5 | --- 6 | 7 | a 8 | b 9 | c 10 | d 11 | e 12 | f 13 | g 14 | a 15 | sd 16 | f 17 | x 18 | y 19 | z 20 | w 21 | y 22 | abc 23 | -------------------------------------------------------------------------------- /test/file/nesting-ugly.note: -------------------------------------------------------------------------------- 1 | 2 | task x 3 | call name{{ 4 | something random{ 5 | here 6 | } 7 | }} 8 | 9 | boom baz 10 | foo hello{{ 11 | world 12 | bar 13 | baz(bing, boop) 14 | }} 15 | 16 | --- 17 | 18 | task 19 | x 20 | call 21 | name{{something(random{here})}} 22 | boom 23 | baz 24 | foo 25 | hello{{world(bar(baz(bing, boop)))}} 26 | -------------------------------------------------------------------------------- /test/file/path.note: -------------------------------------------------------------------------------- 1 | 2 | x a/b/c/d 3 | {{a}}/{b}x/x{c}/x{{d}}x/g 4 | {{a}}/{b}-x/x-{c}/x-{{d}}-x/g 5 | ./foo/bar/baz 6 | ./{{a}}/{b}-x/x-{c}/x-{{d}}-x/g 7 | /a/b/c/../d 8 | @another/thing.link 9 | /{a}/{b}{c} 10 | 11 | --- 12 | 13 | x 14 | a/b/c/d 15 | {{a}}/{b}x/x{c}/x{{d}}x/g 16 | {{a}}/{b}-x/x-{c}/x-{{d}}-x/g 17 | ./foo/bar/baz 18 | ./{{a}}/{b}-x/x-{c}/x-{{d}}-x/g 19 | /a/b/c/../d 20 | @another/thing.link 21 | /{a}/{b}{c} 22 | -------------------------------------------------------------------------------- /test/file/sink.note: -------------------------------------------------------------------------------- 1 | 2 | save separator, text 3 | 4 | # adds a new indentation context 5 | call some{separator}path 6 | < 7 | some text {{ 8 | and interpolation{ 9 | here 13 | } 14 | }} 15 | > 16 | 17 | --- 18 | 19 | save 20 | separator 21 | text 22 | 23 | call 24 | some{separator}path 25 | )})}}> 26 | -------------------------------------------------------------------------------- /test/file/term-interpolation-complex.note: -------------------------------------------------------------------------------- 1 | 2 | form text 3 | link a-{x y}-z foo 4 | 5 | link b{hello}, 123 6 | 7 | --- 8 | 9 | form 10 | text 11 | link 12 | a-{x(y)}-z 13 | foo 14 | link 15 | b{hello} 16 | 123 17 | -------------------------------------------------------------------------------- /test/file/text-lines.note: -------------------------------------------------------------------------------- 1 | 2 | i am a term, another nested term 3 | some text 4 | some multiline-text 5 | < 6 | I am some text. 7 | I am concatenated to the first line with a space. 8 | 9 | I have a new line between me and the rest. 10 | > 11 | 12 | --- 13 | 14 | i 15 | am 16 | a 17 | term 18 | another 19 | nested 20 | term 21 | some 22 | text 23 | 24 | some 25 | multiline-text 26 | 29 | -------------------------------------------------------------------------------- /test/file/text-multiline.note: -------------------------------------------------------------------------------- 1 | 2 | details 3 | bind data, text < 4 | some 5 | multiline 6 | text 7 | > 8 | 9 | two 10 | text 11 | < 12 | some 13 | multline 14 | text 15 | {{ 16 | some tree code 17 | too 18 | }} 19 | or {{ 20 | like this 21 | }} 22 | > 23 | 24 | --- 25 | 26 | details 27 | bind 28 | data 29 | text 30 | 31 | two 32 | text 33 | 34 | -------------------------------------------------------------------------------- /test/file/text.note: -------------------------------------------------------------------------------- 1 | 2 | one two < 3 | three 4 | > 5 | 6 | one < 7 | two 8 | > 9 | 10 | one 11 | two < 12 | three 13 | four 14 | > 15 | 16 | --- 17 | 18 | one 19 | two 20 | 21 | one 22 | 23 | one 24 | two 25 | 26 | -------------------------------------------------------------------------------- /test/file/values.note: -------------------------------------------------------------------------------- 1 | 2 | form two 3 | a b{x y 123, 123}/c, and/y/w 4 | b-c 432.12, , 3.14 5 | #b101 6 | 123 7 | 1.12 8 | true 9 | a/b 10 | foo bar{x}-baz/bear-{bond}we, and a123 345 11 | stuff for you 12 | more 13 | 14 | --- 15 | 16 | form 17 | two 18 | a 19 | b{x(y(123, 123))}/c 20 | and/y/w 21 | b-c 22 | 432.12 23 | 24 | 3.14 25 | #b101 26 | 123 27 | 1.12 28 | true 29 | a/b 30 | foo 31 | bar{x}-baz/bear-{bond}we 32 | and 33 | a123 34 | 345 35 | stuff 36 | for 37 | you 38 | more 39 | -------------------------------------------------------------------------------- /test/index.test.ts: -------------------------------------------------------------------------------- 1 | import assert from 'assert' 2 | import { promises as fs } from 'fs' 3 | import { dirname } from 'path' 4 | import stripAnsi from 'strip-ansi' 5 | import { fileURLToPath } from 'url' 6 | import Kink, { KinkList } from '@termsurf/kink' 7 | import { makeBaseKinkText, makeKinkText } from '@termsurf/kink-text' 8 | 9 | import makeTree from '../code/index.js' 10 | import { showTreeLine } from '../code/tree/index.js' 11 | import show from 'code/sift/show.js' 12 | import makeSiftList, { SiftCallCast } from 'code/sift/index.js' 13 | import makeTextList from 'code/leaf/index.js' 14 | import { LeafCallCast } from 'code/leaf/form.js' 15 | 16 | const __filename = fileURLToPath(import.meta.url) 17 | const __dirname = dirname(__filename) 18 | 19 | const FIND = process.env.FIND 20 | 21 | process.on('uncaughtException', kink => { 22 | console.log(``) 23 | if (kink instanceof KinkList) { 24 | if (kink.list.length === 1) { 25 | const k = kink.list[0] 26 | if (k) { 27 | Kink.saveFill(k) 28 | console.log(makeKinkText(k)) 29 | } 30 | } else { 31 | console.log(makeKinkText(kink)) 32 | kink.list.forEach(kink => { 33 | console.log(``) 34 | Kink.saveFill(kink) 35 | console.log(makeKinkText(kink)) 36 | }) 37 | } 38 | } else if (kink instanceof Kink) { 39 | Kink.saveFill(kink) 40 | console.log(makeKinkText(kink)) 41 | } else if (kink instanceof Error) { 42 | console.log(makeBaseKinkText(kink)) 43 | } else { 44 | console.log(kink) 45 | } 46 | console.log(``) 47 | }) 48 | 49 | async function start() { 50 | const fixtures = (await fs.readdir(`${__dirname}/file`)) 51 | .filter(x => x.endsWith('.note')) 52 | .map(x => `${__dirname}/file/${x}`) 53 | .filter(x => !FIND || x.match(FIND)) 54 | 55 | for (const path of fixtures) { 56 | const localPath = path.replace(`${__dirname}/`, '') 57 | console.log(localPath) 58 | const content = await fs.readFile(path, 'utf-8') 59 | const [provided, expected] = content 60 | .split(/\n---\n/) 61 | .map(x => x.trim()) 62 | assert(provided, 'Should have defined provided input') 63 | assert(expected, 'Should have defined expected output') 64 | assertParse(path, provided, expected) 65 | } 66 | 67 | const kinkFixtures = (await fs.readdir(`${__dirname}/file/kink`)) 68 | .filter(x => x.endsWith('.note')) 69 | .map(x => `${__dirname}/file/kink/${x}`) 70 | .filter(x => !FIND || x.match(FIND)) 71 | 72 | for (const path of kinkFixtures) { 73 | const localPath = path.replace(`${__dirname}/`, '') 74 | console.log(localPath) 75 | const content = await fs.readFile(path, 'utf-8') 76 | const [provided, expected] = content 77 | .split(/\n---\n/) 78 | .map(x => x.trim()) 79 | assert(provided, 'Should have defined provided input') 80 | assert(expected, 'Should have defined expected output') 81 | assertParseKink(path, provided, expected) 82 | } 83 | } 84 | 85 | start() 86 | 87 | function assertParse(file: string, provided: string, expected: string) { 88 | const lead = makeTree({ file, text: provided }) 89 | 90 | if (lead instanceof KinkList) { 91 | throw lead 92 | } 93 | 94 | const output = showTreeLine(lead.tree) 95 | 96 | const a = String(stripAnsi(output)).trim() 97 | const b = String(stripAnsi(expected)).trim() 98 | 99 | if (a !== b) { 100 | // console.log(a) 101 | throw new Error(`\n${a} !=\n${b}\n`) 102 | // code.throwError(code.generateStringMismatchError(data, a, b)) 103 | } 104 | } 105 | 106 | function assertParseKink( 107 | file: string, 108 | provided: string, 109 | expected: string, 110 | ) { 111 | const lead = makeTree({ file, text: provided }) 112 | 113 | if (lead instanceof KinkList) { 114 | const noteList = lead.list.map(x => x.note).join('\n') 115 | 116 | if (expected !== noteList) { 117 | // console.log(a) 118 | throw new Error(`\n${noteList} !=\n${expected}\n\nfor ${file}`) 119 | // code.throwError(code.generateStringMismatchError(data, a, b)) 120 | } 121 | // throw new KinkList(lead) 122 | } else { 123 | const siftLead = makeSiftList( 124 | makeTextList({ file, text: provided }) as LeafCallCast, 125 | ) as SiftCallCast 126 | console.log(show(siftLead.siftList)) 127 | throw new Error(`No error thrown for ${file}`) 128 | } 129 | // } catch (e) { 130 | // if (e instanceof Error) { 131 | // if (e.message != expected) { 132 | // throw e 133 | // } 134 | // } 135 | // } 136 | } 137 | 138 | function trimLines(text: string): string { 139 | return text 140 | .split('\n') 141 | .map(x => x.slice(2)) 142 | .join('\n') 143 | } 144 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "ESNext", 5 | "lib": ["es2020"], 6 | "outDir": "host", 7 | "rootDir": ".", 8 | "sourceMap": true, 9 | "moduleResolution": "node", 10 | "strictNullChecks": true, 11 | "strict": true, 12 | "esModuleInterop": true, 13 | "noUncheckedIndexedAccess": true, 14 | "baseUrl": ".", 15 | "noErrorTruncation": true, 16 | "types": ["node"], 17 | "typeRoots": ["node_modules/@types"], 18 | "noImplicitAny": true, 19 | "declaration": true 20 | }, 21 | "include": ["*.ts", "**/*.ts", "*.d.ts"], 22 | "exclude": ["node_modules", "host"] 23 | } 24 | -------------------------------------------------------------------------------- /view/base.logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 35 | 36 | -------------------------------------------------------------------------------- /view/clover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/clover.png -------------------------------------------------------------------------------- /view/lace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/lace.png -------------------------------------------------------------------------------- /view/mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/mine.png -------------------------------------------------------------------------------- /view/snap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/snap.png -------------------------------------------------------------------------------- /view/snap2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/snap2.png -------------------------------------------------------------------------------- /view/snap5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/snap5.png -------------------------------------------------------------------------------- /view/snap7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/snap7.png -------------------------------------------------------------------------------- /view/tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cluesurf/tree/fa2f8fb8534d8a4785a1580cdbf6d1b977a988ff/view/tree.png --------------------------------------------------------------------------------