@axium/sysadmin 0.2.4 → 0.2.6

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.
@@ -111,31 +111,19 @@ function storage() {
111
111
  }
112
112
  return result;
113
113
  }
114
- function memory() {
115
- const info = {};
116
- const content = read('/proc/meminfo');
117
- if (content)
118
- for (const line of content.split('\n')) {
119
- const match = /^(\w+):\s+(\d+)(?:\s+kB)?$/.exec(line.trim());
120
- if (!match)
121
- continue;
122
- const [, key, value] = match;
123
- info[key] = BigInt(value) * (line.endsWith('kB') ? 1024n : 1n);
124
- }
125
- const total = info.MemTotal ?? BigInt(os.totalmem());
126
- const available = info.MemAvailable ?? BigInt(os.freemem());
127
- const memory = {
128
- speed: 0,
129
- total,
130
- used: total - available,
131
- };
114
+ let dmiMemory;
115
+ /** Static memory hardware details from DMI. */
116
+ function memoryHardware() {
117
+ if (dmiMemory)
118
+ return dmiMemory;
119
+ dmiMemory = { speed: 0 };
132
120
  try {
133
121
  const dmiMemoryInfo = execFileSync('sudo', ['-n', 'dmidecode', '-t', '17'], {
134
122
  encoding: 'utf8',
135
123
  stdio: ['ignore', 'pipe', 'ignore'],
136
124
  });
137
125
  for (const match of dmiMemoryInfo.matchAll(/^\s*(?:Configured Memory|Configured Clock)?\s*Speed:\s*(\d+)\s*MT\/s/gim)) {
138
- memory.speed = Math.max(memory.speed, Number(match[1]));
126
+ dmiMemory.speed = Math.max(dmiMemory.speed, Number(match[1]));
139
127
  }
140
128
  const populated = (field) => {
141
129
  for (const [, match] of dmiMemoryInfo.matchAll(new RegExp(`^[ \\t]*${field}:[ \\t]*(.+)$`, 'gim'))) {
@@ -144,12 +132,32 @@ function memory() {
144
132
  return value;
145
133
  }
146
134
  };
147
- memory.formFactor = populated('Form Factor');
148
- memory.type = populated('Type');
135
+ dmiMemory.formFactor = populated('Form Factor');
136
+ dmiMemory.type = populated('Type');
149
137
  }
150
138
  catch {
151
139
  // dmidecode missing, not root, or sudo needs a password
152
140
  }
141
+ return dmiMemory;
142
+ }
143
+ function memory() {
144
+ const info = {};
145
+ const content = read('/proc/meminfo');
146
+ if (content)
147
+ for (const line of content.split('\n')) {
148
+ const match = /^(\w+):\s+(\d+)(?:\s+kB)?$/.exec(line.trim());
149
+ if (!match)
150
+ continue;
151
+ const [, key, value] = match;
152
+ info[key] = BigInt(value) * (line.endsWith('kB') ? 1024n : 1n);
153
+ }
154
+ const total = info.MemTotal ?? BigInt(os.totalmem());
155
+ const available = info.MemAvailable ?? BigInt(os.freemem());
156
+ const memory = {
157
+ ...memoryHardware(),
158
+ total,
159
+ used: total - available,
160
+ };
153
161
  const swapTotal = info.SwapTotal ?? 0n;
154
162
  if (swapTotal > 0n)
155
163
  memory.swap = { total: swapTotal, used: swapTotal - (info.SwapFree ?? 0n) };
package/dist/common.d.ts CHANGED
@@ -26,11 +26,12 @@ export declare const System: z.ZodObject<{
26
26
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
27
27
  id: z.ZodUUID;
28
28
  name: z.ZodString;
29
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
- email: z.ZodOptional<z.ZodEmail>;
29
+ username: z.ZodString;
30
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
31
31
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
32
32
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
33
33
  debug: z.ZodDefault<z.ZodBoolean>;
34
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
34
35
  }, z.core.$strip>>>;
35
36
  roles: z.ZodArray<z.ZodString>;
36
37
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -81,11 +82,12 @@ declare const SysadminAPI: {
81
82
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
82
83
  id: z.ZodUUID;
83
84
  name: z.ZodString;
84
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
85
- email: z.ZodOptional<z.ZodEmail>;
85
+ username: z.ZodString;
86
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
86
87
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
87
88
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
88
89
  debug: z.ZodDefault<z.ZodBoolean>;
90
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
89
91
  }, z.core.$strip>>>;
90
92
  roles: z.ZodArray<z.ZodString>;
91
93
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -117,11 +119,12 @@ declare const SysadminAPI: {
117
119
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
118
120
  id: z.ZodUUID;
119
121
  name: z.ZodString;
120
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
121
- email: z.ZodOptional<z.ZodEmail>;
122
+ username: z.ZodString;
123
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
122
124
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
123
125
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
124
126
  debug: z.ZodDefault<z.ZodBoolean>;
127
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
125
128
  }, z.core.$strip>>>;
126
129
  roles: z.ZodArray<z.ZodString>;
127
130
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -167,11 +170,12 @@ declare const SysadminAPI: {
167
170
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
168
171
  id: z.ZodUUID;
169
172
  name: z.ZodString;
170
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
171
- email: z.ZodOptional<z.ZodEmail>;
173
+ username: z.ZodString;
174
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
172
175
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
173
176
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
174
177
  debug: z.ZodDefault<z.ZodBoolean>;
178
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
175
179
  }, z.core.$strip>>>;
176
180
  roles: z.ZodArray<z.ZodString>;
177
181
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -203,11 +207,12 @@ declare const SysadminAPI: {
203
207
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
204
208
  id: z.ZodUUID;
205
209
  name: z.ZodString;
206
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
207
- email: z.ZodOptional<z.ZodEmail>;
210
+ username: z.ZodString;
211
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
208
212
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
209
213
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
210
214
  debug: z.ZodDefault<z.ZodBoolean>;
215
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
211
216
  }, z.core.$strip>>>;
212
217
  roles: z.ZodArray<z.ZodString>;
213
218
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -234,11 +239,12 @@ declare const SysadminAPI: {
234
239
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
235
240
  id: z.ZodUUID;
236
241
  name: z.ZodString;
237
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
238
- email: z.ZodOptional<z.ZodEmail>;
242
+ username: z.ZodString;
243
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
239
244
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
240
245
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
241
246
  debug: z.ZodDefault<z.ZodBoolean>;
247
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
242
248
  }, z.core.$strip>>>;
243
249
  roles: z.ZodArray<z.ZodString>;
244
250
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -290,11 +296,12 @@ declare const SysadminAPI: {
290
296
  user: z.ZodOptional<z.ZodNullable<z.ZodObject<{
291
297
  id: z.ZodUUID;
292
298
  name: z.ZodString;
293
- username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
294
- email: z.ZodOptional<z.ZodEmail>;
299
+ username: z.ZodString;
300
+ email: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodEmail>>>;
295
301
  emailVerified: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodCoercedDate<unknown>>>>;
296
302
  preferences: z.ZodOptional<z.ZodLazy<z.ZodObject<{
297
303
  debug: z.ZodDefault<z.ZodBoolean>;
304
+ theme: z.ZodDefault<z.ZodLiteral<"default" | "light" | "forest" | "midnight" | "beach" | "cherry" | "volcano">>;
298
305
  }, z.core.$strip>>>;
299
306
  roles: z.ZodArray<z.ZodString>;
300
307
  tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -2,7 +2,7 @@
2
2
  import { fetchAPI, text } from '@axium/client';
3
3
  import { contextMenu, type ContextMenuItem } from '@axium/client/attachments';
4
4
  import { Icon, Popover } from '@axium/client/components';
5
- import { copy } from '@axium/client/gui';
5
+ import { copy } from '@axium/client/web';
6
6
  import { toastStatus } from '@axium/client/toast';
7
7
  import { systemTypeIcons, type System } from '@axium/sysadmin';
8
8
  import SystemInitDialog from './SystemInitDialog.svelte';
@@ -2,7 +2,7 @@
2
2
  import { fetchAPI, text } from '@axium/client';
3
3
  import { contextMenu, type ContextMenuItem } from '@axium/client/attachments';
4
4
  import { Icon, Popover } from '@axium/client/components';
5
- import { copy } from '@axium/client/gui';
5
+ import { copy } from '@axium/client/web';
6
6
  import { toastStatus } from '@axium/client/toast';
7
7
  import type { SystemUser } from '@axium/sysadmin';
8
8
  import UserInitDialog from './UserInitDialog.svelte';
package/lib/tsconfig.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "module": "preserve",
7
7
  "moduleResolution": "Bundler"
8
8
  },
9
- "include": ["**/*.svelte", "**/*.ts"],
9
+ "include": ["**/*.svelte", "**/*.ts", "../src/.*.ts", "../../client/dist/.*.ts"],
10
10
  "exclude": [],
11
11
  "references": [{ "path": ".." }]
12
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axium/sysadmin",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "author": "James Prevett <axium@jamespre.dev>",
5
5
  "description": "System administration for Axium",
6
6
  "funding": {
@@ -36,8 +36,8 @@
36
36
  "build": "tsc"
37
37
  },
38
38
  "peerDependencies": {
39
- "@axium/client": ">=0.27.0",
40
- "@axium/core": ">=0.33.0",
39
+ "@axium/client": ">=0.37.0",
40
+ "@axium/core": ">=0.39.0",
41
41
  "@axium/server": ">=0.47.0",
42
42
  "@sveltejs/kit": "^2.27.3",
43
43
  "kysely": "^0.29.0",
@@ -49,11 +49,12 @@
49
49
  "zod": "^4.0.5"
50
50
  },
51
51
  "axium": {
52
+ "locales": "locales",
52
53
  "server": {
53
54
  "routes": "routes",
54
55
  "hooks": "./dist/server/hooks.js",
55
56
  "db": "./db.json",
56
- "web_client_hooks": "./dist/web_hook.js"
57
+ "web_client_hooks": "./dist/common.js"
57
58
  },
58
59
  "client": {
59
60
  "hooks": "./dist/client/hooks.js",
@@ -7,6 +7,6 @@
7
7
  "target": "esnext",
8
8
  "rootDir": ".."
9
9
  },
10
- "include": ["**/*", "../lib/*"],
10
+ "include": ["**/*", "../lib/*", "../src/.*.ts", "../../client/dist/.*.ts"],
11
11
  "references": [{ "path": ".." }]
12
12
  }
@@ -1,8 +0,0 @@
1
- import en from '../locales/en.json';
2
- import './common.js';
3
- type en = typeof en;
4
- declare module '@axium/client/locales' {
5
- interface Locale extends en {
6
- }
7
- }
8
- export {};
package/dist/web_hook.js DELETED
@@ -1,4 +0,0 @@
1
- import { extendLocale } from '@axium/client';
2
- import en from '../locales/en.json' with { type: 'json' };
3
- import './common.js';
4
- extendLocale('en', en);