You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-09-16 08:56:40 +02:00
Optimised loading time by getting rid of launcher and caching module paths
This commit is contained in:
@@ -141,12 +141,6 @@ class Application {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg == '--completion' || arg == '--compbash' || arg == '--compgen') {
|
|
||||||
// Handled by omelette
|
|
||||||
argv.splice(0, 1);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arg == '--autocompletion') {
|
if (arg == '--autocompletion') {
|
||||||
this.autocompletion_.active = true;
|
this.autocompletion_.active = true;
|
||||||
argv.splice(0, 1);
|
argv.splice(0, 1);
|
||||||
@@ -175,6 +169,9 @@ class Application {
|
|||||||
if (arg == '--ac-line') {
|
if (arg == '--ac-line') {
|
||||||
if (!nextArg) throw new Error(_('Usage: %s', '--ac-line <line>'));
|
if (!nextArg) throw new Error(_('Usage: %s', '--ac-line <line>'));
|
||||||
let line = nextArg.replace(/\|__QUOTE__\|/g, '"');
|
let line = nextArg.replace(/\|__QUOTE__\|/g, '"');
|
||||||
|
line = line.replace(/\|__SPACE__\|/g, ' ');
|
||||||
|
line = line.replace(/\|__OPEN_RB__\|/g, '(');
|
||||||
|
line = line.replace(/\|__OPEN_CB__\|/g, ')');
|
||||||
line = line.split('|__SEP__|');
|
line = line.split('|__SEP__|');
|
||||||
this.autocompletion_.line = line;
|
this.autocompletion_.line = line;
|
||||||
argv.splice(0, 2);
|
argv.splice(0, 2);
|
||||||
@@ -280,8 +277,9 @@ class Application {
|
|||||||
async commandMetadata() {
|
async commandMetadata() {
|
||||||
if (this.commandMetadata_) return this.commandMetadata_;
|
if (this.commandMetadata_) return this.commandMetadata_;
|
||||||
|
|
||||||
|
const osTmpdir = require('os-tmpdir');
|
||||||
const storage = require('node-persist');
|
const storage = require('node-persist');
|
||||||
await storage.init({ dir: 'commandMetadata', ttl: 1000 * 60 * 60 * 24 });
|
await storage.init({ dir: osTmpdir() + '/commandMetadata', ttl: 1000 * 60 * 60 * 24 });
|
||||||
|
|
||||||
let output = await storage.getItem('metadata');
|
let output = await storage.getItem('metadata');
|
||||||
if (Setting.value('env') != 'dev' && output) {
|
if (Setting.value('env') != 'dev' && output) {
|
||||||
@@ -326,7 +324,7 @@ class Application {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async execCommand(argv) {
|
async execCommand(argv) {
|
||||||
if (!argv.length) throw new Error('Empty command');
|
if (!argv.length) return this.execCommand(['help']);
|
||||||
const commandName = argv[0];
|
const commandName = argv[0];
|
||||||
this.activeCommand_ = this.findCommandByName(commandName);
|
this.activeCommand_ = this.findCommandByName(commandName);
|
||||||
const cmdArgs = cliUtils.makeCommandArgs(this.activeCommand_, argv);
|
const cmdArgs = cliUtils.makeCommandArgs(this.activeCommand_, argv);
|
||||||
@@ -416,6 +414,8 @@ class Application {
|
|||||||
if (!items.length) return;
|
if (!items.length) return;
|
||||||
for (let i = 0; i < items.length; i++) {
|
for (let i = 0; i < items.length; i++) {
|
||||||
items[i] = items[i].replace(/ /g, '\\ ');
|
items[i] = items[i].replace(/ /g, '\\ ');
|
||||||
|
items[i] = items[i].replace(/\(/g, '\\(');
|
||||||
|
items[i] = items[i].replace(/\)/g, '\\)');
|
||||||
}
|
}
|
||||||
console.info(items.join("\n"));
|
console.info(items.join("\n"));
|
||||||
}
|
}
|
||||||
|
@@ -1,39 +0,0 @@
|
|||||||
import { app } from './app.js';
|
|
||||||
import { Folder } from 'lib/models/folder.js';
|
|
||||||
import { Note } from 'lib/models/note.js';
|
|
||||||
|
|
||||||
// For now, to go around this issue: https://github.com/dthree/vorpal/issues/114
|
|
||||||
function quotePromptArg(s) {
|
|
||||||
if (s.indexOf(' ') >= 0) {
|
|
||||||
return '"' + s + '"';
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
function autocompleteFolders() {
|
|
||||||
return Folder.all({ includeConflictFolder: true }).then((folders) => {
|
|
||||||
let output = [];
|
|
||||||
for (let i = 0; i < folders.length; i++) {
|
|
||||||
output.push(quotePromptArg(folders[i].title));
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function autocompleteItems() {
|
|
||||||
let items = [];
|
|
||||||
if (!app().currentFolder()) {
|
|
||||||
items = await Folder.all();
|
|
||||||
} else {
|
|
||||||
items = await Note.previews(app().currentFolder().id);
|
|
||||||
}
|
|
||||||
|
|
||||||
let output = [];
|
|
||||||
for (let i = 0; i < items.length; i++) {
|
|
||||||
output.push(quotePromptArg(items[i].title));
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
export { autocompleteFolders, autocompleteItems };
|
|
@@ -14,6 +14,9 @@ _|__APPNAME__|_completion() {
|
|||||||
ESCAPED_LINE="$ESCAPED_LINE|__SEP__|"
|
ESCAPED_LINE="$ESCAPED_LINE|__SEP__|"
|
||||||
fi
|
fi
|
||||||
WORD="${WORD/\"/|__QUOTE__|}"
|
WORD="${WORD/\"/|__QUOTE__|}"
|
||||||
|
WORD="${WORD/\\(/|__OPEN_RB__|}"
|
||||||
|
WORD="${WORD/\\)/|__CLOSE_RB__|}"
|
||||||
|
WORD="${WORD/\\ /|__SPACE__|}"
|
||||||
ESCAPED_LINE="$ESCAPED_LINE$WORD"
|
ESCAPED_LINE="$ESCAPED_LINE$WORD"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
@@ -16,10 +16,6 @@ class BaseCommand {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
options() {
|
options() {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,6 @@ import { _ } from 'lib/locale.js';
|
|||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
@@ -22,10 +21,6 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
let title = args['note'];
|
let title = args['note'];
|
||||||
|
|
||||||
|
@@ -4,7 +4,6 @@ import { _ } from 'lib/locale.js';
|
|||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
@@ -16,10 +15,6 @@ class Command extends BaseCommand {
|
|||||||
return _('Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.');
|
return _('Duplicates the notes matching <note> to [notebook]. If no notebook is specified the note is duplicated in the current notebook.');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
let folder = null;
|
let folder = null;
|
||||||
if (args['notebook']) {
|
if (args['notebook']) {
|
||||||
|
@@ -6,7 +6,6 @@ import { Folder } from 'lib/models/folder.js';
|
|||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { Setting } from 'lib/models/setting.js';
|
import { Setting } from 'lib/models/setting.js';
|
||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
import { cliUtils } from './cli-utils.js';
|
import { cliUtils } from './cli-utils.js';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
@@ -19,10 +18,6 @@ class Command extends BaseCommand {
|
|||||||
return _('Edit note.');
|
return _('Edit note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
let watcher = null;
|
let watcher = null;
|
||||||
let newNote = null;
|
let newNote = null;
|
||||||
|
@@ -4,7 +4,6 @@ import { _ } from 'lib/locale.js';
|
|||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
@@ -16,10 +15,6 @@ class Command extends BaseCommand {
|
|||||||
return _('Displays a geolocation URL for the note.');
|
return _('Displays a geolocation URL for the note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
let title = args['note'];
|
let title = args['note'];
|
||||||
|
|
||||||
|
@@ -26,6 +26,8 @@ class Command extends BaseCommand {
|
|||||||
output.push(renderCommandHelp(command));
|
output.push(renderCommandHelp(command));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
output.sort();
|
||||||
|
|
||||||
this.log(output.join("\n\n"));
|
this.log(output.join("\n\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,7 +5,6 @@ import { BaseModel } from 'lib/base-model.js';
|
|||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Setting } from 'lib/models/setting.js';
|
import { Setting } from 'lib/models/setting.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { autocompleteFolders } from './autocomplete.js';
|
|
||||||
import { sprintf } from 'sprintf-js';
|
import { sprintf } from 'sprintf-js';
|
||||||
import { time } from 'lib/time-utils.js';
|
import { time } from 'lib/time-utils.js';
|
||||||
import { cliUtils } from './cli-utils.js';
|
import { cliUtils } from './cli-utils.js';
|
||||||
@@ -31,10 +30,6 @@ class Command extends BaseCommand {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteFolders };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
let pattern = args['note-pattern'];
|
let pattern = args['note-pattern'];
|
||||||
let items = [];
|
let items = [];
|
||||||
|
@@ -4,7 +4,6 @@ import { _ } from 'lib/locale.js';
|
|||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
@@ -16,10 +15,6 @@ class Command extends BaseCommand {
|
|||||||
return _('Moves the notes matching <note-pattern> to [notebook].');
|
return _('Moves the notes matching <note-pattern> to [notebook].');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
const pattern = args['note-pattern'];
|
const pattern = args['note-pattern'];
|
||||||
const destination = args['notebook'];
|
const destination = args['notebook'];
|
||||||
|
@@ -5,7 +5,6 @@ import { BaseItem } from 'lib/models/base-item.js';
|
|||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
import { cliUtils } from './cli-utils.js';
|
import { cliUtils } from './cli-utils.js';
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
@@ -18,10 +17,6 @@ class Command extends BaseCommand {
|
|||||||
return _('Deletes the notes matching <note-pattern>.');
|
return _('Deletes the notes matching <note-pattern>.');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
options() {
|
options() {
|
||||||
return [
|
return [
|
||||||
['-f, --force', _('Deletes the items without asking for confirmation.')],
|
['-f, --force', _('Deletes the items without asking for confirmation.')],
|
||||||
|
@@ -4,7 +4,6 @@ import { _ } from 'lib/locale.js';
|
|||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { autocompleteFolders } from './autocomplete.js';
|
|
||||||
import { sprintf } from 'sprintf-js';
|
import { sprintf } from 'sprintf-js';
|
||||||
import { time } from 'lib/time-utils.js';
|
import { time } from 'lib/time-utils.js';
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ class Command extends BaseCommand {
|
|||||||
if (idx >= 0) {
|
if (idx >= 0) {
|
||||||
let fragment = note.body.substr(Math.max(0, idx - fragmentLength / 2), fragmentLength);
|
let fragment = note.body.substr(Math.max(0, idx - fragmentLength / 2), fragmentLength);
|
||||||
fragment = fragment.replace(/\n/g, ' ');
|
fragment = fragment.replace(/\n/g, ' ');
|
||||||
line = sprintf('%s: %s / %s: %s', BaseModel.shortId(note.id), note.title, parent.title, fragment);
|
line = sprintf('%s: %s / %s: %s', BaseModel.shortId(note.id), parent.title, note.title, fragment);
|
||||||
} else {
|
} else {
|
||||||
line = sprintf('%s: %s / %s', BaseModel.shortId(note.id), parent.title, note.title);
|
line = sprintf('%s: %s / %s', BaseModel.shortId(note.id), parent.title, note.title);
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import { BaseModel } from 'lib/base-model.js';
|
|||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { BaseItem } from 'lib/models/base-item.js';
|
import { BaseItem } from 'lib/models/base-item.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
@@ -17,10 +16,6 @@ class Command extends BaseCommand {
|
|||||||
return _('Sets the property <name> of the given <note> to the given [value].');
|
return _('Sets the property <name> of the given <note> to the given [value].');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
hidden() {
|
hidden() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@@ -5,7 +5,6 @@ import { BaseModel } from 'lib/base-model.js';
|
|||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { Note } from 'lib/models/note.js';
|
import { Note } from 'lib/models/note.js';
|
||||||
import { time } from 'lib/time-utils.js';
|
import { time } from 'lib/time-utils.js';
|
||||||
import { autocompleteItems } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
@@ -17,10 +16,6 @@ class Command extends BaseCommand {
|
|||||||
return _('<todo-command> can either be "toggle" or "clear". Use "toggle" to toggle the given todo between completed and uncompleted state (If the target is a regular note it will be converted to a todo). Use "clear" to convert the todo back to a regular note.');
|
return _('<todo-command> can either be "toggle" or "clear". Use "toggle" to toggle the given todo between completed and uncompleted state (If the target is a regular note it will be converted to a todo). Use "clear" to convert the todo back to a regular note.');
|
||||||
}
|
}
|
||||||
|
|
||||||
autocomplete() {
|
|
||||||
return { data: autocompleteItems };
|
|
||||||
}
|
|
||||||
|
|
||||||
async action(args) {
|
async action(args) {
|
||||||
const action = args['todo-command'];
|
const action = args['todo-command'];
|
||||||
const pattern = args['note-pattern'];
|
const pattern = args['note-pattern'];
|
||||||
|
@@ -3,7 +3,6 @@ import { app } from './app.js';
|
|||||||
import { _ } from 'lib/locale.js';
|
import { _ } from 'lib/locale.js';
|
||||||
import { BaseModel } from 'lib/base-model.js';
|
import { BaseModel } from 'lib/base-model.js';
|
||||||
import { Folder } from 'lib/models/folder.js';
|
import { Folder } from 'lib/models/folder.js';
|
||||||
import { autocompleteFolders } from './autocomplete.js';
|
|
||||||
|
|
||||||
class Command extends BaseCommand {
|
class Command extends BaseCommand {
|
||||||
|
|
||||||
|
@@ -58,6 +58,13 @@ process.on("SIGINT", async function() {
|
|||||||
await application.cancelCurrentCommand();
|
await application.cancelCurrentCommand();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
process.stdout.on('error', function( err ) {
|
||||||
|
// https://stackoverflow.com/questions/12329816/error-write-epipe-when-piping-node-output-to-head#15884508
|
||||||
|
if (err.code == "EPIPE") {
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
application.start().catch((error) => {
|
application.start().catch((error) => {
|
||||||
console.error(_('Fatal error:'));
|
console.error(_('Fatal error:'));
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
@@ -1,43 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
|
|
||||||
// Because all the files in the "lib" directory are included as "lib/file.js" it
|
|
||||||
// means "lib" must be in NODE_PATH, however modifying the global NODE_PATH
|
|
||||||
// variable would be messy. So instead, the path is set temporarily just before running
|
|
||||||
// the app. To do this, this wrapper is needed.
|
|
||||||
// See https://gist.github.com/branneman/8048520
|
|
||||||
// Original wrapper code from https://gist.github.com/branneman/8775568
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var spawn = require('child_process').spawn;
|
|
||||||
|
|
||||||
var args = ['main.js'];
|
|
||||||
|
|
||||||
if (process.argv[1].indexOf('joplindev') >= 0) {
|
|
||||||
args.push('--profile');
|
|
||||||
args.push('/mnt/d/Temp/TestNotes2');
|
|
||||||
args.push('--stack-trace-enabled');
|
|
||||||
args.push('--log-level');
|
|
||||||
args.push('debug');
|
|
||||||
args.push('--env');
|
|
||||||
args.push('dev');
|
|
||||||
}
|
|
||||||
|
|
||||||
var processArgs = process.argv.splice(2);
|
|
||||||
args = args.concat(processArgs);
|
|
||||||
|
|
||||||
var opt = {
|
|
||||||
cwd: __dirname,
|
|
||||||
env: (function() {
|
|
||||||
process.env.NODE_PATH = '.'; // Enables require() calls relative to the cwd :)
|
|
||||||
return process.env;
|
|
||||||
}()),
|
|
||||||
stdio: [process.stdin, process.stdout, process.stderr]
|
|
||||||
};
|
|
||||||
|
|
||||||
var app = spawn(process.execPath, args, opt);
|
|
||||||
|
|
||||||
// Pass on the exit code
|
|
||||||
app.on('close', (code) => {
|
|
||||||
process.exit(code);
|
|
||||||
});
|
|
@@ -1,15 +1,31 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
|
||||||
|
|
||||||
CLIENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
mkdir -p "$CLIENT_DIR/build"
|
# require('cache-require-paths');
|
||||||
rm -f "$CLIENT_DIR/app/lib"
|
|
||||||
ln -s "$CLIENT_DIR/../ReactNativeClient/lib" "$CLIENT_DIR/app"
|
mkdir -p "$ROOT_DIR/build"
|
||||||
cp "$CLIENT_DIR/package.json" "$CLIENT_DIR/build"
|
rm -f "$ROOT_DIR/app/lib"
|
||||||
cp "$CLIENT_DIR/app/autocompletion_template.txt" "$CLIENT_DIR/build"
|
ln -s "$ROOT_DIR/../ReactNativeClient/lib" "$ROOT_DIR/app"
|
||||||
|
|
||||||
npm run build
|
npm run build
|
||||||
#yarn run build
|
|
||||||
|
|
||||||
#NODE_PATH="$CLIENT_DIR/build" node "$CLIENT_DIR/build/build-translation.js" --silent
|
cp "$ROOT_DIR/package.json" "$ROOT_DIR/build"
|
||||||
|
cp "$ROOT_DIR/app/autocompletion_template.txt" "$ROOT_DIR/build"
|
||||||
|
|
||||||
|
# Add modules on top of main.js:
|
||||||
|
# - cache-require-paths to cache require() calls
|
||||||
|
# - app-module-path so that lib/something paths can be resolved.
|
||||||
|
|
||||||
|
PACKAGE_MD5=$(cat "$ROOT_DIR/package.json.md5")
|
||||||
|
MAIN_PATH="$ROOT_DIR/build/main.js"
|
||||||
|
LINE_TO_ADD="var osTmpdir = require('os-tmpdir'); process.env.CACHE_REQUIRE_PATHS_FILE = osTmpdir() + '/joplin-module-path-cache-$PACKAGE_MD5'; require('cache-require-paths'); require('app-module-path').addPath(__dirname);"
|
||||||
|
RESULT="$(grep "$LINE_TO_ADD" "$MAIN_PATH")"
|
||||||
|
if [[ -z "$RESULT" ]]; then
|
||||||
|
echo "Adding extra modules..."
|
||||||
|
sed -i "2i $LINE_TO_ADD" "$MAIN_PATH"
|
||||||
|
else
|
||||||
|
echo "Extra modules already added."
|
||||||
|
fi
|
||||||
|
|
||||||
|
NODE_PATH="$ROOT_DIR/build" node "$ROOT_DIR/build/build-translation.js" --silent
|
@@ -123,6 +123,9 @@ msgstr ""
|
|||||||
msgid "Displays a geolocation URL for the note."
|
msgid "Displays a geolocation URL for the note."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Displays usage information."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports an Evernote notebook file (.enex file)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -240,6 +243,13 @@ msgstr ""
|
|||||||
msgid "Synchronisation is already in progress."
|
msgid "Synchronisation is already in progress."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"Lock file is already being hold. If you know that no synchronisation is "
|
||||||
|
"taking place, you may delete the lock file at \"%s\" and resume the "
|
||||||
|
"operation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation target: %s (%s)"
|
msgid "Synchronisation target: %s (%s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -253,7 +263,7 @@ msgstr ""
|
|||||||
msgid "Done."
|
msgid "Done."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling... Please wait."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -285,6 +295,10 @@ msgstr ""
|
|||||||
msgid "%s %s (%s)"
|
msgid "%s %s (%s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Received %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -340,6 +354,9 @@ msgstr ""
|
|||||||
msgid "Last error: %s (stacktrace in log)."
|
msgid "Last error: %s (stacktrace in log)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Cancelling..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@@ -135,6 +135,10 @@ msgstr ""
|
|||||||
msgid "Displays a geolocation URL for the note."
|
msgid "Displays a geolocation URL for the note."
|
||||||
msgstr "Afficher l'URL de l'emplacement de la note."
|
msgstr "Afficher l'URL de l'emplacement de la note."
|
||||||
|
|
||||||
|
#, fuzzy
|
||||||
|
msgid "Displays usage information."
|
||||||
|
msgstr "Affiche les informations de version"
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports an Evernote notebook file (.enex file)."
|
||||||
msgstr "Importer un carnet Evernote (fichier .enex)."
|
msgstr "Importer un carnet Evernote (fichier .enex)."
|
||||||
|
|
||||||
@@ -268,6 +272,13 @@ msgstr ""
|
|||||||
msgid "Synchronisation is already in progress."
|
msgid "Synchronisation is already in progress."
|
||||||
msgstr "La synchronisation est déjà en cours."
|
msgstr "La synchronisation est déjà en cours."
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"Lock file is already being hold. If you know that no synchronisation is "
|
||||||
|
"taking place, you may delete the lock file at \"%s\" and resume the "
|
||||||
|
"operation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation target: %s (%s)"
|
msgid "Synchronisation target: %s (%s)"
|
||||||
msgstr "Cible de la synchronisation : %s (%s)"
|
msgstr "Cible de la synchronisation : %s (%s)"
|
||||||
@@ -281,7 +292,8 @@ msgstr "Commencement de la synchronisation..."
|
|||||||
msgid "Done."
|
msgid "Done."
|
||||||
msgstr "Terminé."
|
msgstr "Terminé."
|
||||||
|
|
||||||
msgid "Cancelling..."
|
#, fuzzy
|
||||||
|
msgid "Cancelling... Please wait."
|
||||||
msgstr "Annulation..."
|
msgstr "Annulation..."
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
@@ -324,6 +336,10 @@ msgstr "Affiche les informations de version"
|
|||||||
msgid "%s %s (%s)"
|
msgid "%s %s (%s)"
|
||||||
msgstr "%s %s (%s)"
|
msgstr "%s %s (%s)"
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Received %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr "Erreur fatale :"
|
msgstr "Erreur fatale :"
|
||||||
|
|
||||||
@@ -385,6 +401,9 @@ msgstr "Etat : %s."
|
|||||||
msgid "Last error: %s (stacktrace in log)."
|
msgid "Last error: %s (stacktrace in log)."
|
||||||
msgstr "Dernière erreur : %s (Plus d'information dans le journal d'erreurs)"
|
msgstr "Dernière erreur : %s (Plus d'information dans le journal d'erreurs)"
|
||||||
|
|
||||||
|
msgid "Cancelling..."
|
||||||
|
msgstr "Annulation..."
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr "Terminé : %s"
|
msgstr "Terminé : %s"
|
||||||
|
@@ -123,6 +123,9 @@ msgstr ""
|
|||||||
msgid "Displays a geolocation URL for the note."
|
msgid "Displays a geolocation URL for the note."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Displays usage information."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Imports an Evernote notebook file (.enex file)."
|
msgid "Imports an Evernote notebook file (.enex file)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -240,6 +243,13 @@ msgstr ""
|
|||||||
msgid "Synchronisation is already in progress."
|
msgid "Synchronisation is already in progress."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid ""
|
||||||
|
"Lock file is already being hold. If you know that no synchronisation is "
|
||||||
|
"taking place, you may delete the lock file at \"%s\" and resume the "
|
||||||
|
"operation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Synchronisation target: %s (%s)"
|
msgid "Synchronisation target: %s (%s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
@@ -253,7 +263,7 @@ msgstr ""
|
|||||||
msgid "Done."
|
msgid "Done."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Cancelling..."
|
msgid "Cancelling... Please wait."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -285,6 +295,10 @@ msgstr ""
|
|||||||
msgid "%s %s (%s)"
|
msgid "%s %s (%s)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#, javascript-format
|
||||||
|
msgid "Received %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Fatal error:"
|
msgid "Fatal error:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -340,6 +354,9 @@ msgstr ""
|
|||||||
msgid "Last error: %s (stacktrace in log)."
|
msgid "Last error: %s (stacktrace in log)."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Cancelling..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Completed: %s"
|
msgid "Completed: %s"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"app-module-path": "^2.2.0",
|
"app-module-path": "^2.2.0",
|
||||||
"babel-plugin-transform-runtime": "^6.23.0",
|
"babel-plugin-transform-runtime": "^6.23.0",
|
||||||
|
"cache-require-paths": "^0.3.0",
|
||||||
"follow-redirects": "^1.2.4",
|
"follow-redirects": "^1.2.4",
|
||||||
"form-data": "^2.1.4",
|
"form-data": "^2.1.4",
|
||||||
"fs-extra": "^3.0.1",
|
"fs-extra": "^3.0.1",
|
||||||
@@ -23,6 +24,7 @@
|
|||||||
"md5": "^2.2.1",
|
"md5": "^2.2.1",
|
||||||
"moment": "^2.18.1",
|
"moment": "^2.18.1",
|
||||||
"node-fetch": "^1.7.1",
|
"node-fetch": "^1.7.1",
|
||||||
|
"node-persist": "^2.1.0",
|
||||||
"os-tmpdir": "^1.0.2",
|
"os-tmpdir": "^1.0.2",
|
||||||
"promise": "^7.1.1",
|
"promise": "^7.1.1",
|
||||||
"proper-lockfile": "^2.0.1",
|
"proper-lockfile": "^2.0.1",
|
||||||
|
1
CliClient/package.json.md5
Normal file
1
CliClient/package.json.md5
Normal file
@@ -0,0 +1 @@
|
|||||||
|
e625fbfb1ba79ea6396d492047ab9f17
|
@@ -3,6 +3,7 @@ set -e
|
|||||||
|
|
||||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
npm version patch
|
npm version patch
|
||||||
|
$SCRIPT_DIR/update-package-md5.sh
|
||||||
bash $SCRIPT_DIR/build.sh
|
bash $SCRIPT_DIR/build.sh
|
||||||
cp "$SCRIPT_DIR/package.json" build/
|
cp "$SCRIPT_DIR/package.json" build/
|
||||||
cp "$SCRIPT_DIR/../README.md" build/
|
cp "$SCRIPT_DIR/../README.md" build/
|
||||||
|
5
CliClient/update-package-md5.sh
Normal file
5
CliClient/update-package-md5.sh
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
MD5="$(cat "$ROOT_DIR/package.json" | md5sum | cut -d' ' -f 1)"
|
||||||
|
echo -n $MD5 > "$ROOT_DIR/package.json.md5"
|
@@ -754,6 +754,10 @@ browserslist@^2.1.2:
|
|||||||
caniuse-lite "^1.0.30000704"
|
caniuse-lite "^1.0.30000704"
|
||||||
electron-to-chromium "^1.3.16"
|
electron-to-chromium "^1.3.16"
|
||||||
|
|
||||||
|
cache-require-paths@^0.3.0:
|
||||||
|
version "0.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/cache-require-paths/-/cache-require-paths-0.3.0.tgz#12a6075a3e4988da4c22f218e29485663e4c4a63"
|
||||||
|
|
||||||
camelcase@^4.1.0:
|
camelcase@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
|
||||||
@@ -1218,6 +1222,13 @@ invariant@^2.2.0, invariant@^2.2.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
loose-envify "^1.0.0"
|
loose-envify "^1.0.0"
|
||||||
|
|
||||||
|
is-absolute@^0.2.6:
|
||||||
|
version "0.2.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb"
|
||||||
|
dependencies:
|
||||||
|
is-relative "^0.2.1"
|
||||||
|
is-windows "^0.2.0"
|
||||||
|
|
||||||
is-binary-path@^1.0.0:
|
is-binary-path@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
|
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
|
||||||
@@ -1300,6 +1311,12 @@ is-primitive@^2.0.0:
|
|||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
|
resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
|
||||||
|
|
||||||
|
is-relative@^0.2.1:
|
||||||
|
version "0.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5"
|
||||||
|
dependencies:
|
||||||
|
is-unc-path "^0.1.1"
|
||||||
|
|
||||||
is-stream@^1.0.1:
|
is-stream@^1.0.1:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
|
||||||
@@ -1308,6 +1325,16 @@ is-typedarray@~1.0.0:
|
|||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
|
||||||
|
|
||||||
|
is-unc-path@^0.1.1:
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9"
|
||||||
|
dependencies:
|
||||||
|
unc-path-regex "^0.1.0"
|
||||||
|
|
||||||
|
is-windows@^0.2.0:
|
||||||
|
version "0.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c"
|
||||||
|
|
||||||
is2@0.0.9:
|
is2@0.0.9:
|
||||||
version "0.0.9"
|
version "0.0.9"
|
||||||
resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629"
|
resolved "https://registry.yarnpkg.com/is2/-/is2-0.0.9.tgz#119556d1d1651a41ba105af803267c80b299f629"
|
||||||
@@ -1489,7 +1516,7 @@ minimist@^1.2.0:
|
|||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
|
||||||
|
|
||||||
"mkdirp@>=0.5 0", mkdirp@^0.5.1:
|
"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -1522,6 +1549,14 @@ node-fetch@^1.7.1:
|
|||||||
encoding "^0.1.11"
|
encoding "^0.1.11"
|
||||||
is-stream "^1.0.1"
|
is-stream "^1.0.1"
|
||||||
|
|
||||||
|
node-persist@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/node-persist/-/node-persist-2.1.0.tgz#e652bbf3885a04dad6a353d74176177c83914707"
|
||||||
|
dependencies:
|
||||||
|
is-absolute "^0.2.6"
|
||||||
|
mkdirp "~0.5.1"
|
||||||
|
q "~1.1.1"
|
||||||
|
|
||||||
node-pre-gyp@^0.6.36, node-pre-gyp@~0.6.31:
|
node-pre-gyp@^0.6.36, node-pre-gyp@~0.6.31:
|
||||||
version "0.6.36"
|
version "0.6.36"
|
||||||
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
|
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
|
||||||
@@ -1685,6 +1720,10 @@ q@0.9.7:
|
|||||||
version "0.9.7"
|
version "0.9.7"
|
||||||
resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
|
resolved "https://registry.yarnpkg.com/q/-/q-0.9.7.tgz#4de2e6cb3b29088c9e4cbc03bf9d42fb96ce2f75"
|
||||||
|
|
||||||
|
q@~1.1.1:
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/q/-/q-1.1.2.tgz#6357e291206701d99f197ab84e57e8ad196f2a89"
|
||||||
|
|
||||||
qs@~6.4.0:
|
qs@~6.4.0:
|
||||||
version "6.4.0"
|
version "6.4.0"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
|
||||||
@@ -2006,6 +2045,10 @@ uid-number@^0.0.6:
|
|||||||
version "0.0.6"
|
version "0.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
|
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
|
||||||
|
|
||||||
|
unc-path-regex@^0.1.0:
|
||||||
|
version "0.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
|
||||||
|
|
||||||
universalify@^0.1.0:
|
universalify@^0.1.0:
|
||||||
version "0.1.1"
|
version "0.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
|
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7"
|
||||||
|
Reference in New Issue
Block a user