@auersperg/flare 0.3.9 → 0.3.10

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 (34) hide show
  1. package/README.md +3 -1
  2. package/dist/cli/{chunk-5s6zv1h9.js → chunk-jrptpjmm.js} +1 -1
  3. package/dist/cli/{chunk-0s0vrjtw.js → chunk-m0698kap.js} +9 -6
  4. package/dist/cli/{chunk-5yg1zj5n.js → chunk-znktbexz.js} +6 -6
  5. package/dist/cli/{chunk-vx7kmczm.js → chunk-zt96ghm7.js} +12 -6
  6. package/dist/cli/flare.js +5 -5
  7. package/dist/platform/admin.js +31 -23
  8. package/dist/platform/dashboard/_astro/{auth-view.EASEF9BN.js → auth-view.BhUFPmNv.js} +1 -1
  9. package/dist/platform/dashboard/_astro/{cli-approval.DwZVHdyo.js → cli-approval.emPTVRqn.js} +1 -1
  10. package/dist/platform/dashboard/_astro/client.4z54xJ_z.js +1 -0
  11. package/dist/platform/dashboard/_astro/{common.TAClb6G9.js → common.9pujiaSZ.js} +1 -1
  12. package/dist/platform/dashboard/_astro/{data-view.BaHEU4Xa.js → data-view.C-VU8Oxm.js} +1 -1
  13. package/dist/platform/dashboard/_astro/{functions-view.BGOYuDwu.js → functions-view.3yLrtS0h.js} +1 -1
  14. package/dist/platform/dashboard/_astro/{index.astro_astro_type_script_index_0_lang.Blg5hU9g.js → index.astro_astro_type_script_index_0_lang.Dsfj1oeZ.js} +2 -2
  15. package/dist/platform/dashboard/_astro/{input-group.DUp-h0xx.js → input-group.BZ1TZT7L.js} +1 -1
  16. package/dist/platform/dashboard/_astro/{sdk-view.2ErPn4cO.js → sdk-view.BAiQKNm8.js} +1 -1
  17. package/dist/platform/dashboard/_astro/{services-view.iZujitxl.js → services-view.BSrqpyr5.js} +1 -1
  18. package/dist/platform/dashboard/_astro/{settings-view.CqK-mrlB.js → settings-view.C_eYjlIE.js} +1 -1
  19. package/dist/platform/dashboard/bootstrap/facet.js +64 -46
  20. package/dist/platform/dashboard/bootstrap/openapi.json +1 -1
  21. package/dist/platform/dashboard/bootstrap/release.json +2 -2
  22. package/dist/platform/dashboard/index.html +1 -1
  23. package/dist/platform/manifest.json +36 -36
  24. package/dist/platform/runtime.js +99 -66
  25. package/dist/sdk/backup.js +4 -4
  26. package/dist/sdk/client.js +22 -41
  27. package/dist/sdk/cloudflare.js +10 -11
  28. package/dist/sdk/database.js +45 -27
  29. package/dist/sdk/http.d.ts +2 -0
  30. package/dist/sdk/http.js +27 -0
  31. package/dist/sdk/schema.d.ts +2 -2
  32. package/dist/sdk/schema.js +7 -6
  33. package/package.json +2 -2
  34. package/dist/platform/dashboard/_astro/client.BUUZgEFj.js +0 -1
@@ -146,7 +146,7 @@ function documentSchema(table) {
146
146
  }
147
147
  return doc;
148
148
  }
149
- async function documentValue(table, input) {
149
+ async function documentJson(table, input) {
150
150
  boundedJson(input, 65536);
151
151
  const properties = documentSchema(table).properties ?? {};
152
152
  if (!input || Array.isArray(input) || typeof input !== "object" || Object.keys(input).some((k) => !Object.hasOwn(properties, k)))
@@ -154,7 +154,7 @@ async function documentValue(table, input) {
154
154
  const result = await table.validator["~standard"].validate(input);
155
155
  if (result.issues || !result.value || Array.isArray(result.value) || typeof result.value !== "object" || Object.keys(result.value).some((k) => !Object.hasOwn(properties, k)))
156
156
  throw new FlareError("INVALID_INPUT", "Document failed schema validation");
157
- return JSON.parse(boundedJson(result.value, 65536));
157
+ return boundedJson(result.value, 65536);
158
158
  }
159
159
  async function applySchema(storage, schema) {
160
160
  const contract = schemaContract(schema), encoded = stableJson(contract);
@@ -172,13 +172,14 @@ async function applySchema(storage, schema) {
172
172
  }
173
173
  for (const [name, definition] of Object.entries(contract)) {
174
174
  storage.sql.exec(`CREATE TABLE IF NOT EXISTS ${quote(name)} (_id TEXT PRIMARY KEY, _creationTime REAL NOT NULL, _data TEXT NOT NULL CHECK(json_valid(_data)))`);
175
+ const changed = !old[name] || stableJson(old[name].document) !== stableJson(definition.document);
175
176
  let cursor = "";
176
- while (!old[name] || stableJson(old[name].document) !== stableJson(definition.document)) {
177
+ while (changed) {
177
178
  const rows = storage.sql.exec(`SELECT _id,_data FROM ${quote(name)} WHERE _id > ? ORDER BY _id LIMIT 100`, cursor).toArray();
178
179
  for (const row of rows) {
179
- const value = await documentValue(schema[name], JSON.parse(String(row._data)));
180
- if (stableJson(value) !== stableJson(JSON.parse(String(row._data))))
181
- storage.sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`, stableJson(value), row._id);
180
+ const value = await documentJson(schema[name], JSON.parse(String(row._data)));
181
+ if (value !== stableJson(JSON.parse(String(row._data))))
182
+ storage.sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`, value, row._id);
182
183
  }
183
184
  if (rows.length < 100)
184
185
  break;
@@ -313,10 +314,10 @@ async function restoreData(storage, schema, id, snapshot) {
313
314
  for (const doc of docs) {
314
315
  if (++count > SNAPSHOT_ROWS || !doc || !/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(doc._id) || !Number.isFinite(doc._creationTime) || doc._creationTime < 0)
315
316
  reject("INVALID_BACKUP");
316
- const value = await documentValue(schema[name], doc.value);
317
- if (stableJson(value) !== stableJson(doc.value))
317
+ const value = await documentJson(schema[name], doc.value);
318
+ if (value !== stableJson(doc.value))
318
319
  reject("INVALID_BACKUP");
319
- storage.sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, doc._id, doc._creationTime, stableJson(value));
320
+ storage.sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, doc._id, doc._creationTime, value);
320
321
  }
321
322
  }
322
323
  storage.sql.exec("UPDATE _flared_revision SET value=? WHERE id=1", snapshot.revision);
@@ -390,7 +391,7 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
390
391
  function query(name) {
391
392
  const definition = table(name);
392
393
  function make(index, filters, direction) {
393
- const page = (options) => task(async () => {
394
+ const page = (options, withCursor = true) => task(async () => {
394
395
  table(name);
395
396
  size(options.limit);
396
397
  const fields = [
@@ -399,9 +400,18 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
399
400
  "_id"
400
401
  ];
401
402
  const expressions = fields.map(fieldSql);
402
- const signature = stableJson({ name, index, filters, direction });
403
+ const signature = withCursor ? stableJson({ name, index, filters, direction }) : "";
404
+ const fixed = filters.filter((f) => f.operator === "=");
403
405
  const where = filters.map((f) => `${fieldSql(f.field)} ${f.operator === "=" ? "IS" : f.operator} ?`);
404
406
  const bindings = filters.map((f) => bind(f.value));
407
+ const rowLimit = options.limit + (withCursor ? 1 : 0);
408
+ const rows = [];
409
+ const read = (terms = [], values = [], orderStart = fixed.length) => {
410
+ if (rows.length >= rowLimit)
411
+ return;
412
+ const conditions = [...terms, ...where];
413
+ rows.push(...sql.exec(`SELECT *${withCursor ? "," + expressions.map((e, i) => `${e} AS __k${i}`).join(",") : ""} FROM ${quote(name)} ${conditions.length ? "WHERE " + conditions.join(" AND ") : ""} ORDER BY ${expressions.slice(orderStart).map((e) => `${e} ${direction}`).join(",")} LIMIT ?`, ...values, ...bindings, rowLimit - rows.length).toArray());
414
+ };
405
415
  if (options.cursor != null) {
406
416
  let token;
407
417
  try {
@@ -411,23 +421,32 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
411
421
  } catch {
412
422
  throw new FlareError("INVALID_CURSOR", "Invalid cursor");
413
423
  }
414
- if (token.signature !== signature || !Array.isArray(token.values) || token.values.length !== fields.length || !token.values.every(scalar))
424
+ if (!token || token.signature !== signature || !Array.isArray(token.values) || token.values.length !== fields.length || !token.values.every(scalar) || typeof token.values.at(-2) !== "number" || typeof token.values.at(-1) !== "string")
415
425
  throw new FlareError("INVALID_CURSOR", "Cursor belongs to a different query");
416
- const terms = expressions.map((expr, i) => {
417
- const prefix = expressions.slice(0, i).map((e) => `${e} IS ?`);
418
- bindings.push(...token.values.slice(0, i).map(bind));
419
- const value = token.values[i];
420
- if (value === null)
421
- prefix.push(direction === "asc" ? `${expr} IS NOT NULL` : "0");
422
- else {
423
- prefix.push(direction === "asc" ? `${expr} > ?` : `(${expr} < ? OR ${expr} IS NULL)`);
424
- bindings.push(bind(value));
426
+ if (fixed.some((f, i) => bind(f.value) !== bind(token.values[i])))
427
+ throw new FlareError("INVALID_CURSOR", "Cursor violates index range");
428
+ const first = fixed.length;
429
+ for (let i = expressions.length - 2;i >= first && rows.length < rowLimit; i--) {
430
+ const prefix = expressions.slice(first, i).map((e) => `${e} IS ?`);
431
+ const values = token.values.slice(first, i).map(bind);
432
+ const expr = expressions[i], value = token.values[i];
433
+ if (i === expressions.length - 2) {
434
+ read([
435
+ ...prefix,
436
+ `(${expressions.slice(i).join(",")}) ${direction === "asc" ? ">" : "<"} (?,?)`
437
+ ], [...values, ...token.values.slice(i).map(bind)], i);
438
+ } else if (direction === "asc") {
439
+ read([
440
+ ...prefix,
441
+ value === null ? `${expr} IS NOT NULL` : `${expr} > ?`
442
+ ], value === null ? values : [...values, bind(value)], i);
443
+ } else if (value !== null) {
444
+ read([...prefix, `${expr} < ?`], [...values, bind(value)], i);
445
+ read([...prefix, `${expr} IS NULL`], values, i + 1);
425
446
  }
426
- return "(" + prefix.join(" AND ") + ")";
427
- });
428
- where.push("(" + terms.join(" OR ") + ")");
429
- }
430
- const rows = sql.exec(`SELECT *,${expressions.map((e, i) => `${e} AS __k${i}`).join(",")} FROM ${quote(name)} ${where.length ? "WHERE " + where.join(" AND ") : ""} ORDER BY ${expressions.map((e) => `${e} ${direction}`).join(",")} LIMIT ?`, ...bindings, options.limit + 1).toArray();
447
+ }
448
+ } else
449
+ read();
431
450
  let more = rows.length > options.limit;
432
451
  if (more)
433
452
  rows.pop();
@@ -443,7 +462,7 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
443
462
  bytes += length;
444
463
  }
445
464
  const last = rows[docs.length - 1];
446
- const continueCursor = more && last ? btoa(String.fromCharCode(...new TextEncoder().encode(boundedJson({
465
+ const continueCursor = withCursor && more && last ? btoa(String.fromCharCode(...new TextEncoder().encode(boundedJson({
447
466
  signature,
448
467
  values: expressions.map((_, i) => last[`__k${i}`])
449
468
  }, 6144)))) : null;
@@ -500,14 +519,14 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
500
519
  paginate: page,
501
520
  take(limit) {
502
521
  return task(async () => {
503
- const result = await page({ limit });
522
+ const result = await page({ limit }, false);
504
523
  if (!result.isDone && result.page.length < limit)
505
524
  throw new FlareError("TOO_LARGE", "Use paginate for large documents");
506
525
  return result.page;
507
526
  }, false);
508
527
  },
509
528
  first() {
510
- return task(async () => (await page({ limit: 1 })).page[0] ?? null, false);
529
+ return task(async () => (await page({ limit: 1 }, false)).page[0] ?? null, false);
511
530
  }
512
531
  });
513
532
  }
@@ -518,10 +537,10 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
518
537
  insert(name, input) {
519
538
  return task(async () => {
520
539
  writing();
521
- const definition = table(name), value = await documentValue(definition, input);
540
+ const definition = table(name), value = await documentJson(definition, input);
522
541
  writing();
523
542
  const id = crypto.randomUUID();
524
- sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, id, Date.now(), stableJson(value));
543
+ sql.exec(`INSERT INTO ${quote(name)} VALUES (?,?,?)`, id, Date.now(), value);
525
544
  changed.add(name);
526
545
  return id;
527
546
  });
@@ -537,12 +556,12 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
537
556
  const row = sql.exec(`SELECT _data FROM ${quote(name)} WHERE _id=?`, id).toArray()[0];
538
557
  if (!row)
539
558
  throw new FlareError("NOT_FOUND", "Document not found");
540
- const value = await documentValue(definition, {
559
+ const value = await documentJson(definition, {
541
560
  ...JSON.parse(String(row._data)),
542
561
  ...patch
543
562
  });
544
563
  writing();
545
- sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`, stableJson(value), id);
564
+ sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=?`, value, id);
546
565
  changed.add(name);
547
566
  });
548
567
  },
@@ -551,9 +570,9 @@ function database(sql, schema, writable, touched = new Set, changed = new Set) {
551
570
  writing();
552
571
  const definition = table(name);
553
572
  checkedId(id);
554
- const value = await documentValue(definition, input);
573
+ const value = await documentJson(definition, input);
555
574
  writing();
556
- const rows = sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=? RETURNING _id`, stableJson(value), id).toArray();
575
+ const rows = sql.exec(`UPDATE ${quote(name)} SET _data=? WHERE _id=? RETURNING _id`, value, id).toArray();
557
576
  if (!rows.length)
558
577
  throw new FlareError("NOT_FOUND", "Document not found");
559
578
  changed.add(name);
@@ -682,7 +701,7 @@ function createFacet(app) {
682
701
  }
683
702
  let result = null;
684
703
  const changed = new Set;
685
- await this.ctx.storage.transaction(async () => {
704
+ const revision = await this.ctx.storage.transaction(async () => {
686
705
  let active = true;
687
706
  const scheduled = [];
688
707
  const jobs = Object.freeze({
@@ -716,9 +735,7 @@ function createFacet(app) {
716
735
  if (!active)
717
736
  throw new FlareError("CAPABILITY_EXPIRED", "Mutation invocation ended");
718
737
  const id = crypto.randomUUID();
719
- this.ctx.storage.sql.exec("INSERT INTO _flared_outbox (id,release,path,args,auth,dueAt) VALUES (?,?,?,?,?,?)", id, this.env.RELEASE_ID, path, JSON.stringify(input), JSON.stringify(call.auth), Date.now() + Math.ceil(delay * 1000));
720
- if (target.auth === "internal")
721
- this.ctx.storage.sql.exec("UPDATE _flared_outbox SET internal=1,auth='null' WHERE id=?", id);
738
+ this.ctx.storage.sql.exec("INSERT INTO _flared_outbox (id,release,path,args,auth,dueAt,internal) VALUES (?,?,?,?,?,?,?)", id, this.env.RELEASE_ID, path, JSON.stringify(input), JSON.stringify(target.auth === "internal" ? null : call.auth), Date.now() + Math.ceil(delay * 1000), Number(target.auth === "internal"));
722
739
  return id;
723
740
  })();
724
741
  scheduled.push(pending);
@@ -741,16 +758,17 @@ function createFacet(app) {
741
758
  capability.revoke();
742
759
  await Promise.allSettled(scheduled);
743
760
  }
744
- this.commitRevision(changed);
761
+ return this.commitRevision(changed);
745
762
  });
746
763
  await this.ctx.storage.sync();
747
- return { result, revision: this.revision(), tables: [...changed] };
764
+ return { result, revision, tables: [...changed] };
748
765
  });
749
766
  }
750
767
  commitRevision(changed) {
751
- this.ctx.storage.sql.exec("UPDATE _flared_revision SET value=value+1 WHERE id=1");
768
+ const revision = Number(this.ctx.storage.sql.exec("UPDATE _flared_revision SET value=value+1 WHERE id=1 RETURNING value").one().value);
752
769
  for (const name of changed)
753
- this.ctx.storage.sql.exec("INSERT INTO _flared_changes VALUES (?,?) ON CONFLICT(name) DO UPDATE SET revision=excluded.revision", name, this.revision());
770
+ this.ctx.storage.sql.exec("INSERT INTO _flared_changes VALUES (?,?) ON CONFLICT(name) DO UPDATE SET revision=excluded.revision", name, revision);
771
+ return revision;
754
772
  }
755
773
  pendingJobs(limit = 100) {
756
774
  return this.serial(async () => {
@@ -875,7 +893,7 @@ function createFacet(app) {
875
893
  boundedJson(input, LIMITS.inputBytes);
876
894
  let rows = [];
877
895
  const changed = new Set;
878
- await this.ctx.storage.transaction(async () => {
896
+ const revision = await this.ctx.storage.transaction(async () => {
879
897
  if (input.expectedRevision !== this.revision())
880
898
  throw new FlareError("CONFLICT", "Data changed; reload before editing");
881
899
  const capability = database(this.ctx.storage.sql, app.schema, true, new Set, changed);
@@ -897,10 +915,10 @@ function createFacet(app) {
897
915
  } finally {
898
916
  capability.revoke();
899
917
  }
900
- this.commitRevision(changed);
918
+ return this.commitRevision(changed);
901
919
  });
902
920
  await this.ctx.storage.sync();
903
- return { rows, revision: this.revision() };
921
+ return { rows, revision };
904
922
  });
905
923
  }
906
924
  };
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "Flare application contract",
5
- "version": "153ae0371d561a6d70353c018514332e661f1307cab60b8dc45cd634b8d88a03"
5
+ "version": "dc5483b6d700713c8dcf9d96e707bb4d264f89f25e97b3ae5f44ab5c10fc0e71"
6
6
  },
7
7
  "components": {
8
8
  "schemas": {},
@@ -2,10 +2,10 @@
2
2
  "protocol": 1,
3
3
  "compatibilityDate": "2026-10-10",
4
4
  "checksums": {
5
- "facet": "0c9e05c236480046a3588e84a637da1948505b7c4be9ceb65f230fa3a6ede3bf",
5
+ "facet": "8d7880b99b69d141a58da4c7574b26c39dbc529785512298683239dee657a38b",
6
6
  "action": "9d4559fcd73c82006c36891f01b6747001fbce4e5c578e83addbf5251b320dc4",
7
7
  "schema": "44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a",
8
8
  "manifest": "006a07907dfd7619fa66152627bc761e581cf8ac538f5002f3b89b71ce92d733"
9
9
  },
10
- "hash": "153ae0371d561a6d70353c018514332e661f1307cab60b8dc45cd634b8d88a03"
10
+ "hash": "dc5483b6d700713c8dcf9d96e707bb4d264f89f25e97b3ae5f44ab5c10fc0e71"
11
11
  }
@@ -1 +1 @@
1
- <!DOCTYPE html><html lang="en" class="dark"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>Flare · Dashboard</title><meta http-equiv="content-security-policy" content="script-src 'self' 'sha256-xIb/Pa7FUshAu4ihwjchYcQpyCI8eS8kt40GpOAYCz8=' 'sha256-1BvDVWLr3QCC20uHhUDi27eDFVJpk1uMQJGIWKUks2I=' 'sha256-kmZE/W8I1iuTnl1b3yqzv9/DQZenPngd3NjSKMQl7y0=' 'sha256-Y8t0ntteBwH+PqGKUyjWW3CAk+BNJKSoQc0xZ68FjhM=' 'sha256-0O7iB6zr9x0r6X6eWYITC9V5q+yWCGAoFvcysBGbY9Q=' 'sha256-tQIkdAw2vqfQ1PjgUE4ML2A4pIV8SByQ1Seeehy6UIc=' 'sha256-4f86GpVBksx63uHEB4f15jGyhnVEOKjwqYxwnfDVOik='; style-src 'self' 'sha256-vv9IoKo7BSLbWcUHr3tNmfNVmm5L/9Cfn2H6LMk7/ow=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=';"><link rel="stylesheet" href="/_astro/index.BPQdjJ4j.css"></head><body><div id="flare-dashboard"><div class="p-6 text-sm text-muted-foreground" role="status">Loading Flare…</div></div><script type="module" src="/_astro/index.astro_astro_type_script_index_0_lang.Blg5hU9g.js"></script></body></html>
1
+ <!DOCTYPE html><html lang="en" class="dark"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="noindex,nofollow"><title>Flare · Dashboard</title><meta http-equiv="content-security-policy" content="script-src 'self' 'sha256-xIb/Pa7FUshAu4ihwjchYcQpyCI8eS8kt40GpOAYCz8=' 'sha256-1BvDVWLr3QCC20uHhUDi27eDFVJpk1uMQJGIWKUks2I=' 'sha256-kmZE/W8I1iuTnl1b3yqzv9/DQZenPngd3NjSKMQl7y0=' 'sha256-Y8t0ntteBwH+PqGKUyjWW3CAk+BNJKSoQc0xZ68FjhM=' 'sha256-0O7iB6zr9x0r6X6eWYITC9V5q+yWCGAoFvcysBGbY9Q=' 'sha256-tQIkdAw2vqfQ1PjgUE4ML2A4pIV8SByQ1Seeehy6UIc=' 'sha256-4f86GpVBksx63uHEB4f15jGyhnVEOKjwqYxwnfDVOik='; style-src 'self' 'sha256-vv9IoKo7BSLbWcUHr3tNmfNVmm5L/9Cfn2H6LMk7/ow=' 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=';"><link rel="stylesheet" href="/_astro/index.BPQdjJ4j.css"></head><body><div id="flare-dashboard"><div class="p-6 text-sm text-muted-foreground" role="status">Loading Flare…</div></div><script type="module" src="/_astro/index.astro_astro_type_script_index_0_lang.Dsfj1oeZ.js"></script></body></html>
@@ -1,34 +1,34 @@
1
1
  {
2
2
  "format": 1,
3
- "version": "0.3.9",
3
+ "version": "0.3.10",
4
4
  "stateFormat": 1,
5
5
  "protocol": 1,
6
6
  "runtimeAbi": 4,
7
7
  "compatibilityDate": "2026-10-10",
8
8
  "wranglerVersion": "4.150.0",
9
9
  "upgradeFrom": [
10
- "0.3.8"
10
+ "0.3.9"
11
11
  ],
12
12
  "files": [
13
13
  {
14
14
  "path": "admin.js",
15
- "bytes": 37187,
16
- "sha256": "49f0ae5f7f00dec3ee19882ec2cef180e40bb12e0a3a0a687702a5147d3f6154"
15
+ "bytes": 37414,
16
+ "sha256": "ff57c880be7a520f2c8dc48dd37f09d3e3e1b19e007c3b84e38207d2cc7648a0"
17
17
  },
18
18
  {
19
- "path": "dashboard/_astro/auth-view.EASEF9BN.js",
19
+ "path": "dashboard/_astro/auth-view.BhUFPmNv.js",
20
20
  "bytes": 3494,
21
- "sha256": "665ffd7f43f5d644ff9353366c7a4474ee95499c67f17da8d93fa98abb551c91"
21
+ "sha256": "b0d9bfb46f83decc6bbd7337a4c4700d5bcf51615329097e3f0706a6dbe5277c"
22
22
  },
23
23
  {
24
- "path": "dashboard/_astro/cli-approval.DwZVHdyo.js",
24
+ "path": "dashboard/_astro/cli-approval.emPTVRqn.js",
25
25
  "bytes": 2090,
26
- "sha256": "998ab228bcfed19706d7aaf4d890c22f815bb44efc761e5d25920c1f36ed1471"
26
+ "sha256": "205448bcd17d236b992219ce3d46cc1f2fb890be8dd9152b5b13c690154176d3"
27
27
  },
28
28
  {
29
- "path": "dashboard/_astro/client.BUUZgEFj.js",
30
- "bytes": 9233,
31
- "sha256": "1ecc2a7ab31c7017171920b73080ba2b8385cac07f4929ec70129e04624d8f67"
29
+ "path": "dashboard/_astro/client.4z54xJ_z.js",
30
+ "bytes": 9421,
31
+ "sha256": "971a52677beaca55fb45fe83c93c65873d8f33e5fbb24ef22a8e564ca9240c5b"
32
32
  },
33
33
  {
34
34
  "path": "dashboard/_astro/client.Bcl1NrNO.js",
@@ -41,19 +41,19 @@
41
41
  "sha256": "734f339e4f5fe6dc3597d92c36a0c55023927eebfe4f006f23ad8552e5d48e9a"
42
42
  },
43
43
  {
44
- "path": "dashboard/_astro/common.TAClb6G9.js",
45
- "bytes": 188568,
46
- "sha256": "a9f01fb0507648ce7e75f270817681af0e05aca3cbe7472968f1bc321fa1c474"
44
+ "path": "dashboard/_astro/common.9pujiaSZ.js",
45
+ "bytes": 188723,
46
+ "sha256": "d2313bf971c2c4e73f6ed7e5bd9f687c8ece4969f1405e8cc774cbc8885e335d"
47
47
  },
48
48
  {
49
- "path": "dashboard/_astro/data-view.BaHEU4Xa.js",
49
+ "path": "dashboard/_astro/data-view.C-VU8Oxm.js",
50
50
  "bytes": 5806,
51
- "sha256": "3a42d93bfe6b3bb7bd93bb193dae0e54869056d1fcafc63dbaa8bf2b818f3a1f"
51
+ "sha256": "b3c0ae89c7ed79018be179c2d4d89a8d1036f9ba0d9eb8eef3c0ff9fcf3b1352"
52
52
  },
53
53
  {
54
- "path": "dashboard/_astro/functions-view.BGOYuDwu.js",
54
+ "path": "dashboard/_astro/functions-view.3yLrtS0h.js",
55
55
  "bytes": 6206,
56
- "sha256": "e6b8953cce582240f659299aa25d19c3a729963ad70f2c2183358f86930e96fa"
56
+ "sha256": "5f0b0d4cf0551967a46038d72a605b1c8b4594e484b13f13a79fc52840c3cd8a"
57
57
  },
58
58
  {
59
59
  "path": "dashboard/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2",
@@ -86,29 +86,29 @@
86
86
  "sha256": "03da0b7733798a393d7ebdaf27b5bb63387da684ff3dcf8b3e87215947fa3409"
87
87
  },
88
88
  {
89
- "path": "dashboard/_astro/index.astro_astro_type_script_index_0_lang.Blg5hU9g.js",
89
+ "path": "dashboard/_astro/index.astro_astro_type_script_index_0_lang.Dsfj1oeZ.js",
90
90
  "bytes": 37063,
91
- "sha256": "c6240b8ed90650558c8c640db28daac35614af6960673afd841388f381524641"
91
+ "sha256": "7f4aae37b3f2cac28e8b98b60f8414e4369cf27e6a26c2e96be2db5c8cd8e4d8"
92
92
  },
93
93
  {
94
- "path": "dashboard/_astro/input-group.DUp-h0xx.js",
94
+ "path": "dashboard/_astro/input-group.BZ1TZT7L.js",
95
95
  "bytes": 3065,
96
- "sha256": "408ba6d9e9c9514b0ad4fb99257be06001d7ed35cc08cfccd5d04762162a61c7"
96
+ "sha256": "bc374261661a0f68182a5cfe074c66cbd932781da6e27891e79b9152f7e8c1bd"
97
97
  },
98
98
  {
99
- "path": "dashboard/_astro/sdk-view.2ErPn4cO.js",
99
+ "path": "dashboard/_astro/sdk-view.BAiQKNm8.js",
100
100
  "bytes": 3363,
101
- "sha256": "041f683aeaca98c40b0c52535c5feed03aad5752bef34728e5bbb073d2af2b02"
101
+ "sha256": "d5264609f8697cff4853cf068513b7b9f416cc01aaff826b950ae905db49c7e8"
102
102
  },
103
103
  {
104
- "path": "dashboard/_astro/services-view.iZujitxl.js",
104
+ "path": "dashboard/_astro/services-view.BSrqpyr5.js",
105
105
  "bytes": 8249,
106
- "sha256": "1f70bafd7241b5e383312840eead471cc5a0f5286b36967eda6be4e531e9fd5c"
106
+ "sha256": "bc04feb0b2a3c76540717c52f53c2fb147cbed5a3aed575827fb72efb4804947"
107
107
  },
108
108
  {
109
- "path": "dashboard/_astro/settings-view.CqK-mrlB.js",
109
+ "path": "dashboard/_astro/settings-view.C_eYjlIE.js",
110
110
  "bytes": 10768,
111
- "sha256": "7c09bc1744c3f16ef08b7ae7d50ca58c92b69d56ee7e6e73306202920d0b051f"
111
+ "sha256": "e7c84f0c1e489648dafcf49f55c9de53ce6aaf05ebb3dce5eff996ca64da2d03"
112
112
  },
113
113
  {
114
114
  "path": "dashboard/_headers",
@@ -127,8 +127,8 @@
127
127
  },
128
128
  {
129
129
  "path": "dashboard/bootstrap/facet.js",
130
- "bytes": 39320,
131
- "sha256": "0c9e05c236480046a3588e84a637da1948505b7c4be9ceb65f230fa3a6ede3bf"
130
+ "bytes": 40427,
131
+ "sha256": "8d7880b99b69d141a58da4c7574b26c39dbc529785512298683239dee657a38b"
132
132
  },
133
133
  {
134
134
  "path": "dashboard/bootstrap/manifest.json",
@@ -138,12 +138,12 @@
138
138
  {
139
139
  "path": "dashboard/bootstrap/openapi.json",
140
140
  "bytes": 362,
141
- "sha256": "d70572ce094df85c5df2cc4e316edcee1e84176e716385245e2998aab884bc0b"
141
+ "sha256": "d602aafe3f2f21942591873eda674010664184ff73cdf53febfb7be6fdb967e5"
142
142
  },
143
143
  {
144
144
  "path": "dashboard/bootstrap/release.json",
145
145
  "bytes": 484,
146
- "sha256": "854c8963402c101bddd892268354cfec6fed83b288b803dfccf617ffac75bfa9"
146
+ "sha256": "aedb7f315473644366810a7ab4c722803fca8ee0a72b11849c57ed5ed195978b"
147
147
  },
148
148
  {
149
149
  "path": "dashboard/bootstrap/schema.json",
@@ -153,7 +153,7 @@
153
153
  {
154
154
  "path": "dashboard/index.html",
155
155
  "bytes": 1095,
156
- "sha256": "748e410d730b6e36f4a8cf5450698f230637e787c41395e08a83a17688562e3e"
156
+ "sha256": "6406e6185bebae7aea73d6933d4027385b112591379e5db4ae139fcbd36cfd41"
157
157
  },
158
158
  {
159
159
  "path": "migrations/0001.sql",
@@ -187,9 +187,9 @@
187
187
  },
188
188
  {
189
189
  "path": "runtime.js",
190
- "bytes": 355598,
191
- "sha256": "f51eb0521194d3eb83e949b5f92c9f5327096fcb5306fe10425038576618af5a"
190
+ "bytes": 356515,
191
+ "sha256": "2d1df9af7b4f165e6e8ba11d9f147ce2d2a8c8c93c74f63cc2bfb413b3fce043"
192
192
  }
193
193
  ],
194
- "digest": "a0d7181857f7b4ec5be28c139389cadac59b5d21a88a812f22ce424cdb605965"
194
+ "digest": "60e168956cdc51d2d0897a15f1c18576cf727a1fe07dea39393670292a0ec974"
195
195
  }