diff --git a/autocomplete/completion.go b/autocomplete/completion.go index a8128b6..9833df5 100644 --- a/autocomplete/completion.go +++ b/autocomplete/completion.go @@ -13,17 +13,31 @@ type Suggestion struct { } var ( - cmdDelimiter = regexp.MustCompile(`(\|\|)|(&&)|(;)`) + cmdDelimiter = regexp.MustCompile(`(\|\|)|(&&)|(;)`) + lastSuggestionCmd = "" + lastSuggestion = []Suggestion{} ) -func LoadSuggestions(cmd string) []Suggestion { +func loadSuggestions(cmd string) (suggestions []Suggestion) { activeCmd := ParseCommand(cmd) if len(activeCmd) <= 0 { - return []Suggestion{} + return } - log.Println(activeCmd, activeCmd[0].token) - if spec, ok := specs.Specs[activeCmd[0].token]; ok { + rootToken := activeCmd[0] + if !rootToken.complete { + return + } + if spec, ok := specs.Specs[rootToken.token]; ok { log.Println(spec.Description) } - return []Suggestion{} + return +} + +func LoadSuggestions(cmd string) []Suggestion { + if cmd == lastSuggestionCmd { + return lastSuggestion + } + suggestions := loadSuggestions(cmd) + lastSuggestionCmd, lastSuggestion = cmd, suggestions + return suggestions } diff --git a/autocomplete/extract/extract.ts b/autocomplete/extract/extract.ts index b6bd2a1..343c02c 100644 --- a/autocomplete/extract/extract.ts +++ b/autocomplete/extract/extract.ts @@ -3,6 +3,20 @@ import * as fs from "fs"; import * as path from "path"; import * as process from "process"; import * as child_process from "child_process"; +import ProgressBar = require("progress"); + +const exclusions = new Set(["deno.ts", "rush.ts"]); + +const clearAllNewlines = (input: string): string => { + return input.replaceAll(/[\r\n]+/g, ""); +}; + +function chunk(arr: T[], chuckSize: number): T[][] { + const arrays: T[][] = []; + for (let i = 0; i < arr.length; i += chuckSize) + arrays.push(arr.slice(i, i + chuckSize)); + return arrays; +} const main = async () => { const basePath = path.join(process.cwd(), ".fig"); @@ -15,70 +29,149 @@ const main = async () => { const directoryItems = await fsAsync.readdir(basePath, { withFileTypes: true, }); - await Promise.all( - [directoryItems[10]].map(async (directoryItem) => { - if (!directoryItem.isFile()) { - return; - } - const spec: Fig.Spec = ( - await import(path.join(basePath, directoryItem.name)) - ).default; - - if (typeof spec === "function") { - return; - } - - const filenameWithoutExtension = path.parse(directoryItem.name).name; - const subcommand = spec as unknown as Fig.Subcommand; - const generatedCode = generateGolang( - subcommand, - filenameWithoutExtension - ); - await fsAsync.writeFile( - path.join( - process.cwd(), - "..", - "specs", - `${filenameWithoutExtension}.go` - ), - generatedCode - ); - }) + const progressBar = new ProgressBar( + "extracting [:bar] :percent (:current/:total)", + { + total: directoryItems.length, + complete: "=", + incomplete: " ", + width: 20, + } ); + const dirItemChunks = chunk(directoryItems, 10); + for (const dirChunk of dirItemChunks) { + await Promise.all( + dirChunk.map(async (directoryItem) => { + if (!directoryItem.isFile()) { + progressBar.tick(); + return; + } + if (exclusions.has(directoryItem.name)) { + progressBar.tick(); + return; + } + + const spec: Fig.Spec = ( + await import(path.join(basePath, directoryItem.name)) + ).default; + + if (typeof spec === "function") { + progressBar.tick(); + return; + } + + const filenameWithoutExtension = path.parse(directoryItem.name).name; + const subcommand = spec as unknown as Fig.Subcommand; + const generatedCode = generateGolang( + subcommand, + filenameWithoutExtension + ); + await fsAsync.writeFile( + path.join( + process.cwd(), + "..", + "specs", + `${filenameWithoutExtension}.go` + ), + generatedCode + ); + progressBar.tick(); + }) + ); + } + const generatedFilesPath = path.join(process.cwd(), "..", "specs"); child_process.exec(`gofmt -w ${generatedFilesPath}`); }; +const generateTemplate = (template: Fig.Template): string => { + switch (template) { + case "filepaths": + return "model.TemplateFilepaths"; + case "folders": + return "model.TemplateFolders"; + case "history": + return "model.TemplateHistory"; + case "help": + return "model.TemplateHelp"; + } + throw Error("unknown template value"); +}; + +const genName = (name: Fig.SingleOrArray | undefined): string => { + if (name == null) return ""; + return Array.isArray(name) + ? `Name: []string{${name.map((n) => `"${n}"`).join(",")}},` + : `Name: "${name}",`; +}; + +const genDescription = (description: string | undefined): string => { + return description != null + ? `Description: "${clearAllNewlines(description)}",` + : ""; +}; + +const genTemplates = ( + template: Fig.SingleOrArray | undefined +): string => { + if (template == null) return ""; + const templates = Array.isArray(template) ? template : [template]; + return `Templates: []model.Template{${templates + .map((t) => generateTemplate(t)) + .join(",")}},`; +}; + +const genOptions = (options: Fig.Option[] | undefined): string => { + return options != null ? generateOptions(options) : ""; +}; + +const genArgs = (args: Fig.SingleOrArray | undefined): string => { + return args != null ? generateArgs(args) : ""; +}; + +const genSubcommands = ( + subcommand: Fig.SingleOrArray | undefined +): string => { + if (subcommand == null) return ""; + const subcommands = Array.isArray(subcommand) ? subcommand : [subcommand]; + return `Subcommands: []model.Subcommand{${subcommands + .map((s) => generateSubcommand(s)) + .join(",")}},`; +}; + const generateArgs = (args: Fig.SingleOrArray): string => { - return ""; + const argList = Array.isArray(args) ? args : [args]; + const generatedArgs = argList.map((arg) => { + return `{ + ${genTemplates(arg.template)} + ${genName(arg.name)} + ${genDescription(arg.description)} + },`; + }); + return `Args: []model.Arg{${generatedArgs}},`; }; const generateOptions = (options: Fig.Option[]): string => { - return ""; + const generatedOptions = options.map((option) => { + return `{ + ${genName(option.name)} + ${genDescription(option.description)} + ${genArgs(option.args)} + }`; + }); + return `Options: []model.Option{${generatedOptions}},`; }; const generateSubcommand = (subcommand: Fig.Subcommand): string => { - const name = Array.isArray(subcommand.name) - ? `Name: []string{${subcommand.name.map((n) => `"${n}"`).join(",")}},` - : `Name: "${subcommand.name}",`; - - const description = - subcommand.description != null - ? `Description: "${subcommand.description}",` - : ""; - - const args = subcommand.args != null ? generateArgs(subcommand.args) : ""; - const options = - subcommand.options != null ? generateOptions(subcommand.options) : ""; - return `model.Subcommand{ - ${name} - ${description} - ${args} - ${options} - }`.replaceAll(/\s/g, ""); + ${genName(subcommand.name)} + ${genDescription(subcommand.description)} + ${genArgs(subcommand.args)} + ${genOptions(subcommand.options)} + ${genSubcommands(subcommand.subcommands)} + }`; }; const generateGolang = ( diff --git a/autocomplete/extract/package-lock.json b/autocomplete/extract/package-lock.json index 83a16d1..00ed8aa 100644 --- a/autocomplete/extract/package-lock.json +++ b/autocomplete/extract/package-lock.json @@ -4,8 +4,19 @@ "requires": true, "packages": { "": { + "dependencies": { + "@fig/autocomplete-generators": "^2.2.5", + "@fig/autocomplete-helpers": "^1.0.7", + "@fig/autocomplete-hooks": "^1.0.2", + "@withfig/api-bindings": "^0.30.3", + "progress": "^2.0.3", + "semver": "^7.5.4", + "strip-json-comments": "^5.0.1", + "yaml": "^2.3.2" + }, "devDependencies": { "@types/node": "^20.6.0", + "@types/progress": "^2.0.5", "@withfig/autocomplete-types": "^1.28.0", "ts-node": "^10.9.1", "typescript": "^5.2.2" @@ -23,6 +34,53 @@ "node": ">=12" } }, + "node_modules/@fig/autocomplete-generators": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@fig/autocomplete-generators/-/autocomplete-generators-2.2.5.tgz", + "integrity": "sha512-FBwrK3U32fMTc0Zij0ixdbqFc4Yt0hkEqhTzsjUGlA0WXkEw+/r8jswmZkwjaj2+W+1yqMWyuk4BaY6FQAdfuA==" + }, + "node_modules/@fig/autocomplete-helpers": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@fig/autocomplete-helpers/-/autocomplete-helpers-1.0.7.tgz", + "integrity": "sha512-5jq01q2JtaLAjl8t3hOvE9GOp4a4Agj7YmxlBxRjuSwJY3qskfx/mdAgOX2qjgxZ74bHONAxQ1hzudwSICqZFg==", + "dependencies": { + "semver": "^7.3.5", + "typescript": "^4.6.3" + } + }, + "node_modules/@fig/autocomplete-helpers/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@fig/autocomplete-hooks": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@fig/autocomplete-hooks/-/autocomplete-hooks-1.0.2.tgz", + "integrity": "sha512-4T/UVZcrJjnv9zy+hF8ifIrlCd0DeZ0I+t3Zy8dvKqFXeYnMM+z/SdQYb8SvTwu5VdRcQtvYnJHINks8jySG+A==", + "dependencies": { + "@withfig/api-bindings": "^0.29.3", + "react": "^18.2.0" + } + }, + "node_modules/@fig/autocomplete-hooks/node_modules/@withfig/api-bindings": { + "version": "0.29.4", + "resolved": "https://registry.npmjs.org/@withfig/api-bindings/-/api-bindings-0.29.4.tgz", + "integrity": "sha512-+HrbQdHaXQdGTRQzlqM4GQwm7aBQ8SA6PD5tNSZh0Z71jcVhNeFc/vMBf07A9KqwkMTjojOiJYXz1YkQN/eZEA==", + "dependencies": { + "long": "^5.2.1", + "protobufjs": "^7.1.2" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -48,6 +106,60 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -75,8 +187,28 @@ "node_modules/@types/node": { "version": "20.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", - "dev": true + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + }, + "node_modules/@types/progress": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.5.tgz", + "integrity": "sha512-ZYYVc/kSMkhH9W/4dNK/sLNra3cnkfT2nJyOAIDY+C2u6w72wa0s1aXAezVtbTsnN8HID1uhXCrLwDE2ZXpplg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@withfig/api-bindings": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/@withfig/api-bindings/-/api-bindings-0.30.3.tgz", + "integrity": "sha512-BDtsXb888gzUq6NPPvnHW8InLRM2zqgvF1Eq7ns/tlducbygRbHvM71UPkJekDkLMTUhkFCOhrtsWIR3LuESmw==", + "dependencies": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + }, + "engines": { + "node": ">=16" + } }, "node_modules/@withfig/autocomplete-types": { "version": "1.28.0", @@ -126,12 +258,111 @@ "node": ">=0.3.1" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -194,6 +425,19 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "engines": { + "node": ">= 14" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -214,6 +458,47 @@ "@jridgewell/trace-mapping": "0.3.9" } }, + "@fig/autocomplete-generators": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@fig/autocomplete-generators/-/autocomplete-generators-2.2.5.tgz", + "integrity": "sha512-FBwrK3U32fMTc0Zij0ixdbqFc4Yt0hkEqhTzsjUGlA0WXkEw+/r8jswmZkwjaj2+W+1yqMWyuk4BaY6FQAdfuA==" + }, + "@fig/autocomplete-helpers": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@fig/autocomplete-helpers/-/autocomplete-helpers-1.0.7.tgz", + "integrity": "sha512-5jq01q2JtaLAjl8t3hOvE9GOp4a4Agj7YmxlBxRjuSwJY3qskfx/mdAgOX2qjgxZ74bHONAxQ1hzudwSICqZFg==", + "requires": { + "semver": "^7.3.5", + "typescript": "^4.6.3" + }, + "dependencies": { + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==" + } + } + }, + "@fig/autocomplete-hooks": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@fig/autocomplete-hooks/-/autocomplete-hooks-1.0.2.tgz", + "integrity": "sha512-4T/UVZcrJjnv9zy+hF8ifIrlCd0DeZ0I+t3Zy8dvKqFXeYnMM+z/SdQYb8SvTwu5VdRcQtvYnJHINks8jySG+A==", + "requires": { + "@withfig/api-bindings": "^0.29.3", + "react": "^18.2.0" + }, + "dependencies": { + "@withfig/api-bindings": { + "version": "0.29.4", + "resolved": "https://registry.npmjs.org/@withfig/api-bindings/-/api-bindings-0.29.4.tgz", + "integrity": "sha512-+HrbQdHaXQdGTRQzlqM4GQwm7aBQ8SA6PD5tNSZh0Z71jcVhNeFc/vMBf07A9KqwkMTjojOiJYXz1YkQN/eZEA==", + "requires": { + "long": "^5.2.1", + "protobufjs": "^7.1.2" + } + } + } + }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", @@ -236,6 +521,60 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -263,8 +602,25 @@ "@types/node": { "version": "20.6.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", - "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==", - "dev": true + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" + }, + "@types/progress": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.5.tgz", + "integrity": "sha512-ZYYVc/kSMkhH9W/4dNK/sLNra3cnkfT2nJyOAIDY+C2u6w72wa0s1aXAezVtbTsnN8HID1uhXCrLwDE2ZXpplg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@withfig/api-bindings": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/@withfig/api-bindings/-/api-bindings-0.30.3.tgz", + "integrity": "sha512-BDtsXb888gzUq6NPPvnHW8InLRM2zqgvF1Eq7ns/tlducbygRbHvM71UPkJekDkLMTUhkFCOhrtsWIR3LuESmw==", + "requires": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + } }, "@withfig/autocomplete-types": { "version": "1.28.0", @@ -302,12 +658,83 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==" + }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -341,6 +768,16 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==" + }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/autocomplete/extract/package.json b/autocomplete/extract/package.json index f9e0bbb..251274d 100644 --- a/autocomplete/extract/package.json +++ b/autocomplete/extract/package.json @@ -4,8 +4,19 @@ }, "devDependencies": { "@types/node": "^20.6.0", + "@types/progress": "^2.0.5", "@withfig/autocomplete-types": "^1.28.0", "ts-node": "^10.9.1", "typescript": "^5.2.2" + }, + "dependencies": { + "@fig/autocomplete-generators": "^2.2.5", + "@fig/autocomplete-helpers": "^1.0.7", + "@fig/autocomplete-hooks": "^1.0.2", + "@withfig/api-bindings": "^0.30.3", + "progress": "^2.0.3", + "semver": "^7.5.4", + "strip-json-comments": "^5.0.1", + "yaml": "^2.3.2" } } \ No newline at end of file diff --git a/autocomplete/extract/tsconfig.json b/autocomplete/extract/tsconfig.json index 3a4eadf..1ae7509 100644 --- a/autocomplete/extract/tsconfig.json +++ b/autocomplete/extract/tsconfig.json @@ -1,12 +1,24 @@ { + "ts-node": { + "transpileOnly": true, + "files": true, + "compilerOptions": { + "module": "commonjs" + } + }, "compilerOptions": { "target": "esnext", "module": "commonjs", + "moduleResolution": "node", "declaration": true, "outDir": "./build", "strict": true, "esModuleInterop": true, - "types": ["@withfig/autocomplete-types", "node"] + "types": ["@withfig/autocomplete-types", "node"], + // rule changes + "noImplicitAny": false, + "strictNullChecks": false, + "allowSyntheticDefaultImports": true }, "exclude": ["node_modules/", "fig/", "build/"] } diff --git a/autocomplete/model/model.go b/autocomplete/model/model.go index 04bd63c..85a3db8 100644 --- a/autocomplete/model/model.go +++ b/autocomplete/model/model.go @@ -3,8 +3,9 @@ package model type Subcommand struct { Name interface{} //single or array string, required Description string - Args interface{} //single or array Arg, optional + Args []Arg Options []Option + Subcommands []Subcommand } type Option struct { @@ -14,9 +15,9 @@ type Option struct { } type Arg struct { - Name string //single, optional - Description string //single, optional - Template Template //single, optional + Name string //single, optional + Description string //single, optional + Templates []Template } type Template string @@ -25,6 +26,7 @@ const ( TemplateFilepaths Template = "filepaths" TemplateFolders Template = "folders" TemplateHistory Template = "history" + TemplateHelp Template = "help" ) var ( diff --git a/autocomplete/specs/afplay.go b/autocomplete/specs/afplay.go deleted file mode 100644 index b5a9b9e..0000000 --- a/autocomplete/specs/afplay.go +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by autocomplete/extract/extract.ts. DO NOT EDIT. - -package specs - -import ( - "github.com/cpendery/clac/autocomplete/model" -) - -func init() { - Specs["afplay"] = model.Subcommand{Name: "afplay", Description: "AudioFilePlay"} -}