mirror of
https://github.com/laurent22/joplin.git
synced 2025-03-11 14:09:55 +02:00
Tools: Setup test framework for CLI app
This commit is contained in:
parent
3dd008ae9a
commit
7992fe5b63
@ -78,6 +78,12 @@ readme/
|
|||||||
packages/app-cli/app/LinkSelector.d.ts
|
packages/app-cli/app/LinkSelector.d.ts
|
||||||
packages/app-cli/app/LinkSelector.js
|
packages/app-cli/app/LinkSelector.js
|
||||||
packages/app-cli/app/LinkSelector.js.map
|
packages/app-cli/app/LinkSelector.js.map
|
||||||
|
packages/app-cli/app/base-command.d.ts
|
||||||
|
packages/app-cli/app/base-command.js
|
||||||
|
packages/app-cli/app/base-command.js.map
|
||||||
|
packages/app-cli/app/command-done.test.d.ts
|
||||||
|
packages/app-cli/app/command-done.test.js
|
||||||
|
packages/app-cli/app/command-done.test.js.map
|
||||||
packages/app-cli/app/command-e2ee.d.ts
|
packages/app-cli/app/command-e2ee.d.ts
|
||||||
packages/app-cli/app/command-e2ee.js
|
packages/app-cli/app/command-e2ee.js
|
||||||
packages/app-cli/app/command-e2ee.js.map
|
packages/app-cli/app/command-e2ee.js.map
|
||||||
@ -93,6 +99,12 @@ packages/app-cli/app/command-testing.js.map
|
|||||||
packages/app-cli/app/services/plugins/PluginRunner.d.ts
|
packages/app-cli/app/services/plugins/PluginRunner.d.ts
|
||||||
packages/app-cli/app/services/plugins/PluginRunner.js
|
packages/app-cli/app/services/plugins/PluginRunner.js
|
||||||
packages/app-cli/app/services/plugins/PluginRunner.js.map
|
packages/app-cli/app/services/plugins/PluginRunner.js.map
|
||||||
|
packages/app-cli/app/setupCommand.d.ts
|
||||||
|
packages/app-cli/app/setupCommand.js
|
||||||
|
packages/app-cli/app/setupCommand.js.map
|
||||||
|
packages/app-cli/app/utils/testUtils.d.ts
|
||||||
|
packages/app-cli/app/utils/testUtils.js
|
||||||
|
packages/app-cli/app/utils/testUtils.js.map
|
||||||
packages/app-cli/tests/HtmlToMd.d.ts
|
packages/app-cli/tests/HtmlToMd.d.ts
|
||||||
packages/app-cli/tests/HtmlToMd.js
|
packages/app-cli/tests/HtmlToMd.js
|
||||||
packages/app-cli/tests/HtmlToMd.js.map
|
packages/app-cli/tests/HtmlToMd.js.map
|
||||||
|
12
.gitignore
vendored
12
.gitignore
vendored
@ -66,6 +66,12 @@ docs/**/*.mustache
|
|||||||
packages/app-cli/app/LinkSelector.d.ts
|
packages/app-cli/app/LinkSelector.d.ts
|
||||||
packages/app-cli/app/LinkSelector.js
|
packages/app-cli/app/LinkSelector.js
|
||||||
packages/app-cli/app/LinkSelector.js.map
|
packages/app-cli/app/LinkSelector.js.map
|
||||||
|
packages/app-cli/app/base-command.d.ts
|
||||||
|
packages/app-cli/app/base-command.js
|
||||||
|
packages/app-cli/app/base-command.js.map
|
||||||
|
packages/app-cli/app/command-done.test.d.ts
|
||||||
|
packages/app-cli/app/command-done.test.js
|
||||||
|
packages/app-cli/app/command-done.test.js.map
|
||||||
packages/app-cli/app/command-e2ee.d.ts
|
packages/app-cli/app/command-e2ee.d.ts
|
||||||
packages/app-cli/app/command-e2ee.js
|
packages/app-cli/app/command-e2ee.js
|
||||||
packages/app-cli/app/command-e2ee.js.map
|
packages/app-cli/app/command-e2ee.js.map
|
||||||
@ -81,6 +87,12 @@ packages/app-cli/app/command-testing.js.map
|
|||||||
packages/app-cli/app/services/plugins/PluginRunner.d.ts
|
packages/app-cli/app/services/plugins/PluginRunner.d.ts
|
||||||
packages/app-cli/app/services/plugins/PluginRunner.js
|
packages/app-cli/app/services/plugins/PluginRunner.js
|
||||||
packages/app-cli/app/services/plugins/PluginRunner.js.map
|
packages/app-cli/app/services/plugins/PluginRunner.js.map
|
||||||
|
packages/app-cli/app/setupCommand.d.ts
|
||||||
|
packages/app-cli/app/setupCommand.js
|
||||||
|
packages/app-cli/app/setupCommand.js.map
|
||||||
|
packages/app-cli/app/utils/testUtils.d.ts
|
||||||
|
packages/app-cli/app/utils/testUtils.js
|
||||||
|
packages/app-cli/app/utils/testUtils.js.map
|
||||||
packages/app-cli/tests/HtmlToMd.d.ts
|
packages/app-cli/tests/HtmlToMd.d.ts
|
||||||
packages/app-cli/tests/HtmlToMd.js
|
packages/app-cli/tests/HtmlToMd.js
|
||||||
packages/app-cli/tests/HtmlToMd.js.map
|
packages/app-cli/tests/HtmlToMd.js.map
|
||||||
|
@ -16,6 +16,7 @@ const { cliUtils } = require('./cli-utils.js');
|
|||||||
const Cache = require('@joplin/lib/Cache');
|
const Cache = require('@joplin/lib/Cache');
|
||||||
const RevisionService = require('@joplin/lib/services/RevisionService').default;
|
const RevisionService = require('@joplin/lib/services/RevisionService').default;
|
||||||
const shim = require('@joplin/lib/shim').default;
|
const shim = require('@joplin/lib/shim').default;
|
||||||
|
const setupCommand = require('./setupCommand').default;
|
||||||
|
|
||||||
class Application extends BaseApplication {
|
class Application extends BaseApplication {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -114,46 +115,12 @@ class Application extends BaseApplication {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
stdout(text) {
|
setupCommand(cmd) {
|
||||||
return this.gui().stdout(text);
|
return setupCommand(cmd, t => this.stdout(t), () => this.store(), () => this.gui());
|
||||||
}
|
}
|
||||||
|
|
||||||
setupCommand(cmd) {
|
stdout(text) {
|
||||||
cmd.setStdout(text => {
|
return this.gui().stdout(text);
|
||||||
return this.stdout(text);
|
|
||||||
});
|
|
||||||
|
|
||||||
cmd.setDispatcher(action => {
|
|
||||||
if (this.store()) {
|
|
||||||
return this.store().dispatch(action);
|
|
||||||
} else {
|
|
||||||
return () => {};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cmd.setPrompt(async (message, options) => {
|
|
||||||
if (!options) options = {};
|
|
||||||
if (!options.type) options.type = 'boolean';
|
|
||||||
if (!options.booleanAnswerDefault) options.booleanAnswerDefault = 'y';
|
|
||||||
if (!options.answers) options.answers = options.booleanAnswerDefault === 'y' ? [_('Y'), _('n')] : [_('N'), _('y')];
|
|
||||||
|
|
||||||
if (options.type === 'boolean') {
|
|
||||||
message += ` (${options.answers.join('/')})`;
|
|
||||||
}
|
|
||||||
|
|
||||||
let answer = await this.gui().prompt('', `${message} `, options);
|
|
||||||
|
|
||||||
if (options.type === 'boolean') {
|
|
||||||
if (answer === null) return false; // Pressed ESCAPE
|
|
||||||
if (!answer) answer = options.answers[0];
|
|
||||||
const positiveIndex = options.booleanAnswerDefault === 'y' ? 0 : 1;
|
|
||||||
return answer.toLowerCase() === options.answers[positiveIndex].toLowerCase();
|
|
||||||
} else {
|
|
||||||
return answer;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return cmd;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async exit(code = 0) {
|
async exit(code = 0) {
|
||||||
@ -180,6 +147,7 @@ class Application extends BaseApplication {
|
|||||||
if (!this.allCommandsLoaded_) {
|
if (!this.allCommandsLoaded_) {
|
||||||
fs.readdirSync(__dirname).forEach(path => {
|
fs.readdirSync(__dirname).forEach(path => {
|
||||||
if (path.indexOf('command-') !== 0) return;
|
if (path.indexOf('command-') !== 0) return;
|
||||||
|
if (path.endsWith('.test.js')) return;
|
||||||
const ext = fileExtension(path);
|
const ext = fileExtension(path);
|
||||||
if (ext !== 'js') return;
|
if (ext !== 'js') return;
|
||||||
|
|
||||||
|
@ -1,97 +1,97 @@
|
|||||||
const { _ } = require('@joplin/lib/locale');
|
"use strict";
|
||||||
const { reg } = require('@joplin/lib/registry.js');
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||||
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||||
|
return new (P || (P = Promise))(function (resolve, reject) {
|
||||||
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||||
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||||
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||||
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const locale_1 = require("@joplin/lib/locale");
|
||||||
|
const registry_js_1 = require("@joplin/lib/registry.js");
|
||||||
class BaseCommand {
|
class BaseCommand {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.stdout_ = null;
|
this.stdout_ = null;
|
||||||
this.prompt_ = null;
|
this.prompt_ = null;
|
||||||
}
|
}
|
||||||
|
usage() {
|
||||||
usage() {
|
throw new Error('Usage not defined');
|
||||||
throw new Error('Usage not defined');
|
}
|
||||||
}
|
encryptionCheck(item) {
|
||||||
|
if (item && item.encryption_applied)
|
||||||
encryptionCheck(item) {
|
throw new Error((0, locale_1._)('Cannot change encrypted item'));
|
||||||
if (item && item.encryption_applied) throw new Error(_('Cannot change encrypted item'));
|
}
|
||||||
}
|
description() {
|
||||||
|
throw new Error('Description not defined');
|
||||||
description() {
|
}
|
||||||
throw new Error('Description not defined');
|
action(_args) {
|
||||||
}
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
throw new Error('Action not defined');
|
||||||
async action() {
|
});
|
||||||
throw new Error('Action not defined');
|
}
|
||||||
}
|
compatibleUis() {
|
||||||
|
return ['cli', 'gui'];
|
||||||
compatibleUis() {
|
}
|
||||||
return ['cli', 'gui'];
|
supportsUi(ui) {
|
||||||
}
|
return this.compatibleUis().indexOf(ui) >= 0;
|
||||||
|
}
|
||||||
supportsUi(ui) {
|
options() {
|
||||||
return this.compatibleUis().indexOf(ui) >= 0;
|
return [];
|
||||||
}
|
}
|
||||||
|
hidden() {
|
||||||
options() {
|
return false;
|
||||||
return [];
|
}
|
||||||
}
|
enabled() {
|
||||||
|
return true;
|
||||||
hidden() {
|
}
|
||||||
return false;
|
cancellable() {
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
enabled() {
|
cancel() {
|
||||||
return true;
|
return __awaiter(this, void 0, void 0, function* () { });
|
||||||
}
|
}
|
||||||
|
name() {
|
||||||
cancellable() {
|
const r = this.usage().split(' ');
|
||||||
return false;
|
return r[0];
|
||||||
}
|
}
|
||||||
|
setDispatcher(fn) {
|
||||||
async cancel() {}
|
this.dispatcher_ = fn;
|
||||||
|
}
|
||||||
name() {
|
dispatch(action) {
|
||||||
const r = this.usage().split(' ');
|
if (!this.dispatcher_)
|
||||||
return r[0];
|
throw new Error('Dispatcher not defined');
|
||||||
}
|
return this.dispatcher_(action);
|
||||||
|
}
|
||||||
setDispatcher(fn) {
|
setStdout(fn) {
|
||||||
this.dispatcher_ = fn;
|
this.stdout_ = fn;
|
||||||
}
|
}
|
||||||
|
stdout(text) {
|
||||||
dispatch(action) {
|
if (this.stdout_)
|
||||||
if (!this.dispatcher_) throw new Error('Dispatcher not defined');
|
this.stdout_(text);
|
||||||
return this.dispatcher_(action);
|
}
|
||||||
}
|
setPrompt(fn) {
|
||||||
|
this.prompt_ = fn;
|
||||||
setStdout(fn) {
|
}
|
||||||
this.stdout_ = fn;
|
prompt(message, options = null) {
|
||||||
}
|
return __awaiter(this, void 0, void 0, function* () {
|
||||||
|
if (!this.prompt_)
|
||||||
stdout(text) {
|
throw new Error('Prompt is undefined');
|
||||||
if (this.stdout_) this.stdout_(text);
|
return yield this.prompt_(message, options);
|
||||||
}
|
});
|
||||||
|
}
|
||||||
setPrompt(fn) {
|
metadata() {
|
||||||
this.prompt_ = fn;
|
return {
|
||||||
}
|
name: this.name(),
|
||||||
|
usage: this.usage(),
|
||||||
async prompt(message, options = null) {
|
options: this.options(),
|
||||||
if (!this.prompt_) throw new Error('Prompt is undefined');
|
hidden: this.hidden(),
|
||||||
return await this.prompt_(message, options);
|
};
|
||||||
}
|
}
|
||||||
|
logger() {
|
||||||
metadata() {
|
return registry_js_1.reg.logger();
|
||||||
return {
|
}
|
||||||
name: this.name(),
|
|
||||||
usage: this.usage(),
|
|
||||||
options: this.options(),
|
|
||||||
hidden: this.hidden(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
logger() {
|
|
||||||
return reg.logger();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
exports.default = BaseCommand;
|
||||||
module.exports = { BaseCommand };
|
//# sourceMappingURL=base-command.js.map
|
95
packages/app-cli/app/base-command.ts
Normal file
95
packages/app-cli/app/base-command.ts
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
import { reg } from '@joplin/lib/registry.js';
|
||||||
|
|
||||||
|
export default class BaseCommand {
|
||||||
|
|
||||||
|
protected stdout_: any = null;
|
||||||
|
protected prompt_: any = null;
|
||||||
|
protected dispatcher_: any;
|
||||||
|
|
||||||
|
usage(): string {
|
||||||
|
throw new Error('Usage not defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
encryptionCheck(item: any) {
|
||||||
|
if (item && item.encryption_applied) throw new Error(_('Cannot change encrypted item'));
|
||||||
|
}
|
||||||
|
|
||||||
|
description() {
|
||||||
|
throw new Error('Description not defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
async action(_args: any) {
|
||||||
|
throw new Error('Action not defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
compatibleUis() {
|
||||||
|
return ['cli', 'gui'];
|
||||||
|
}
|
||||||
|
|
||||||
|
supportsUi(ui: string) {
|
||||||
|
return this.compatibleUis().indexOf(ui) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
options(): any[] {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
hidden() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellable() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async cancel() {}
|
||||||
|
|
||||||
|
name() {
|
||||||
|
const r = this.usage().split(' ');
|
||||||
|
return r[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
setDispatcher(fn: Function) {
|
||||||
|
this.dispatcher_ = fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(action: any) {
|
||||||
|
if (!this.dispatcher_) throw new Error('Dispatcher not defined');
|
||||||
|
return this.dispatcher_(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
setStdout(fn: Function) {
|
||||||
|
this.stdout_ = fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
stdout(text: string) {
|
||||||
|
if (this.stdout_) this.stdout_(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
setPrompt(fn: Function) {
|
||||||
|
this.prompt_ = fn;
|
||||||
|
}
|
||||||
|
|
||||||
|
async prompt(message: string, options: any = null) {
|
||||||
|
if (!this.prompt_) throw new Error('Prompt is undefined');
|
||||||
|
return await this.prompt_(message, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata() {
|
||||||
|
return {
|
||||||
|
name: this.name(),
|
||||||
|
usage: this.usage(),
|
||||||
|
options: this.options(),
|
||||||
|
hidden: this.hidden(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
logger() {
|
||||||
|
return reg.logger();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
const BaseItem = require('@joplin/lib/models/BaseItem').default;
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
const { toTitleCase } = require('@joplin/lib/string-utils.js');
|
const { toTitleCase } = require('@joplin/lib/string-utils.js');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { _, setLocale } = require('@joplin/lib/locale');
|
const { _, setLocale } = require('@joplin/lib/locale');
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
27
packages/app-cli/app/command-done.test.ts
Normal file
27
packages/app-cli/app/command-done.test.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import Note from '@joplin/lib/models/Note';
|
||||||
|
import { NoteEntity } from '@joplin/lib/services/database/types';
|
||||||
|
import { setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils';
|
||||||
|
import { setupCommandForTesting, setupApplication } from './utils/testUtils';
|
||||||
|
const Command = require('./command-done');
|
||||||
|
|
||||||
|
describe('command-done', () => {
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await setupDatabaseAndSynchronizer(1);
|
||||||
|
await switchClient(1);
|
||||||
|
await setupApplication();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should make a note as "done"', async () => {
|
||||||
|
const note = await Note.save({ title: 'hello', is_todo: 1, todo_completed: 0 });
|
||||||
|
|
||||||
|
const command = setupCommandForTesting(Command);
|
||||||
|
|
||||||
|
const now = Date.now();
|
||||||
|
await command.action({ note: note.id });
|
||||||
|
|
||||||
|
const checkNote: NoteEntity = await Note.load(note.id);
|
||||||
|
expect(checkNote.todo_completed).toBeGreaterThanOrEqual(now);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
const Folder = require('@joplin/lib/models/Folder').default;
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
const Tag = require('@joplin/lib/models/Tag').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
import { _ } from '@joplin/lib/locale';
|
import { _ } from '@joplin/lib/locale';
|
||||||
import EncryptionService from '@joplin/lib/services/e2ee/EncryptionService';
|
import EncryptionService from '@joplin/lib/services/e2ee/EncryptionService';
|
||||||
import DecryptionWorker from '@joplin/lib/services/DecryptionWorker';
|
import DecryptionWorker from '@joplin/lib/services/DecryptionWorker';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { splitCommandString } = require('@joplin/lib/string-utils.js');
|
const { splitCommandString } = require('@joplin/lib/string-utils.js');
|
||||||
const uuid = require('@joplin/lib/uuid').default;
|
const uuid = require('@joplin/lib/uuid').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
const Setting = require('@joplin/lib/models/Setting').default;
|
||||||
const ReportService = require('@joplin/lib/services/ReportService').default;
|
const ReportService = require('@joplin/lib/services/ReportService').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const InteropService = require('@joplin/lib/services/interop/InteropService').default;
|
const InteropService = require('@joplin/lib/services/interop/InteropService').default;
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { renderCommandHelp } = require('./help-utils.js');
|
const { renderCommandHelp } = require('./help-utils.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const InteropService = require('@joplin/lib/services/interop/InteropService').default;
|
const InteropService = require('@joplin/lib/services/interop/InteropService').default;
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
const { cliUtils } = require('./cli-utils.js');
|
const { cliUtils } = require('./cli-utils.js');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
const Folder = require('@joplin/lib/models/Folder').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
const Folder = require('@joplin/lib/models/Folder').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Note = require('@joplin/lib/models/Note').default;
|
const Note = require('@joplin/lib/models/Note').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
const Folder = require('@joplin/lib/models/Folder').default;
|
const Folder = require('@joplin/lib/models/Folder').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
const Setting = require('@joplin/lib/models/Setting').default;
|
||||||
const Logger = require('@joplin/lib/Logger').default;
|
const Logger = require('@joplin/lib/Logger').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -2,7 +2,7 @@ import Setting, { SettingStorage } from '@joplin/lib/models/Setting';
|
|||||||
import { SettingItemType } from '@joplin/lib/services/plugins/api/types';
|
import { SettingItemType } from '@joplin/lib/services/plugins/api/types';
|
||||||
import shim from '@joplin/lib/shim';
|
import shim from '@joplin/lib/shim';
|
||||||
|
|
||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
|
|
||||||
function settingTypeToSchemaType(type: SettingItemType): string {
|
function settingTypeToSchemaType(type: SettingItemType): string {
|
||||||
const map: Record<SettingItemType, string> = {
|
const map: Record<SettingItemType, string> = {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const Setting = require('@joplin/lib/models/Setting').default;
|
const Setting = require('@joplin/lib/models/Setting').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
|
@ -6,7 +6,7 @@ import ResourceFetcher from '@joplin/lib/services/ResourceFetcher';
|
|||||||
import Synchronizer from '@joplin/lib/Synchronizer';
|
import Synchronizer from '@joplin/lib/Synchronizer';
|
||||||
import { masterKeysWithoutPassword } from '@joplin/lib/services/e2ee/utils';
|
import { masterKeysWithoutPassword } from '@joplin/lib/services/e2ee/utils';
|
||||||
import { appTypeToLockType } from '@joplin/lib/services/synchronizer/LockHandler';
|
import { appTypeToLockType } from '@joplin/lib/services/synchronizer/LockHandler';
|
||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js');
|
const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js');
|
||||||
const { reg } = require('@joplin/lib/registry.js');
|
const { reg } = require('@joplin/lib/registry.js');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const Tag = require('@joplin/lib/models/Tag').default;
|
const Tag = require('@joplin/lib/models/Tag').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
import { reg } from '@joplin/lib/registry';
|
import { reg } from '@joplin/lib/registry';
|
||||||
import Note from '@joplin/lib/models/Note';
|
import Note from '@joplin/lib/models/Note';
|
||||||
import uuid from '@joplin/lib/uuid';
|
import uuid from '@joplin/lib/uuid';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
|
|
||||||
const CommandDone = require('./command-done.js');
|
const CommandDone = require('./command-done.js');
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { app } = require('./app.js');
|
const { app } = require('./app.js');
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const BaseModel = require('@joplin/lib/BaseModel').default;
|
const BaseModel = require('@joplin/lib/BaseModel').default;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const { BaseCommand } = require('./base-command.js');
|
const BaseCommand = require('./base-command').default;
|
||||||
const { _ } = require('@joplin/lib/locale');
|
const { _ } = require('@joplin/lib/locale');
|
||||||
const versionInfo = require('@joplin/lib/versionInfo').default;
|
const versionInfo = require('@joplin/lib/versionInfo').default;
|
||||||
|
|
||||||
|
39
packages/app-cli/app/setupCommand.ts
Normal file
39
packages/app-cli/app/setupCommand.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import { _ } from '@joplin/lib/locale';
|
||||||
|
|
||||||
|
export default (cmd: any, stdout: Function, store: Function, gui: Function) => {
|
||||||
|
cmd.setStdout((text: string) => {
|
||||||
|
return stdout(text);
|
||||||
|
});
|
||||||
|
|
||||||
|
cmd.setDispatcher((action: any) => {
|
||||||
|
if (store()) {
|
||||||
|
return store().dispatch(action);
|
||||||
|
} else {
|
||||||
|
return () => {};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
cmd.setPrompt(async (message: string, options: any) => {
|
||||||
|
if (!options) options = {};
|
||||||
|
if (!options.type) options.type = 'boolean';
|
||||||
|
if (!options.booleanAnswerDefault) options.booleanAnswerDefault = 'y';
|
||||||
|
if (!options.answers) options.answers = options.booleanAnswerDefault === 'y' ? [_('Y'), _('n')] : [_('N'), _('y')];
|
||||||
|
|
||||||
|
if (options.type === 'boolean') {
|
||||||
|
message += ` (${options.answers.join('/')})`;
|
||||||
|
}
|
||||||
|
|
||||||
|
let answer = await gui().prompt('', `${message} `, options);
|
||||||
|
|
||||||
|
if (options.type === 'boolean') {
|
||||||
|
if (answer === null) return false; // Pressed ESCAPE
|
||||||
|
if (!answer) answer = options.answers[0];
|
||||||
|
const positiveIndex = options.booleanAnswerDefault === 'y' ? 0 : 1;
|
||||||
|
return answer.toLowerCase() === options.answers[positiveIndex].toLowerCase();
|
||||||
|
} else {
|
||||||
|
return answer;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return cmd;
|
||||||
|
};
|
17
packages/app-cli/app/utils/testUtils.ts
Normal file
17
packages/app-cli/app/utils/testUtils.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
const { app } = require('../app');
|
||||||
|
import Folder from '@joplin/lib/models/Folder';
|
||||||
|
import BaseCommand from '../base-command';
|
||||||
|
import setupCommand from '../setupCommand';
|
||||||
|
|
||||||
|
export const setupCommandForTesting = (CommandClass: any, stdout: Function = null): BaseCommand => {
|
||||||
|
const command = new CommandClass();
|
||||||
|
setupCommand(command, stdout, null, null);
|
||||||
|
return command;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const setupApplication = async () => {
|
||||||
|
// We create a notebook and set it as default since most commands require
|
||||||
|
// such notebook.
|
||||||
|
await Folder.save({ title: 'default' });
|
||||||
|
await app().refreshCurrentFolder();
|
||||||
|
};
|
@ -27,6 +27,7 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
testMatch: [
|
testMatch: [
|
||||||
'**/tests/**/*.js',
|
'**/tests/**/*.js',
|
||||||
|
'**/*.test.js',
|
||||||
],
|
],
|
||||||
|
|
||||||
testPathIgnorePatterns: [
|
testPathIgnorePatterns: [
|
||||||
|
Loading…
x
Reference in New Issue
Block a user