From 6ea74c268a12325296a1d2e7fc31b02030ddb8bc Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Fri, 12 May 2023 17:42:09 -0300 Subject: use ESM module syntax & minor cleanups The biggest change here is moving various element classes under more scope-specific directories, which helps to avoid circular dependencies and is just cleaner to navigate and expand in the future. Otherwise this is a largely uncritical port to ESM module syntax! There are probably a number of changes and other cleanups that remain much needed. Whenever I make changes to tui-lib it's hard to believe it's already been years since the previous time. First commits are from January 2017, and the code originates a month earlier in KAaRMNoD! --- examples/basic-app.js | 10 +++---- examples/command-line-interface.js | 25 ++++++++++++++++ examples/interfacer-command-line.js | 24 --------------- examples/interfacer-telnet.js | 56 ----------------------------------- examples/label.js | 5 ++-- examples/list-scroll-form.js | 16 +++++----- examples/telnet-interface.js | 59 +++++++++++++++++++++++++++++++++++++ 7 files changed, 100 insertions(+), 95 deletions(-) create mode 100644 examples/command-line-interface.js delete mode 100644 examples/interfacer-command-line.js delete mode 100644 examples/interfacer-telnet.js create mode 100644 examples/telnet-interface.js (limited to 'examples') diff --git a/examples/basic-app.js b/examples/basic-app.js index bf8aa41..c4027d1 100644 --- a/examples/basic-app.js +++ b/examples/basic-app.js @@ -6,14 +6,14 @@ // - Sending a quit-app request via Control-C // // This script cannot actually be used on its own; see the examples on -// interfacers (interfacer-command-line.js and inerfacer-telnet.js) for a +// interfaces (command-line-interface.js and telnet-interface.js) for a // working demo. -const Pane = require('../ui/Pane') -const FocusElement = require('../ui/form/FocusElement') -const TextInput = require('../ui/form/TextInput') +import {TextInput} from 'tui-lib/ui/controls' +import {Pane} from 'tui-lib/ui/presentation' +import {FocusElement} from 'tui-lib/ui/primitives' -module.exports = class AppElement extends FocusElement { +export default class AppElement extends FocusElement { constructor() { super() diff --git a/examples/command-line-interface.js b/examples/command-line-interface.js new file mode 100644 index 0000000..ba1d936 --- /dev/null +++ b/examples/command-line-interface.js @@ -0,0 +1,25 @@ +import {Root} from 'tui-lib/ui/primitives' +import {CommandLineInterface} from 'tui-lib/util/interfaces' + +import AppElement from './basic-app.js' + +const clInterface = new CommandLineInterface() + +clInterface.getScreenSize().then(size => { + const root = new Root(clInterface) + root.w = size.width + root.h = size.height + + const appElement = new AppElement() + root.addChild(appElement) + root.select(appElement) + + appElement.on('quitRequested', () => { + process.exit(0) + }) + + setInterval(() => root.render(), 100) +}).catch(error => { + console.error(error) + process.exit(1) +}) diff --git a/examples/interfacer-command-line.js b/examples/interfacer-command-line.js deleted file mode 100644 index 1da6adf..0000000 --- a/examples/interfacer-command-line.js +++ /dev/null @@ -1,24 +0,0 @@ -const Root = require('../ui/Root') -const CommandLineInterfacer = require('../util/CommandLineInterfacer') -const AppElement = require('./basic-app') - -const interfacer = new CommandLineInterfacer() - -interfacer.getScreenSize().then(size => { - const root = new Root(interfacer) - root.w = size.width - root.h = size.height - - const appElement = new AppElement() - root.addChild(appElement) - root.select(appElement) - - appElement.on('quitRequested', () => { - process.exit(0) - }) - - setInterval(() => root.render(), 100) -}).catch(error => { - console.error(error) - process.exit(1) -}) diff --git a/examples/interfacer-telnet.js b/examples/interfacer-telnet.js deleted file mode 100644 index d7aad43..0000000 --- a/examples/interfacer-telnet.js +++ /dev/null @@ -1,56 +0,0 @@ -// Telnet demo: -// - Basic telnet socket handling using the TelnetInterfacer -// - Handling client's screen size -// - Handling socket being closed by client -// - Handling cleanly closing the socket by hand - -const net = require('net') -const Root = require('../ui/Root') -const TelnetInterfacer = require('../TelnetInterfacer') -const AppElement = require('./basic-app') - -const server = new net.Server(socket => { - const interfacer = new TelnetInterfacer(socket) - - interfacer.getScreenSize().then(size => { - const root = new Root(interfacer) - root.w = size.width - root.h = size.height - - interfacer.on('resize', newSize => { - root.w = newSize.width - root.h = newSize.height - root.fixAllLayout() - }) - - const appElement = new AppElement() - root.addChild(appElement) - root.select(appElement) - - let closed = false - - appElement.on('quitRequested', () => { - if (!closed) { - interfacer.cleanTelnetOptions() - socket.write('Goodbye!\n') - socket.end() - clearInterval(interval) - closed = true - } - }) - - socket.on('close', () => { - if (!closed) { - clearInterval(interval) - closed = true - } - }) - - const interval = setInterval(() => root.render(), 100) - }).catch(error => { - console.error(error) - process.exit(1) - }) -}) - -server.listen(8008) diff --git a/examples/label.js b/examples/label.js index b8992d2..f9599c6 100644 --- a/examples/label.js +++ b/examples/label.js @@ -1,7 +1,8 @@ // An example of basic label usage. -const ansi = require('../util/ansi') -const Label = require('../ui/Label') +import {Label} from 'tui-lib/ui/presentation' + +import * as ansi from 'tui-lib/util/ansi' const label1 = new Label('Hello, world!') const label2 = new Label('I love labels.') diff --git a/examples/list-scroll-form.js b/examples/list-scroll-form.js index c015ddb..fc319a6 100644 --- a/examples/list-scroll-form.js +++ b/examples/list-scroll-form.js @@ -1,13 +1,13 @@ -const ansi = require('../util/ansi') -const Root = require('../ui/Root') -const CommandLineInterfacer = require('../util/CommandLineInterfacer') -const ListScrollForm = require('../ui/form/ListScrollForm') -const Button = require('../ui/form/Button') +import {Root} from 'tui-lib/ui/primitives' +import {Button, ListScrollForm} from 'tui-lib/ui/controls' -const interfacer = new CommandLineInterfacer() +import {CommandLineInterface} from 'tui-lib/util/interfaces' +import * as ansi from 'tui-lib/util/ansi' -interfacer.getScreenSize().then(size => { - const root = new Root(interfacer) +const clInterface = new CommandLineInterface() + +clInterface.getScreenSize().then(size => { + const root = new Root(clInterface) root.w = size.width root.h = size.height diff --git a/examples/telnet-interface.js b/examples/telnet-interface.js new file mode 100644 index 0000000..319786f --- /dev/null +++ b/examples/telnet-interface.js @@ -0,0 +1,59 @@ +// Telnet demo: +// - Basic telnet socket handling using the TelnetInterface +// - Handling client's screen size +// - Handling socket being closed by client +// - Handling cleanly closing the socket by hand + +import net from 'node:net' + +import {Root} from 'tui-lib/ui/primitives' + +import {TelnetInterface} from 'tui-lib/util/interfaces' + +import AppElement from './basic-app.js' + +const server = new net.Server(socket => { + const telnetInterface = new TelnetInterface(socket) + + telnetInterface.getScreenSize().then(size => { + const root = new Root(telnetInterface) + root.w = size.width + root.h = size.height + + telnetInterface.on('resize', newSize => { + root.w = newSize.width + root.h = newSize.height + root.fixAllLayout() + }) + + const appElement = new AppElement() + root.addChild(appElement) + root.select(appElement) + + let closed = false + + appElement.on('quitRequested', () => { + if (!closed) { + telnetInterface.cleanTelnetOptions() + socket.write('Goodbye!\n') + socket.end() + clearInterval(interval) + closed = true + } + }) + + socket.on('close', () => { + if (!closed) { + clearInterval(interval) + closed = true + } + }) + + const interval = setInterval(() => root.render(), 100) + }).catch(error => { + console.error(error) + process.exit(1) + }) +}) + +server.listen(8008) -- cgit 1.3.0-6-gf8a5