@gettersethya/mira-dashboard 0.1.0-alpha.1

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 (101) hide show
  1. package/dist/api/bootstrap-status.d.ts +5 -0
  2. package/dist/api/bootstrap-status.d.ts.map +1 -0
  3. package/dist/api/bootstrap-status.js +16 -0
  4. package/dist/api/bootstrap-status.js.map +1 -0
  5. package/dist/api/config.d.ts +5 -0
  6. package/dist/api/config.d.ts.map +1 -0
  7. package/dist/api/config.js +18 -0
  8. package/dist/api/config.js.map +1 -0
  9. package/dist/api/logs.d.ts +6 -0
  10. package/dist/api/logs.d.ts.map +1 -0
  11. package/dist/api/logs.js +56 -0
  12. package/dist/api/logs.js.map +1 -0
  13. package/dist/api/records.d.ts +6 -0
  14. package/dist/api/records.d.ts.map +1 -0
  15. package/dist/api/records.js +78 -0
  16. package/dist/api/records.js.map +1 -0
  17. package/dist/api/register.d.ts +5 -0
  18. package/dist/api/register.d.ts.map +1 -0
  19. package/dist/api/register.js +30 -0
  20. package/dist/api/register.js.map +1 -0
  21. package/dist/api/schema.d.ts +5 -0
  22. package/dist/api/schema.d.ts.map +1 -0
  23. package/dist/api/schema.js +23 -0
  24. package/dist/api/schema.js.map +1 -0
  25. package/dist/api/superadmin.d.ts +5 -0
  26. package/dist/api/superadmin.d.ts.map +1 -0
  27. package/dist/api/superadmin.js +25 -0
  28. package/dist/api/superadmin.js.map +1 -0
  29. package/dist/index.d.ts +8 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +26 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/router.d.ts +9 -0
  34. package/dist/router.d.ts.map +1 -0
  35. package/dist/router.js +67 -0
  36. package/dist/router.js.map +1 -0
  37. package/dist/schema-token.d.ts +5 -0
  38. package/dist/schema-token.d.ts.map +1 -0
  39. package/dist/schema-token.js +11 -0
  40. package/dist/schema-token.js.map +1 -0
  41. package/dist/src/api/auth.d.ts +22 -0
  42. package/dist/src/api/auth.d.ts.map +1 -0
  43. package/dist/src/api/auth.js +56 -0
  44. package/dist/src/api/auth.js.map +1 -0
  45. package/dist/src/api/bootstrap-status.d.ts +5 -0
  46. package/dist/src/api/bootstrap-status.d.ts.map +1 -0
  47. package/dist/src/api/bootstrap-status.js +14 -0
  48. package/dist/src/api/bootstrap-status.js.map +1 -0
  49. package/dist/src/api/config.d.ts +5 -0
  50. package/dist/src/api/config.d.ts.map +1 -0
  51. package/dist/src/api/config.js +20 -0
  52. package/dist/src/api/config.js.map +1 -0
  53. package/dist/src/api/login.d.ts +5 -0
  54. package/dist/src/api/login.d.ts.map +1 -0
  55. package/dist/src/api/login.js +33 -0
  56. package/dist/src/api/login.js.map +1 -0
  57. package/dist/src/api/logs.d.ts +6 -0
  58. package/dist/src/api/logs.d.ts.map +1 -0
  59. package/dist/src/api/logs.js +59 -0
  60. package/dist/src/api/logs.js.map +1 -0
  61. package/dist/src/api/records.d.ts +6 -0
  62. package/dist/src/api/records.d.ts.map +1 -0
  63. package/dist/src/api/records.js +78 -0
  64. package/dist/src/api/records.js.map +1 -0
  65. package/dist/src/api/register.d.ts +5 -0
  66. package/dist/src/api/register.d.ts.map +1 -0
  67. package/dist/src/api/register.js +32 -0
  68. package/dist/src/api/register.js.map +1 -0
  69. package/dist/src/api/schema.d.ts +5 -0
  70. package/dist/src/api/schema.d.ts.map +1 -0
  71. package/dist/src/api/schema.js +19 -0
  72. package/dist/src/api/schema.js.map +1 -0
  73. package/dist/src/api/spans.d.ts +5 -0
  74. package/dist/src/api/spans.d.ts.map +1 -0
  75. package/dist/src/api/spans.js +56 -0
  76. package/dist/src/api/spans.js.map +1 -0
  77. package/dist/src/api/superadmin.d.ts +7 -0
  78. package/dist/src/api/superadmin.d.ts.map +1 -0
  79. package/dist/src/api/superadmin.js +55 -0
  80. package/dist/src/api/superadmin.js.map +1 -0
  81. package/dist/src/index.d.ts +7 -0
  82. package/dist/src/index.d.ts.map +1 -0
  83. package/dist/src/index.js +38 -0
  84. package/dist/src/index.js.map +1 -0
  85. package/dist/src/router.d.ts +6 -0
  86. package/dist/src/router.d.ts.map +1 -0
  87. package/dist/src/router.js +66 -0
  88. package/dist/src/router.js.map +1 -0
  89. package/dist/src/schema-token.d.ts +5 -0
  90. package/dist/src/schema-token.d.ts.map +1 -0
  91. package/dist/src/schema-token.js +11 -0
  92. package/dist/src/schema-token.js.map +1 -0
  93. package/dist/src/superadmin.d.ts +6 -0
  94. package/dist/src/superadmin.d.ts.map +1 -0
  95. package/dist/src/superadmin.js +21 -0
  96. package/dist/src/superadmin.js.map +1 -0
  97. package/dist/superadmin.d.ts +7 -0
  98. package/dist/superadmin.d.ts.map +1 -0
  99. package/dist/superadmin.js +20 -0
  100. package/dist/superadmin.js.map +1 -0
  101. package/package.json +45 -0
@@ -0,0 +1,7 @@
1
+ import { MiraPlugin } from "@gettersethya/mira";
2
+ export declare const MiraDashboard: MiraPlugin;
3
+ export { SuperAdminCollection } from "./superadmin.js";
4
+ export { getRegisterToken, setRegisterToken, generateRegisterToken } from "./superadmin.js";
5
+ export { makeDashboardRouter } from "./router.js";
6
+ export type { MiraPlugin } from "@gettersethya/mira";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAgC,MAAM,oBAAoB,CAAA;AAI7E,eAAO,MAAM,aAAa,YAqCxB,CAAA;AAEF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { Effect } from "effect";
2
+ import { MiraPlugin, AppConfig, CollectionService } from "@gettersethya/mira";
3
+ import { SuperAdminCollection, setRegisterToken, generateRegisterToken } from "./superadmin.js";
4
+ import { makeDashboardRouter } from "./router.js";
5
+ export const MiraDashboard = MiraPlugin.define({
6
+ collections: [SuperAdminCollection],
7
+ routes: makeDashboardRouter([SuperAdminCollection]),
8
+ onBootstrap: () => Effect.gen(function* () {
9
+ const token = generateRegisterToken();
10
+ const cfg = yield* AppConfig;
11
+ const svc = yield* CollectionService;
12
+ const results = yield* svc
13
+ .list(SuperAdminCollection, null, 1, { headers: {}, query: {}, admin: true })
14
+ .pipe(Effect.orDie);
15
+ yield* Effect.log("[dashboard] Dashboard plugin loaded");
16
+ if (results.items.length === 0) {
17
+ setRegisterToken(token);
18
+ yield* Effect.log(`[dashboard] Register at: ${cfg.applicationUrl}/_dashboard/register?token=${token}`);
19
+ }
20
+ else {
21
+ yield* Effect.log(`[dashboard] run at: ${cfg.applicationUrl}/_dashboard/`);
22
+ }
23
+ }),
24
+ onServe: () => Effect.log("[dashboard] Available at /_dashboard/"),
25
+ onRecordCreateSuccess: {
26
+ handler: (ctx) => Effect.log(`[dashboard] audit: created ${String(ctx.result["id"])} in ${ctx.collection.name}`)
27
+ },
28
+ onRecordUpdateSuccess: {
29
+ handler: (ctx) => Effect.log(`[dashboard] audit: updated ${String(ctx.result["id"])} in ${ctx.collection.name}`)
30
+ },
31
+ onRecordDeleteSuccess: {
32
+ handler: (ctx) => Effect.log(`[dashboard] audit: deleted ${String(ctx.result["id"])} in ${ctx.collection.name}`)
33
+ }
34
+ });
35
+ export { SuperAdminCollection } from "./superadmin.js";
36
+ export { getRegisterToken, setRegisterToken, generateRegisterToken } from "./superadmin.js";
37
+ export { makeDashboardRouter } from "./router.js";
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC7E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC/F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7C,WAAW,EAAE,CAAC,oBAAoB,CAAC;IAEnC,MAAM,EAAE,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAEnD,WAAW,EAAE,GAAG,EAAE,CAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAA;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAA;QACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG;aACvB,IAAI,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;aAC5E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAErB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;QAExD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,gBAAgB,CAAC,KAAK,CAAC,CAAA;YACvB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,cAAc,8BAA8B,KAAK,EAAE,CAAC,CAAA;QACxG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,GAAG,CAAC,cAAc,cAAc,CAAC,CAAA;QAC5E,CAAC;IACH,CAAC,CAAC;IAEJ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,uCAAuC,CAAC;IAElE,qBAAqB,EAAE;QACrB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACjH;IAED,qBAAqB,EAAE;QACrB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACjH;IAED,qBAAqB,EAAE;QACrB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;KACjH;CACF,CAAC,CAAA;AAEF,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { HttpRouter } from "@effect/platform";
2
+ import { FileSystem, Path } from "@effect/platform";
3
+ import type { AnyCollectionDef } from "@gettersethya/mira-client";
4
+ import type { AuthService, AppConfig, CollectionService } from "@gettersethya/mira";
5
+ export declare function makeDashboardRouter(_collections: ReadonlyArray<AnyCollectionDef>): HttpRouter.HttpRouter<never, CollectionService | AuthService | FileSystem.FileSystem | Path.Path | AppConfig>;
6
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAyC,MAAM,kBAAkB,CAAA;AACpF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,KAAK,EAAc,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAyE/F,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,gBAAgB,CAAC,iHAWhF"}
@@ -0,0 +1,66 @@
1
+ import { HttpRouter, HttpServerRequest, HttpServerResponse } from "@effect/platform";
2
+ import { FileSystem, Path } from "@effect/platform";
3
+ import { Cause, Effect, Option } from "effect";
4
+ import { bootstrapStatusRoute } from "./api/bootstrap-status.js";
5
+ import { registerRoute } from "./api/register.js";
6
+ import { createSuperadminRoute, listSuperadminsRoute, deleteSuperadminRoute } from "./api/superadmin.js";
7
+ import { configRoute } from "./api/config.js";
8
+ import { loginRoute } from "./api/login.js";
9
+ import { DashboardUnauthorizedError } from "./api/auth.js";
10
+ function makeContentType(ext) {
11
+ const types = {
12
+ ".html": "text/html",
13
+ ".js": "application/javascript",
14
+ ".css": "text/css",
15
+ ".json": "application/json",
16
+ ".png": "image/png",
17
+ ".jpg": "image/jpeg",
18
+ ".svg": "image/svg+xml",
19
+ ".ico": "image/x-icon",
20
+ ".woff": "font/woff",
21
+ ".woff2": "font/woff2"
22
+ };
23
+ return types[ext] ?? "application/octet-stream";
24
+ }
25
+ function wrapRoute(effect) {
26
+ return Effect.catchAllCause(effect, (cause) => {
27
+ const failure = Cause.failureOption(cause);
28
+ if (Option.isSome(failure)) {
29
+ if (failure.value instanceof DashboardUnauthorizedError) {
30
+ return Effect.succeed(HttpServerResponse.unsafeJson({ error: "unauthorized" }, { status: 401 }));
31
+ }
32
+ return Effect.succeed(HttpServerResponse.unsafeJson({ error: "bad_request" }, { status: 400 }));
33
+ }
34
+ return Effect.succeed(HttpServerResponse.unsafeJson({ error: "internal" }, { status: 500 }));
35
+ });
36
+ }
37
+ function makeDashboardSpaRoute() {
38
+ const spaHandler = wrapRoute(Effect.gen(function* () {
39
+ const fs = yield* FileSystem.FileSystem;
40
+ const path = yield* Path.Path;
41
+ const req = yield* HttpServerRequest.HttpServerRequest;
42
+ const modulePath = yield* path.fromFileUrl(new URL(import.meta.url));
43
+ const distDir = path.join(path.dirname(modulePath), "../../ui/dist");
44
+ const urlPath = req.url.split("?")[0];
45
+ const stripped = urlPath.replace("/_dashboard", "").replace(/^\/+/, "");
46
+ const filePath = stripped || "index.html";
47
+ const fullPath = path.join(distDir, filePath);
48
+ const exists = yield* fs.exists(fullPath);
49
+ if (!exists) {
50
+ const indexPath = path.join(distDir, "index.html");
51
+ const content = yield* fs.readFile(indexPath);
52
+ return HttpServerResponse.html(content.toString());
53
+ }
54
+ const content = yield* fs.readFile(fullPath);
55
+ const ext = path.extname(fullPath);
56
+ const contentType = makeContentType(ext);
57
+ return HttpServerResponse.raw(content, {
58
+ headers: { "content-type": contentType }
59
+ });
60
+ }));
61
+ return HttpRouter.empty.pipe(HttpRouter.get("/_dashboard", spaHandler), HttpRouter.get("/_dashboard/*", spaHandler));
62
+ }
63
+ export function makeDashboardRouter(_collections) {
64
+ return HttpRouter.empty.pipe(HttpRouter.get("/_dashboard/api/bootstrap-status", wrapRoute(bootstrapStatusRoute)), HttpRouter.post("/_dashboard/api/register", wrapRoute(registerRoute)), HttpRouter.post("/_dashboard/api/login", wrapRoute(loginRoute)), HttpRouter.post("/_dashboard/api/superadmin/create", wrapRoute(createSuperadminRoute)), HttpRouter.get("/_dashboard/api/superadmin", wrapRoute(listSuperadminsRoute)), HttpRouter.del("/_dashboard/api/superadmin/:id", wrapRoute(deleteSuperadminRoute)), HttpRouter.get("/_dashboard/api/config", wrapRoute(configRoute)), HttpRouter.concat(makeDashboardSpaRoute()));
65
+ }
66
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { CryptoService } from "@gettersethya/mira";
2
+ import { Layer } from "effect";
3
+ export declare const SchemaTokenLive: Layer.Layer<never, never, CryptoService>;
4
+ export declare const getSchemaToken: () => string;
5
+ //# sourceMappingURL=schema-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-token.d.ts","sourceRoot":"","sources":["../../src/schema-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AAItC,eAAO,MAAM,eAAe,0CAO3B,CAAA;AAED,eAAO,MAAM,cAAc,cAAqB,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { CryptoService } from "@gettersethya/mira";
2
+ import { Effect, Layer } from "effect";
3
+ let _schemaToken = "";
4
+ export const SchemaTokenLive = Layer.effectDiscard(Effect.gen(function* () {
5
+ const crypto = yield* CryptoService;
6
+ const bytes = yield* crypto.randomBytes(32);
7
+ const token = Buffer.from(bytes).toString("hex");
8
+ _schemaToken = token;
9
+ }));
10
+ export const getSchemaToken = () => _schemaToken;
11
+ //# sourceMappingURL=schema-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-token.js","sourceRoot":"","sources":["../../src/schema-token.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,IAAI,YAAY,GAAG,EAAE,CAAA;AAErB,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,aAAa,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAChD,YAAY,GAAG,KAAK,CAAA;AACtB,CAAC,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,YAAY,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { AnyCollectionDef } from "@gettersethya/mira-client";
2
+ export declare const SuperAdminCollection: AnyCollectionDef;
3
+ export declare function getRegisterToken(): string;
4
+ export declare function setRegisterToken(token: string): void;
5
+ export declare function generateRegisterToken(): string;
6
+ //# sourceMappingURL=superadmin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superadmin.d.ts","sourceRoot":"","sources":["../../src/superadmin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAEjE,eAAO,MAAM,oBAAoB,EAAE,gBAMhC,CAAA;AAIH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C"}
@@ -0,0 +1,21 @@
1
+ import { AuthCollection } from "@gettersethya/mira-client";
2
+ export const SuperAdminCollection = AuthCollection.define("_superadmin", {}).rules((R) => ({
3
+ list: R.field("email").eq(R.literal("")),
4
+ view: R.field("email").eq(R.literal("")),
5
+ create: R.public(),
6
+ update: R.field("email").eq(R.literal("")),
7
+ delete: R.field("email").eq(R.literal(""))
8
+ }));
9
+ let _registerToken = "";
10
+ export function getRegisterToken() {
11
+ return _registerToken;
12
+ }
13
+ export function setRegisterToken(token) {
14
+ _registerToken = token;
15
+ }
16
+ export function generateRegisterToken() {
17
+ const arr = new Uint8Array(32);
18
+ globalThis.crypto.getRandomValues(arr);
19
+ return Buffer.from(arr).toString("hex");
20
+ }
21
+ //# sourceMappingURL=superadmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superadmin.js","sourceRoot":"","sources":["../../src/superadmin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG1D,MAAM,CAAC,MAAM,oBAAoB,GAAqB,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3G,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;CAC3C,CAAC,CAAC,CAAA;AAEH,IAAI,cAAc,GAAG,EAAE,CAAA;AAEvB,MAAM,UAAU,gBAAgB;IAC9B,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,cAAc,GAAG,KAAK,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAC9B,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACzC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AnyCollectionDef } from "@gettersethya/mira-client";
2
+ import { CryptoService } from "@gettersethya/mira";
3
+ import { Layer } from "effect";
4
+ export declare const SuperAdminCollection: AnyCollectionDef;
5
+ export declare const RegisterTokenLive: Layer.Layer<never, never, CryptoService>;
6
+ export declare const getRegisterToken: () => string;
7
+ //# sourceMappingURL=superadmin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superadmin.d.ts","sourceRoot":"","sources":["../src/superadmin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,eAAO,MAAM,oBAAoB,EAAE,gBAMhC,CAAA;AAIH,eAAO,MAAM,iBAAiB,0CAQ7B,CAAA;AAED,eAAO,MAAM,gBAAgB,cAAuB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { AuthCollection } from "@gettersethya/mira-client";
2
+ import { CryptoService } from "@gettersethya/mira";
3
+ import { Effect, Layer } from "effect";
4
+ export const SuperAdminCollection = AuthCollection.define("_superadmin", {}).rules((R) => ({
5
+ list: R.field("email").eq(R.literal("")),
6
+ view: R.field("email").eq(R.literal("")),
7
+ create: R.public(),
8
+ update: R.field("email").eq(R.literal("")),
9
+ delete: R.field("email").eq(R.literal("")),
10
+ }));
11
+ let _registerToken = "";
12
+ export const RegisterTokenLive = Layer.effectDiscard(Effect.gen(function* () {
13
+ const crypto = yield* CryptoService;
14
+ const bytes = yield* crypto.randomBytes(32);
15
+ const token = Buffer.from(bytes).toString("hex");
16
+ _registerToken = token;
17
+ yield* Effect.log(`[dashboard] No superadmin? Register at /_dashboard/register?token=${token}`);
18
+ }));
19
+ export const getRegisterToken = () => _registerToken;
20
+ //# sourceMappingURL=superadmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"superadmin.js","sourceRoot":"","sources":["../src/superadmin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAAqB,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3G,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;CAC3C,CAAC,CAAC,CAAA;AAEH,IAAI,cAAc,GAAG,EAAE,CAAA;AAEvB,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAClD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAA;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAChD,cAAc,GAAG,KAAK,CAAA;IACtB,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,qEAAqE,KAAK,EAAE,CAAC,CAAA;AACjG,CAAC,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,cAAc,CAAA"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@gettersethya/mira-dashboard",
3
+ "version": "0.1.0-alpha.1",
4
+ "type": "module",
5
+ "description": "Admin dashboard plugin for Mira",
6
+ "author": "Getter Sethya",
7
+ "license": "MIT",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/src/index.d.ts",
14
+ "default": "./dist/src/index.js"
15
+ }
16
+ },
17
+ "dependencies": {
18
+ "@effect/language-service": "^0.86.2",
19
+ "@effect/platform": "^0.96.1",
20
+ "@tanstack/svelte-table": "^8.21.3",
21
+ "@tanstack/table-core": "^8.21.3",
22
+ "jose": "^6.2.3",
23
+ "@gettersethya/mira": "0.1.0-alpha.9",
24
+ "@gettersethya/mira-client": "0.1.0-alpha.9"
25
+ },
26
+ "peerDependencies": {
27
+ "effect": ">=3.21"
28
+ },
29
+ "devDependencies": {
30
+ "@effect/vitest": "^0.29.0",
31
+ "@types/node": "^25.7.0",
32
+ "typescript": "^6.0.3",
33
+ "vitest": "^4.1.6"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc",
40
+ "typecheck": "tsc --noEmit",
41
+ "test": "vitest run --passWithNoTests",
42
+ "build:ui": "cd ui && pnpm build",
43
+ "dev:ui": "cd ui && pnpm dev"
44
+ }
45
+ }