lupine.api 1.1.57 → 1.1.59

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.
Files changed (137) hide show
  1. package/README.md +3 -3
  2. package/admin/admin-about.tsx +12 -16
  3. package/admin/admin-config.tsx +47 -44
  4. package/admin/admin-css.tsx +3 -3
  5. package/admin/admin-db.tsx +75 -75
  6. package/admin/admin-frame-helper.tsx +364 -364
  7. package/admin/admin-frame.tsx +164 -164
  8. package/admin/admin-index.tsx +65 -65
  9. package/admin/admin-login.tsx +111 -111
  10. package/admin/admin-menu-edit.tsx +637 -637
  11. package/admin/admin-menu-list.tsx +87 -87
  12. package/admin/admin-page-edit.tsx +564 -564
  13. package/admin/admin-page-list.tsx +83 -83
  14. package/admin/admin-performance.tsx +28 -28
  15. package/admin/admin-release.tsx +427 -404
  16. package/admin/admin-resources.tsx +382 -382
  17. package/admin/admin-shell.tsx +89 -89
  18. package/admin/admin-table-data.tsx +146 -146
  19. package/admin/admin-table-list.tsx +230 -230
  20. package/admin/admin-test-animations.tsx +395 -395
  21. package/admin/admin-test-component.tsx +823 -808
  22. package/admin/admin-test-edit.tsx +319 -319
  23. package/admin/admin-test-themes.tsx +56 -56
  24. package/admin/admin-tokens.tsx +338 -338
  25. package/admin/design/admin-design.tsx +174 -174
  26. package/admin/design/block-grid.tsx +36 -36
  27. package/admin/design/block-grid1.tsx +21 -21
  28. package/admin/design/block-paragraph.tsx +19 -19
  29. package/admin/design/block-title.tsx +19 -19
  30. package/admin/design/design-block-box.tsx +140 -140
  31. package/admin/design/drag-data.tsx +24 -24
  32. package/admin/index.ts +9 -9
  33. package/admin/package.json +15 -15
  34. package/admin/tsconfig.json +127 -127
  35. package/dev/copy-folder.js +32 -32
  36. package/dev/cp-index-html.js +69 -69
  37. package/dev/file-utils.js +12 -12
  38. package/dev/index.js +18 -19
  39. package/dev/package.json +12 -12
  40. package/dev/plugin-ifelse.js +168 -168
  41. package/dev/plugin-ifelse.test.js +37 -37
  42. package/dev/run-cmd.js +14 -14
  43. package/dev/send-request.js +12 -12
  44. package/package.json +55 -55
  45. package/src/admin-api/admin-api-helper.ts +210 -205
  46. package/src/admin-api/admin-api.ts +65 -65
  47. package/src/admin-api/admin-auth.ts +152 -146
  48. package/src/admin-api/admin-config.ts +94 -84
  49. package/src/admin-api/admin-csv.ts +94 -94
  50. package/src/admin-api/admin-db.ts +269 -269
  51. package/src/admin-api/admin-menu.ts +135 -135
  52. package/src/admin-api/admin-page.ts +135 -135
  53. package/src/admin-api/admin-performance.ts +128 -128
  54. package/src/admin-api/admin-release.ts +703 -700
  55. package/src/admin-api/admin-resources.ts +318 -318
  56. package/src/admin-api/admin-token-helper.ts +82 -79
  57. package/src/admin-api/admin-tokens.ts +90 -90
  58. package/src/admin-api/index.ts +2 -2
  59. package/src/admin-api/web-config-api.ts +19 -19
  60. package/src/api/api-cache.ts +103 -103
  61. package/src/api/api-helper.ts +44 -44
  62. package/src/api/api-module.ts +67 -60
  63. package/src/api/api-router.ts +177 -177
  64. package/src/api/api-shared-storage.ts +64 -64
  65. package/src/api/async-storage.ts +5 -5
  66. package/src/api/debug-service.ts +56 -56
  67. package/src/api/encode-html.ts +27 -27
  68. package/src/api/handle-status.ts +75 -75
  69. package/src/api/index.ts +15 -16
  70. package/src/api/mini-web-socket.ts +270 -270
  71. package/src/api/server-content-type.ts +82 -82
  72. package/src/api/server-render.ts +235 -215
  73. package/src/api/shell-service.ts +74 -74
  74. package/src/api/simple-storage.ts +80 -80
  75. package/src/api/static-server.ts +128 -125
  76. package/src/api/to-client-delivery.ts +26 -26
  77. package/src/app/app-cache.ts +55 -55
  78. package/src/app/app-helper.ts +62 -62
  79. package/src/app/app-message.ts +109 -109
  80. package/src/app/app-shared-storage.ts +363 -363
  81. package/src/app/app-start.ts +136 -136
  82. package/src/app/cleanup-exit.ts +16 -16
  83. package/src/app/host-to-path.ts +38 -38
  84. package/src/app/index.ts +11 -11
  85. package/src/app/process-dev-requests.ts +130 -130
  86. package/src/app/web-listener.ts +294 -294
  87. package/src/app/web-processor.ts +47 -42
  88. package/src/app/web-server.ts +100 -100
  89. package/src/common-js/web-env.js +104 -104
  90. package/src/index.ts +7 -7
  91. package/src/lang/api-lang-en.ts +26 -26
  92. package/src/lang/api-lang-zh-cn.ts +27 -27
  93. package/src/lang/index.ts +2 -2
  94. package/src/lang/lang-helper.ts +76 -76
  95. package/src/lang/lang-props.ts +6 -6
  96. package/src/lib/db/db-helper.ts +23 -23
  97. package/src/lib/db/db-mysql.ts +249 -250
  98. package/src/lib/db/db-sqlite.ts +101 -101
  99. package/src/lib/db/db.spec.ts +28 -28
  100. package/src/lib/db/db.ts +325 -325
  101. package/src/lib/db/index.ts +5 -5
  102. package/src/lib/index.ts +3 -3
  103. package/src/lib/logger.spec.ts +214 -214
  104. package/src/lib/logger.ts +281 -281
  105. package/src/lib/runtime-require.ts +37 -37
  106. package/src/lib/utils/cookie-util.ts +34 -34
  107. package/src/lib/utils/crypto.ts +58 -58
  108. package/src/lib/utils/date-utils.ts +317 -317
  109. package/src/lib/utils/deep-merge.ts +37 -37
  110. package/src/lib/utils/delay.ts +12 -12
  111. package/src/lib/utils/file-setting.ts +55 -55
  112. package/src/lib/utils/format-bytes.ts +11 -11
  113. package/src/lib/utils/fs-utils.ts +158 -158
  114. package/src/lib/utils/get-env.ts +27 -27
  115. package/src/lib/utils/index.ts +12 -12
  116. package/src/lib/utils/is-type.ts +48 -48
  117. package/src/lib/utils/load-env.ts +14 -14
  118. package/src/lib/utils/pad.ts +6 -6
  119. package/src/models/api-base.ts +5 -5
  120. package/src/models/api-module-props.ts +10 -11
  121. package/src/models/api-router-props.ts +26 -26
  122. package/src/models/app-cache-props.ts +33 -33
  123. package/src/models/app-data-props.ts +10 -10
  124. package/src/models/app-helper-props.ts +6 -6
  125. package/src/models/app-shared-storage-props.ts +38 -38
  126. package/src/models/app-start-props.ts +18 -18
  127. package/src/models/async-storage-props.ts +13 -13
  128. package/src/models/db-config.ts +30 -30
  129. package/src/models/host-to-path-props.ts +12 -12
  130. package/src/models/index.ts +16 -16
  131. package/src/models/json-object.ts +8 -8
  132. package/src/models/locals-props.ts +36 -36
  133. package/src/models/logger-props.ts +84 -84
  134. package/src/models/simple-storage-props.ts +13 -14
  135. package/src/models/to-client-delivery-props.ts +6 -6
  136. package/tsconfig.json +115 -115
  137. package/dev/plugin-gen-versions.js +0 -20
@@ -1,89 +1,89 @@
1
- import { CssProps, getRenderPageProps, NotificationColor, NotificationMessage, RefProps } from 'lupine.components';
2
-
3
- export const AdminShellPage = () => {
4
- let socket: WebSocket | undefined;
5
- const getSocket = () => {
6
- if (!socket) {
7
- const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
8
- socket = new WebSocket(`${protocol}//${location.host}/debug/client`);
9
-
10
- socket.onopen = () => {
11
- printMsg('Connection opened', true);
12
- };
13
- socket.onmessage = (message) => {
14
- printMsg(message.data.toString());
15
- };
16
- socket.onclose = () => {
17
- printMsg('Connection closed', true);
18
- };
19
- socket.onerror = (error) => {
20
- printMsg('Connection error: ' + error, true);
21
- socket?.close();
22
- socket = undefined;
23
- };
24
- }
25
- return socket;
26
- };
27
- const css: CssProps = {
28
- display: 'flex',
29
- flexDirection: 'column',
30
- height: '100%',
31
- '.admin-shell-box': {},
32
- '.a-shell-out': {
33
- maxHeight: '100%',
34
- },
35
- };
36
- const onSend = async () => {
37
- if (socket?.readyState !== WebSocket.OPEN) {
38
- printMsg('Connection is not open', true);
39
- return;
40
- }
41
- const cmd = ref.$('.a-shell-input').value;
42
- socket.send(JSON.stringify({ message: 'shell', cmd }));
43
- ref.$('.a-shell-input').value = '';
44
- };
45
- const onConnect = async () => {
46
- getSocket();
47
- };
48
- const ref: RefProps = {
49
- onUnload: async (el: Element) => {
50
- socket?.close();
51
- },
52
- };
53
- const onKeyDown = (e: KeyboardEvent) => {
54
- if (e.key === 'Enter') {
55
- onSend();
56
- }
57
- };
58
- const printMsg = (msg: string, clear: boolean = false) => {
59
- const outDom = ref.$('.a-shell-out');
60
- if (clear) {
61
- outDom.value = '';
62
- }
63
- outDom.value += msg + '\n';
64
- outDom.scrollTop = outDom.scrollHeight;
65
- };
66
- return (
67
- <div css={css} class='admin-shell-box' ref={ref}>
68
- <div class='row-box pb-m'>
69
- <div class='row-box flex-1 pr-m'>
70
- <input class='input-base a-shell-input w-100p' onKeyDown={onKeyDown} />
71
- </div>
72
- <button onClick={onSend} class='button-base mr-m'>
73
- Send
74
- </button>
75
- </div>
76
- <div class='row-box pb-m'>
77
- <button onClick={onConnect} class='button-base button-ss mr-s'>
78
- Connect
79
- </button>
80
- <button onClick={() => printMsg('', true)} class='button-base button-ss'>
81
- Clear Log
82
- </button>
83
- </div>
84
- <div class='row-box flex-1'>
85
- <textarea class='input-base a-shell-out w-100p h-100p' readOnly={true}></textarea>
86
- </div>
87
- </div>
88
- );
89
- };
1
+ import { CssProps, getRenderPageProps, NotificationColor, NotificationMessage, RefProps } from 'lupine.components';
2
+
3
+ export const AdminShellPage = () => {
4
+ let socket: WebSocket | undefined;
5
+ const getSocket = () => {
6
+ if (!socket) {
7
+ const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
8
+ socket = new WebSocket(`${protocol}//${location.host}/debug/client`);
9
+
10
+ socket.onopen = () => {
11
+ printMsg('Connection opened', true);
12
+ };
13
+ socket.onmessage = (message) => {
14
+ printMsg(message.data.toString());
15
+ };
16
+ socket.onclose = () => {
17
+ printMsg('Connection closed', true);
18
+ };
19
+ socket.onerror = (error) => {
20
+ printMsg('Connection error: ' + error, true);
21
+ socket?.close();
22
+ socket = undefined;
23
+ };
24
+ }
25
+ return socket;
26
+ };
27
+ const css: CssProps = {
28
+ display: 'flex',
29
+ flexDirection: 'column',
30
+ height: '100%',
31
+ '.admin-shell-box': {},
32
+ '.a-shell-out': {
33
+ maxHeight: '100%',
34
+ },
35
+ };
36
+ const onSend = async () => {
37
+ if (socket?.readyState !== WebSocket.OPEN) {
38
+ printMsg('Connection is not open', true);
39
+ return;
40
+ }
41
+ const cmd = ref.$('.a-shell-input').value;
42
+ socket.send(JSON.stringify({ message: 'shell', cmd }));
43
+ ref.$('.a-shell-input').value = '';
44
+ };
45
+ const onConnect = async () => {
46
+ getSocket();
47
+ };
48
+ const ref: RefProps = {
49
+ onUnload: async (el: Element) => {
50
+ socket?.close();
51
+ },
52
+ };
53
+ const onKeyDown = (e: KeyboardEvent) => {
54
+ if (e.key === 'Enter') {
55
+ onSend();
56
+ }
57
+ };
58
+ const printMsg = (msg: string, clear: boolean = false) => {
59
+ const outDom = ref.$('.a-shell-out');
60
+ if (clear) {
61
+ outDom.value = '';
62
+ }
63
+ outDom.value += msg + '\n';
64
+ outDom.scrollTop = outDom.scrollHeight;
65
+ };
66
+ return (
67
+ <div css={css} class='admin-shell-box' ref={ref}>
68
+ <div class='row-box pb-m'>
69
+ <div class='row-box flex-1 pr-m'>
70
+ <input class='input-base a-shell-input w-100p' onKeyDown={onKeyDown} />
71
+ </div>
72
+ <button onClick={onSend} class='button-base mr-m'>
73
+ Send
74
+ </button>
75
+ </div>
76
+ <div class='row-box pb-m'>
77
+ <button onClick={onConnect} class='button-base button-ss mr-s'>
78
+ Connect
79
+ </button>
80
+ <button onClick={() => printMsg('', true)} class='button-base button-ss'>
81
+ Clear Log
82
+ </button>
83
+ </div>
84
+ <div class='row-box flex-1'>
85
+ <textarea class='input-base a-shell-out w-100p h-100p' readOnly={true}></textarea>
86
+ </div>
87
+ </div>
88
+ );
89
+ };
@@ -1,146 +1,146 @@
1
- import {
2
- CssProps,
3
- RefProps,
4
- bindGlobalStyle,
5
- getRenderPageProps,
6
- getDefaultPageLimit,
7
- HtmlVar,
8
- PagingLink,
9
- encodeHtml,
10
- } from 'lupine.components';
11
-
12
- const loadData = async (
13
- onLinkClick: (index: number) => Promise<void>,
14
- index: number,
15
- tableName: string,
16
- update?: TableDataUpdateProps
17
- ) => {
18
- // this is only executed in the FE
19
- const pageIndex = index ?? getRenderPageProps().query['pg_i'];
20
- const pageLimit = getRenderPageProps().query['pg_l'] || getDefaultPageLimit();
21
- const data = await getRenderPageProps().renderPageFunctions.fetchData(
22
- `/api/admin/db/table/data/${tableName}/${pageIndex}/${pageLimit}`
23
- );
24
- return data && data.json && data.json.result && data.json.result.length > 0 ? (
25
- <div class='table-box-outer'>
26
- <PagingLink
27
- itemsCount={data && data.json && data.json.itemsCount}
28
- pageIndex={data && data.json && data.json.pageIndex}
29
- baseLink=''
30
- onClick={onLinkClick}
31
- ></PagingLink>
32
- <div class='table-box'>
33
- <div class='fields bg-gray'></div>
34
- <div class='table'>
35
- <div class='fields bg-gray'>
36
- {Object.keys(data.json.result[0]).map((field: any, index: number) => {
37
- return <div class='p1 item'>{encodeHtml(field)}</div>;
38
- })}
39
- {update && update.onDelete && update.onEdit && <div class='p1 item'>Action</div>}
40
- </div>
41
-
42
- {data.json.result.map((item: any) => {
43
- return (
44
- <div class='values'>
45
- {Object.keys(item).map((field: any, index: number) => {
46
- return <div class='p1 item'>{encodeHtml(item[field])}</div>;
47
- })}
48
- {update && update.onDelete && update.onEdit && (
49
- <div class='p1 item'>
50
- <button
51
- class='button-base button-s'
52
- onClick={() => {
53
- update.onEdit!(item);
54
- }}
55
- >
56
- Edit
57
- </button>
58
- <button
59
- class='button-base button-s'
60
- onClick={() => {
61
- update.onDelete!(item);
62
- }}
63
- >
64
- Delete
65
- </button>
66
- </div>
67
- )}
68
- </div>
69
- );
70
- })}
71
- </div>
72
- </div>
73
- <PagingLink
74
- itemsCount={data && data.json && data.json.itemsCount}
75
- pageIndex={data && data.json && data.json.pageIndex}
76
- baseLink=''
77
- onClick={onLinkClick}
78
- ></PagingLink>
79
- </div>
80
- ) : (
81
- <div>No data.</div>
82
- );
83
- };
84
-
85
- export type TableDataUpdateProps = {
86
- refreshRef?: Function;
87
- onDelete?: Function;
88
- onEdit?: Function;
89
- };
90
- export const AdminTableData = (props: { tableName: string; update?: TableDataUpdateProps }) => {
91
- const css: CssProps = {
92
- '.table-box': {
93
- overflowX: 'auto',
94
- overflowY: 'hidden',
95
- },
96
- '.table': {
97
- borderCollapse: 'collapse',
98
- display: 'table',
99
- },
100
- '.table-box .fields, .table-box .values': {
101
- display: 'table-row',
102
- },
103
- '.table-box .fields .item, .table-box .values .item': {
104
- display: 'table-cell',
105
- border: 'solid 1px gray',
106
- },
107
- };
108
-
109
- const onPageClick = async (index: number) => {
110
- console.log('onPageClick', index);
111
- dom.value = await loadData(onPageClick, index, props.tableName, props.update);
112
- };
113
- const refresh = async () => {
114
- dom.value = await loadData(onPageClick, 0, props.tableName, props.update);
115
- // mountComponents(ref.current, dom);
116
- };
117
- const ref: RefProps = {
118
- onLoad: async () => {
119
- // const self = ref.current;
120
- dom.value = await loadData(onPageClick, 0, props.tableName, props.update);
121
- // mountComponents(self, dom);
122
- },
123
- };
124
- if (props.update) {
125
- props.update.refreshRef = refresh;
126
- }
127
- bindGlobalStyle('admin-table-data', css);
128
- const dom = new HtmlVar('');
129
- return (
130
- <div className='admin-table-data' ref={ref}>
131
- <button class='button-base button-s' onClick={refresh}>
132
- Refresh
133
- </button>
134
- {dom.node}
135
- </div>
136
- );
137
- };
138
-
139
- export const TableDataPage = (tableName: string) => {
140
- return (
141
- <div>
142
- table: {tableName}
143
- <AdminTableData tableName={tableName}></AdminTableData>
144
- </div>
145
- );
146
- };
1
+ import {
2
+ CssProps,
3
+ RefProps,
4
+ bindGlobalStyle,
5
+ getRenderPageProps,
6
+ getDefaultPageLimit,
7
+ HtmlVar,
8
+ PagingLink,
9
+ encodeHtml,
10
+ } from 'lupine.components';
11
+
12
+ const loadData = async (
13
+ onLinkClick: (index: number) => Promise<void>,
14
+ index: number,
15
+ tableName: string,
16
+ update?: TableDataUpdateProps
17
+ ) => {
18
+ // this is only executed in the FE
19
+ const pageIndex = index ?? getRenderPageProps().query['pg_i'];
20
+ const pageLimit = getRenderPageProps().query['pg_l'] || getDefaultPageLimit();
21
+ const data = await getRenderPageProps().renderPageFunctions.fetchData(
22
+ `/api/admin/db/table/data/${tableName}/${pageIndex}/${pageLimit}`
23
+ );
24
+ return data && data.json && data.json.result && data.json.result.length > 0 ? (
25
+ <div class='table-box-outer'>
26
+ <PagingLink
27
+ itemsCount={data && data.json && data.json.itemsCount}
28
+ pageIndex={data && data.json && data.json.pageIndex}
29
+ baseLink=''
30
+ onClick={onLinkClick}
31
+ ></PagingLink>
32
+ <div class='table-box'>
33
+ <div class='fields bg-gray'></div>
34
+ <div class='table'>
35
+ <div class='fields bg-gray'>
36
+ {Object.keys(data.json.result[0]).map((field: any, index: number) => {
37
+ return <div class='p1 item'>{encodeHtml(field)}</div>;
38
+ })}
39
+ {update && update.onDelete && update.onEdit && <div class='p1 item'>Action</div>}
40
+ </div>
41
+
42
+ {data.json.result.map((item: any) => {
43
+ return (
44
+ <div class='values'>
45
+ {Object.keys(item).map((field: any, index: number) => {
46
+ return <div class='p1 item'>{encodeHtml(item[field])}</div>;
47
+ })}
48
+ {update && update.onDelete && update.onEdit && (
49
+ <div class='p1 item'>
50
+ <button
51
+ class='button-base button-s'
52
+ onClick={() => {
53
+ update.onEdit!(item);
54
+ }}
55
+ >
56
+ Edit
57
+ </button>
58
+ <button
59
+ class='button-base button-s'
60
+ onClick={() => {
61
+ update.onDelete!(item);
62
+ }}
63
+ >
64
+ Delete
65
+ </button>
66
+ </div>
67
+ )}
68
+ </div>
69
+ );
70
+ })}
71
+ </div>
72
+ </div>
73
+ <PagingLink
74
+ itemsCount={data && data.json && data.json.itemsCount}
75
+ pageIndex={data && data.json && data.json.pageIndex}
76
+ baseLink=''
77
+ onClick={onLinkClick}
78
+ ></PagingLink>
79
+ </div>
80
+ ) : (
81
+ <div>No data.</div>
82
+ );
83
+ };
84
+
85
+ export type TableDataUpdateProps = {
86
+ refreshRef?: Function;
87
+ onDelete?: Function;
88
+ onEdit?: Function;
89
+ };
90
+ export const AdminTableData = (props: { tableName: string; update?: TableDataUpdateProps }) => {
91
+ const css: CssProps = {
92
+ '.table-box': {
93
+ overflowX: 'auto',
94
+ overflowY: 'hidden',
95
+ },
96
+ '.table': {
97
+ borderCollapse: 'collapse',
98
+ display: 'table',
99
+ },
100
+ '.table-box .fields, .table-box .values': {
101
+ display: 'table-row',
102
+ },
103
+ '.table-box .fields .item, .table-box .values .item': {
104
+ display: 'table-cell',
105
+ border: 'solid 1px gray',
106
+ },
107
+ };
108
+
109
+ const onPageClick = async (index: number) => {
110
+ console.log('onPageClick', index);
111
+ dom.value = await loadData(onPageClick, index, props.tableName, props.update);
112
+ };
113
+ const refresh = async () => {
114
+ dom.value = await loadData(onPageClick, 0, props.tableName, props.update);
115
+ // mountComponents(ref.current, dom);
116
+ };
117
+ const ref: RefProps = {
118
+ onLoad: async () => {
119
+ // const self = ref.current;
120
+ dom.value = await loadData(onPageClick, 0, props.tableName, props.update);
121
+ // mountComponents(self, dom);
122
+ },
123
+ };
124
+ if (props.update) {
125
+ props.update.refreshRef = refresh;
126
+ }
127
+ bindGlobalStyle('admin-table-data', css);
128
+ const dom = new HtmlVar('');
129
+ return (
130
+ <div className='admin-table-data' ref={ref}>
131
+ <button class='button-base button-s' onClick={refresh}>
132
+ Refresh
133
+ </button>
134
+ {dom.node}
135
+ </div>
136
+ );
137
+ };
138
+
139
+ export const TableDataPage = (tableName: string) => {
140
+ return (
141
+ <div>
142
+ table: {tableName}
143
+ <AdminTableData tableName={tableName}></AdminTableData>
144
+ </div>
145
+ );
146
+ };