内容简介:CLUI is a collection of JavaScript libraries for building command-line interfaces with context-aware autocomplete.
CLUI
CLUI is a collection of JavaScript libraries for building command-line interfaces with context-aware autocomplete.
Packages
@replit/clui-input
@replit/clui-input
implements the logic for mapping text input to suggestions and a potential run
function.
import input from '@replit/clui-input';
const rootCommand = {
commands: {
open: {
commands: {
sesame: {
run: (args) => {
/* do something */
},
},
},
},
},
};
const update = input({
command: rootCommand,
onUpdate: (updates) => {
/* Update #1: `updates.options` will be
* [
* {
* "value": "open",
* "inputValue": "open",
* "searchValue": "o",
* "cursorTarget": 4
* }
* ]
*/
/* Update #2: `updates.options` will be
* [
* {
* "value": "sesame",
* "inputValue": "open sesame",
* "searchValue": "s",
* "cursorTarget": 12
* }
* ]
*/
},
});
/* Update #1 */
update({ value: 'o', index: 1 });
/* Update #2 */
update({ value: 'open s', index: 6 });
When the input matches a command with a run
function, the onUpdate
callback will include a reference to it.
const update = input({
command: rootCommand,
onUpdate: (updates) => {
// call or store reference to `updates.run` based on user interaction
},
});
update({ value: 'open sesame', index: 6 });
@replit/clui-input
a framework agnostic primitive that can be wrapped by more specific framework or application code (like a react hook). If using react you will most likey want to keep the result of onUpdate
in a state object. For managing dropdown selection UX I highly recommend downshift
.
@replit/clui-session
@replit/clui-session
implements the logic for rendering a list of react children. For building a CLI-style interfaces this can be useful for adding and removing lines when the prompt is submitted.
import React from 'react'
import { render } from 'react-dom'
import Session, { Do } from '@replit/clui-session';
/* `Do` is a helper that exposes the `item` prop
* You will most likey render your own component
* which will get `item` injected as a prop so
* that component can call `item.next` based
* on specific application logic
*/
render(
<Session>
<Do>
{item => <button onClick={item.next}>next 1</button>}
</Do>
<Do>
{item => <button onClick={item.next}>next 2</button>}
</Do>
<Do>
{item => <button onClick={item.next}>next 3</button>}
</Do>
</Session>,
document.getElementById('root'),
);
@replit/clui-gql
@replit/clui-gql
is a utility library for building CLUI
commands from GraphQL introspection
data.
Install
npm install @replit/clui-gql
Usage
To create a tree of CLUI commands call toCommand
and then visit
each command to define a run function.
import { toCommand, visit } from '@replit/clui-gql';
import { introspectionFromSchema } from 'graphql';
import schema from './your-graphql-schema';
// on server
const introspection = introspectionFromSchema(schema);
// on client
const introspection = makeNetworkRequestForData();
// Create a command tree from graphql introspection data. This could be done on
// the server or the client.
const root = toCommand({
// 'query' or 'mutation'
operation: 'query',
// The name of the graphql type that has the fields that act as top level commands
rootTypeName: 'CluiCommands'
// the path at which the above type appears in the graph
mountPath: ['cli', 'admin'],
// GraphQL introspection data
introspectionSchema: introspection.__schema,
// Configure fields and fragments for the output of the GraphQL operation string
output: () => ({
fields: '...Output',
fragments: `
fragment Output on YourOutputTypes {
...on SuccessOutput {
message
}
...on ErrorOutput {
error
}
}`,
}),
});
// Define some application specific behavior for when a command is `run`
visit(root, (command) => {
if (command.outputType !== 'YourOutputTypes') {
// If command does not match an output type you may want do something different.
By omitting the run function the command acts as a namespace for sub-commands.
return;
}
command.run = (options) => {
return <OutputView command={command} options={options} />
}
}
'parseArgs' is a helper for working with args
import { parse } from 'graphql';
import { parseArgs } from '@replit/clui-gql';
const OutputView = (props) => {
// CLIU command generated from graphql
const { command } = props;
// CLUI args
const { args } = props.options;
const parsed = parseArgs({ command, args });
// Handle state for submitting command based on parsed args
if (parsed.missing.required) {
return <HandleMissingArgs />;
}
if (parsed.missing.optional) {
return <PotentiallyShowOptinalInputs />;
}
if (command.query) {
graphQLClient.query(parse(command.query), { variables: parsed.variables })
} else if (command.mutation) {
graphQLClient.mutate(parse(command.mutation), { variables: parsed.variables })
}
// ...some component to communicate above state
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java从入门到精通
李钟尉、马文强、陈丹丹 / 清华大学出版社 / 2008-9 / 59.80元
《Java从入门到精通》(软件开发视频大讲堂)从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。全书共分28章,包括:初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,字符串,数组,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O输入输出,反射,枚举类型与泛......一起来看看 《Java从入门到精通》 这本书的介绍吧!