lupine.api 1.1.58 → 1.1.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/admin/admin-about.tsx +12 -16
- package/admin/admin-config.tsx +47 -44
- package/admin/admin-css.tsx +3 -3
- package/admin/admin-db.tsx +75 -75
- package/admin/admin-frame-helper.tsx +364 -364
- package/admin/admin-frame.tsx +164 -164
- package/admin/admin-index.tsx +65 -65
- package/admin/admin-login.tsx +111 -111
- package/admin/admin-menu-edit.tsx +637 -637
- package/admin/admin-menu-list.tsx +87 -87
- package/admin/admin-page-edit.tsx +564 -564
- package/admin/admin-page-list.tsx +83 -83
- package/admin/admin-performance.tsx +28 -28
- package/admin/admin-release.tsx +427 -426
- package/admin/admin-resources.tsx +382 -382
- package/admin/admin-shell.tsx +89 -89
- package/admin/admin-table-data.tsx +146 -146
- package/admin/admin-table-list.tsx +230 -230
- package/admin/admin-test-animations.tsx +395 -395
- package/admin/admin-test-component.tsx +823 -808
- package/admin/admin-test-edit.tsx +319 -319
- package/admin/admin-test-themes.tsx +56 -56
- package/admin/admin-tokens.tsx +338 -338
- package/admin/design/admin-design.tsx +174 -174
- package/admin/design/block-grid.tsx +36 -36
- package/admin/design/block-grid1.tsx +21 -21
- package/admin/design/block-paragraph.tsx +19 -19
- package/admin/design/block-title.tsx +19 -19
- package/admin/design/design-block-box.tsx +140 -140
- package/admin/design/drag-data.tsx +24 -24
- package/admin/index.ts +9 -9
- package/admin/package.json +15 -15
- package/admin/tsconfig.json +127 -127
- package/dev/copy-folder.js +32 -32
- package/dev/cp-index-html.js +69 -69
- package/dev/file-utils.js +12 -12
- package/dev/index.js +18 -19
- package/dev/package.json +12 -12
- package/dev/plugin-ifelse.js +168 -168
- package/dev/plugin-ifelse.test.js +37 -37
- package/dev/run-cmd.js +14 -14
- package/dev/send-request.js +12 -12
- package/package.json +55 -55
- package/src/admin-api/admin-api-helper.ts +210 -205
- package/src/admin-api/admin-api.ts +65 -65
- package/src/admin-api/admin-auth.ts +152 -146
- package/src/admin-api/admin-config.ts +94 -84
- package/src/admin-api/admin-csv.ts +94 -94
- package/src/admin-api/admin-db.ts +269 -269
- package/src/admin-api/admin-menu.ts +135 -135
- package/src/admin-api/admin-page.ts +135 -135
- package/src/admin-api/admin-performance.ts +128 -128
- package/src/admin-api/admin-release.ts +706 -700
- package/src/admin-api/admin-resources.ts +318 -318
- package/src/admin-api/admin-token-helper.ts +82 -79
- package/src/admin-api/admin-tokens.ts +90 -90
- package/src/admin-api/index.ts +2 -2
- package/src/admin-api/web-config-api.ts +19 -19
- package/src/api/api-cache.ts +103 -103
- package/src/api/api-helper.ts +44 -44
- package/src/api/api-module.ts +67 -60
- package/src/api/api-router.ts +177 -177
- package/src/api/api-shared-storage.ts +64 -64
- package/src/api/async-storage.ts +5 -5
- package/src/api/debug-service.ts +56 -56
- package/src/api/encode-html.ts +27 -27
- package/src/api/handle-status.ts +75 -75
- package/src/api/index.ts +15 -16
- package/src/api/mini-web-socket.ts +270 -270
- package/src/api/server-content-type.ts +82 -82
- package/src/api/server-render.ts +235 -215
- package/src/api/shell-service.ts +74 -74
- package/src/api/simple-storage.ts +80 -80
- package/src/api/static-server.ts +128 -125
- package/src/api/to-client-delivery.ts +26 -26
- package/src/app/app-cache.ts +55 -55
- package/src/app/app-helper.ts +62 -62
- package/src/app/app-message.ts +109 -109
- package/src/app/app-shared-storage.ts +363 -363
- package/src/app/app-start.ts +136 -136
- package/src/app/cleanup-exit.ts +16 -16
- package/src/app/host-to-path.ts +38 -38
- package/src/app/index.ts +11 -11
- package/src/app/process-dev-requests.ts +130 -130
- package/src/app/web-listener.ts +294 -294
- package/src/app/web-processor.ts +47 -42
- package/src/app/web-server.ts +100 -100
- package/src/common-js/web-env.js +104 -104
- package/src/index.ts +7 -7
- package/src/lang/api-lang-en.ts +26 -26
- package/src/lang/api-lang-zh-cn.ts +27 -27
- package/src/lang/index.ts +2 -2
- package/src/lang/lang-helper.ts +76 -76
- package/src/lang/lang-props.ts +6 -6
- package/src/lib/db/db-helper.ts +23 -23
- package/src/lib/db/db-mysql.ts +249 -250
- package/src/lib/db/db-sqlite.ts +101 -101
- package/src/lib/db/db.spec.ts +28 -28
- package/src/lib/db/db.ts +325 -325
- package/src/lib/db/index.ts +5 -5
- package/src/lib/index.ts +3 -3
- package/src/lib/logger.spec.ts +214 -214
- package/src/lib/logger.ts +281 -281
- package/src/lib/runtime-require.ts +37 -37
- package/src/lib/utils/cookie-util.ts +34 -34
- package/src/lib/utils/crypto.ts +58 -58
- package/src/lib/utils/date-utils.ts +317 -317
- package/src/lib/utils/deep-merge.ts +37 -37
- package/src/lib/utils/delay.ts +12 -12
- package/src/lib/utils/file-setting.ts +55 -55
- package/src/lib/utils/format-bytes.ts +11 -11
- package/src/lib/utils/fs-utils.ts +158 -158
- package/src/lib/utils/get-env.ts +27 -27
- package/src/lib/utils/index.ts +12 -12
- package/src/lib/utils/is-type.ts +48 -48
- package/src/lib/utils/load-env.ts +14 -14
- package/src/lib/utils/pad.ts +6 -6
- package/src/models/api-base.ts +5 -5
- package/src/models/api-module-props.ts +10 -11
- package/src/models/api-router-props.ts +26 -26
- package/src/models/app-cache-props.ts +33 -33
- package/src/models/app-data-props.ts +10 -10
- package/src/models/app-helper-props.ts +6 -6
- package/src/models/app-shared-storage-props.ts +38 -38
- package/src/models/app-start-props.ts +18 -18
- package/src/models/async-storage-props.ts +13 -13
- package/src/models/db-config.ts +30 -30
- package/src/models/host-to-path-props.ts +12 -12
- package/src/models/index.ts +16 -16
- package/src/models/json-object.ts +8 -8
- package/src/models/locals-props.ts +36 -36
- package/src/models/logger-props.ts +84 -84
- package/src/models/simple-storage-props.ts +13 -14
- package/src/models/to-client-delivery-props.ts +6 -6
- package/tsconfig.json +115 -115
- package/dev/plugin-gen-versions.js +0 -20
package/src/lib/db/db-sqlite.ts
CHANGED
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
2
|
-
import { Logger } from '../logger';
|
|
3
|
-
import { Db } from './db';
|
|
4
|
-
import { DbConfig } from '../../models/db-config';
|
|
5
|
-
|
|
6
|
-
const logger = new Logger('db-sqlite');
|
|
7
|
-
export class DbSqlite extends Db {
|
|
8
|
-
db!: Database.Database;
|
|
9
|
-
|
|
10
|
-
constructor(option: DbConfig) {
|
|
11
|
-
super(option);
|
|
12
|
-
|
|
13
|
-
this.db = new Database(option.filename!, {
|
|
14
|
-
nativeBinding: 'node_modules/better-sqlite3/build/Release/better_sqlite3.node',
|
|
15
|
-
});
|
|
16
|
-
this.db.pragma('journal_mode = WAL');
|
|
17
|
-
|
|
18
|
-
if (logger.isDebug()) {
|
|
19
|
-
this.testConnection();
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
close() {
|
|
24
|
-
this.db.close();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
connect() {
|
|
28
|
-
return Promise.resolve();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// INSERT...RETURNING is also supported in MariaDB from 10.5.0
|
|
32
|
-
public nativeQuery(sql: string, params?: any, isSelect?: boolean): Promise<any> {
|
|
33
|
-
return new Promise((resolve, reject) => {
|
|
34
|
-
try {
|
|
35
|
-
let rows: any;
|
|
36
|
-
if (isSelect) {
|
|
37
|
-
rows = params ? this.db.prepare(sql).all(params) : this.db.prepare(sql).all();
|
|
38
|
-
} else {
|
|
39
|
-
const preSql = sql.trim().substring(0, 6).toLowerCase();
|
|
40
|
-
if (preSql.startsWith('insert') || preSql.startsWith('update') || preSql.startsWith('delete')) {
|
|
41
|
-
sql = sql + ' returning *';
|
|
42
|
-
}
|
|
43
|
-
rows = params ? this.db.prepare(sql).run(params) : this.db.prepare(sql).run();
|
|
44
|
-
if (rows && typeof rows.length === 'undefined') {
|
|
45
|
-
// sqlite3 returns id as a record
|
|
46
|
-
rows = [
|
|
47
|
-
{
|
|
48
|
-
...rows,
|
|
49
|
-
id: rows.changes > 0 ? rows.lastInsertRowid : undefined,
|
|
50
|
-
},
|
|
51
|
-
];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (logger.isDebug()) {
|
|
56
|
-
console.log('query:', sql, ', params:', params, ', result:', rows && rows.length);
|
|
57
|
-
}
|
|
58
|
-
resolve(rows);
|
|
59
|
-
} catch (err) {
|
|
60
|
-
console.error('query:', sql, ', params:', params, ', error:', err);
|
|
61
|
-
reject(err);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
public async truncateTable(tableName: string): Promise<any> {
|
|
67
|
-
// sqlite doesn't have DROP command
|
|
68
|
-
return this.execute(`DELETE FROM ${tableName}`);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// public async createTable(table: string, fields: string[]) {
|
|
72
|
-
// // table = this.replacePrefix(table);
|
|
73
|
-
// const query = 'CREATE TABLE ' + table + ' (' + fields.join(',') + ')';
|
|
74
|
-
// return await this.query(query);
|
|
75
|
-
// }
|
|
76
|
-
|
|
77
|
-
public async getTableCount(tableName: string) {
|
|
78
|
-
const result = await this.select(`SELECT COUNT(*) as c FROM ${tableName}`);
|
|
79
|
-
return result[0].c;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
public async getAllTables(addCount = false) {
|
|
83
|
-
const query = `SELECT * FROM sqlite_master WHERE type ='table';`;
|
|
84
|
-
const result = await this.select(query);
|
|
85
|
-
if (result) {
|
|
86
|
-
if (addCount) {
|
|
87
|
-
for (let i in result) {
|
|
88
|
-
result[i].count = await this.getTableCount(result[i].tbl_name);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return result;
|
|
92
|
-
}
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public async getTableInfo(table: string): Promise<any> {
|
|
97
|
-
const query = `PRAGMA table_info(${table});`;
|
|
98
|
-
const result = await this.select(query);
|
|
99
|
-
return result;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { Logger } from '../logger';
|
|
3
|
+
import { Db } from './db';
|
|
4
|
+
import { DbConfig } from '../../models/db-config';
|
|
5
|
+
|
|
6
|
+
const logger = new Logger('db-sqlite');
|
|
7
|
+
export class DbSqlite extends Db {
|
|
8
|
+
db!: Database.Database;
|
|
9
|
+
|
|
10
|
+
constructor(option: DbConfig) {
|
|
11
|
+
super(option);
|
|
12
|
+
|
|
13
|
+
this.db = new Database(option.filename!, {
|
|
14
|
+
nativeBinding: 'node_modules/better-sqlite3/build/Release/better_sqlite3.node',
|
|
15
|
+
});
|
|
16
|
+
this.db.pragma('journal_mode = WAL');
|
|
17
|
+
|
|
18
|
+
if (logger.isDebug()) {
|
|
19
|
+
this.testConnection();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
close() {
|
|
24
|
+
this.db.close();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
connect() {
|
|
28
|
+
return Promise.resolve();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// INSERT...RETURNING is also supported in MariaDB from 10.5.0
|
|
32
|
+
public nativeQuery(sql: string, params?: any, isSelect?: boolean): Promise<any> {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
try {
|
|
35
|
+
let rows: any;
|
|
36
|
+
if (isSelect) {
|
|
37
|
+
rows = params ? this.db.prepare(sql).all(params) : this.db.prepare(sql).all();
|
|
38
|
+
} else {
|
|
39
|
+
const preSql = sql.trim().substring(0, 6).toLowerCase();
|
|
40
|
+
if (preSql.startsWith('insert') || preSql.startsWith('update') || preSql.startsWith('delete')) {
|
|
41
|
+
sql = sql + ' returning *';
|
|
42
|
+
}
|
|
43
|
+
rows = params ? this.db.prepare(sql).run(params) : this.db.prepare(sql).run();
|
|
44
|
+
if (rows && typeof rows.length === 'undefined') {
|
|
45
|
+
// sqlite3 returns id as a record
|
|
46
|
+
rows = [
|
|
47
|
+
{
|
|
48
|
+
...rows,
|
|
49
|
+
id: rows.changes > 0 ? rows.lastInsertRowid : undefined,
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (logger.isDebug()) {
|
|
56
|
+
console.log('query:', sql, ', params:', params, ', result:', rows && rows.length);
|
|
57
|
+
}
|
|
58
|
+
resolve(rows);
|
|
59
|
+
} catch (err) {
|
|
60
|
+
console.error('query:', sql, ', params:', params, ', error:', err);
|
|
61
|
+
reject(err);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public async truncateTable(tableName: string): Promise<any> {
|
|
67
|
+
// sqlite doesn't have DROP command
|
|
68
|
+
return this.execute(`DELETE FROM ${tableName}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// public async createTable(table: string, fields: string[]) {
|
|
72
|
+
// // table = this.replacePrefix(table);
|
|
73
|
+
// const query = 'CREATE TABLE ' + table + ' (' + fields.join(',') + ')';
|
|
74
|
+
// return await this.query(query);
|
|
75
|
+
// }
|
|
76
|
+
|
|
77
|
+
public async getTableCount(tableName: string) {
|
|
78
|
+
const result = await this.select(`SELECT COUNT(*) as c FROM ${tableName}`);
|
|
79
|
+
return result[0].c;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public async getAllTables(addCount = false) {
|
|
83
|
+
const query = `SELECT * FROM sqlite_master WHERE type ='table';`;
|
|
84
|
+
const result = await this.select(query);
|
|
85
|
+
if (result) {
|
|
86
|
+
if (addCount) {
|
|
87
|
+
for (let i in result) {
|
|
88
|
+
result[i].count = await this.getTableCount(result[i].tbl_name);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public async getTableInfo(table: string): Promise<any> {
|
|
97
|
+
const query = `PRAGMA table_info(${table});`;
|
|
98
|
+
const result = await this.select(query);
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
}
|
package/src/lib/db/db.spec.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { Logger } from '../logger';
|
|
2
|
-
|
|
3
|
-
describe('Test logger', () => {
|
|
4
|
-
var db: any;
|
|
5
|
-
beforeEach(() => {
|
|
6
|
-
const sqlite3 = require('sqlite3').verbose();
|
|
7
|
-
db = new sqlite3.Database(':memory:');
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
it('test init without recreating a file', (done) => {
|
|
11
|
-
db.serialize(() => {
|
|
12
|
-
db.run('CREATE TABLE lorem (info TEXT)');
|
|
13
|
-
|
|
14
|
-
const stmt = db.prepare('INSERT INTO lorem VALUES (?)');
|
|
15
|
-
for (let i = 0; i < 10; i++) {
|
|
16
|
-
stmt.run('Ipsum ' + i);
|
|
17
|
-
}
|
|
18
|
-
stmt.finalize();
|
|
19
|
-
|
|
20
|
-
db.each('SELECT rowid AS id, info FROM lorem', (err: any, row: any) => {
|
|
21
|
-
console.log(row.id + ': ' + row.info);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
db.wait(done);
|
|
26
|
-
db.close();
|
|
27
|
-
});
|
|
28
|
-
});
|
|
1
|
+
import { Logger } from '../logger';
|
|
2
|
+
|
|
3
|
+
describe('Test logger', () => {
|
|
4
|
+
var db: any;
|
|
5
|
+
beforeEach(() => {
|
|
6
|
+
const sqlite3 = require('sqlite3').verbose();
|
|
7
|
+
db = new sqlite3.Database(':memory:');
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it('test init without recreating a file', (done) => {
|
|
11
|
+
db.serialize(() => {
|
|
12
|
+
db.run('CREATE TABLE lorem (info TEXT)');
|
|
13
|
+
|
|
14
|
+
const stmt = db.prepare('INSERT INTO lorem VALUES (?)');
|
|
15
|
+
for (let i = 0; i < 10; i++) {
|
|
16
|
+
stmt.run('Ipsum ' + i);
|
|
17
|
+
}
|
|
18
|
+
stmt.finalize();
|
|
19
|
+
|
|
20
|
+
db.each('SELECT rowid AS id, info FROM lorem', (err: any, row: any) => {
|
|
21
|
+
console.log(row.id + ': ' + row.info);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
db.wait(done);
|
|
26
|
+
db.close();
|
|
27
|
+
});
|
|
28
|
+
});
|