@keyframerdev/vitals 0.1.0 → 0.1.2

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/dist/babel.cjs CHANGED
@@ -319,10 +319,16 @@ ${key}`)}`, fn, component: null, prop: null });
319
319
  const value = (a) => a?.value?.type === "JSXExpressionContainer" && a.value.expression.type !== "JSXEmptyExpression" ? a.value.expression : null;
320
320
  const setAttr = (n, expr) => {
321
321
  const a = attr(n);
322
- if (a)
322
+ if (a) {
323
323
  a.value = t.jsxExpressionContainer(expr);
324
+ return;
325
+ }
326
+ const added = t.jsxAttribute(t.jsxIdentifier(n), t.jsxExpressionContainer(expr));
327
+ const spread = el.attributes.findIndex((x) => x.type === "JSXSpreadAttribute");
328
+ if (spread >= 0)
329
+ el.attributes.splice(spread, 0, added);
324
330
  else
325
- el.attributes.push(t.jsxAttribute(t.jsxIdentifier(n), t.jsxExpressionContainer(expr)));
331
+ el.attributes.push(added);
326
332
  };
327
333
  const loc = el.loc;
328
334
  if (loc) {
package/dist/index.js CHANGED
@@ -620,7 +620,7 @@ function slimArg(a, idOf) {
620
620
 
621
621
  // src/version.ts
622
622
  var SDK_NAME = "@keyframerdev/vitals";
623
- var SDK_VERSION = "0.1.0";
623
+ var SDK_VERSION = "0.1.2";
624
624
 
625
625
  // src/controller.ts
626
626
  var STORAGE_KEYS = {
@@ -1114,7 +1114,8 @@ class VitalsController {
1114
1114
  }
1115
1115
  if (res.status === 429 || res.status >= 500)
1116
1116
  return "retry";
1117
- this.log(`report refused (${res.status})`);
1117
+ const why = (await res.json().catch(() => null))?.error;
1118
+ this.log(`report refused (${res.status})${why ? `: ${why}` : ""}`);
1118
1119
  return "done";
1119
1120
  } catch {
1120
1121
  return "retry";
@@ -1264,6 +1265,40 @@ function tickFieldMeter(f, t) {
1264
1265
  return f.buf.length >= 90;
1265
1266
  }
1266
1267
 
1268
+ // src/jsLoop.ts
1269
+ function createJsLoop({ raf, frame }) {
1270
+ let running = false;
1271
+ let gen = 0;
1272
+ const chain = (mine) => {
1273
+ const tick = () => {
1274
+ if (!running || mine !== gen)
1275
+ return;
1276
+ if (frame())
1277
+ raf(tick);
1278
+ else
1279
+ running = false;
1280
+ };
1281
+ return tick;
1282
+ };
1283
+ return {
1284
+ get running() {
1285
+ return running;
1286
+ },
1287
+ start() {
1288
+ if (running)
1289
+ return false;
1290
+ running = true;
1291
+ gen++;
1292
+ raf(chain(gen));
1293
+ return true;
1294
+ },
1295
+ stop() {
1296
+ running = false;
1297
+ gen++;
1298
+ }
1299
+ };
1300
+ }
1301
+
1267
1302
  // src/native.ts
1268
1303
  var perf = globalThis.performance;
1269
1304
  var now = () => perf && typeof perf.now === "function" ? perf.now() : Date.now();
@@ -1404,21 +1439,18 @@ function extendUi(ms) {
1404
1439
  }, ms);
1405
1440
  }
1406
1441
  var jsMeter = createFieldMeter("js");
1407
- var jsRunning = false;
1408
- function jsTick() {
1409
- if (!jsRunning)
1410
- return;
1411
- const t = now();
1412
- const last = jsMeter.m.last;
1413
- const interval = jsMeter.m.interval;
1414
- tickFrameMeter(jsMeter.m, t);
1415
- jsMeter.m.stats.length = 0;
1416
- jsMeter.m.drops.length = 0;
1417
- if (controller.jsFrame(t, last >= 0 ? t - last : 0, interval))
1418
- requestAnimationFrame(jsTick);
1419
- else
1420
- jsRunning = false;
1421
- }
1442
+ var jsLoop = createJsLoop({
1443
+ raf: (cb) => requestAnimationFrame(cb),
1444
+ frame: () => {
1445
+ const t = now();
1446
+ const last = jsMeter.m.last;
1447
+ const interval = jsMeter.m.interval;
1448
+ tickFrameMeter(jsMeter.m, t);
1449
+ jsMeter.m.stats.length = 0;
1450
+ jsMeter.m.drops.length = 0;
1451
+ return controller.jsFrame(t, last >= 0 ? t - last : 0, interval);
1452
+ }
1453
+ });
1422
1454
  var uiInstalled = false;
1423
1455
  var meters = {
1424
1456
  install() {
@@ -1437,10 +1469,9 @@ var meters = {
1437
1469
  uiInstalled = false;
1438
1470
  },
1439
1471
  start() {
1440
- if (!jsRunning) {
1441
- jsRunning = true;
1472
+ if (!jsLoop.running) {
1442
1473
  jsMeter.m.last = -1;
1443
- requestAnimationFrame(jsTick);
1474
+ jsLoop.start();
1444
1475
  }
1445
1476
  },
1446
1477
  extendUi(ms) {
@@ -1448,7 +1479,7 @@ var meters = {
1448
1479
  extendUi(ms);
1449
1480
  },
1450
1481
  stop() {
1451
- jsRunning = false;
1482
+ jsLoop.stop();
1452
1483
  if (uiInstalled)
1453
1484
  stopUi();
1454
1485
  }
@@ -0,0 +1,11 @@
1
+ export type JsLoopDeps = {
2
+ raf: (cb: () => void) => unknown;
3
+ /** One frame: return false to end the loop (the motion window closed). */
4
+ frame: () => boolean;
5
+ };
6
+ export declare function createJsLoop({ raf, frame }: JsLoopDeps): {
7
+ readonly running: boolean;
8
+ /** Starts the loop unless it is already running. Returns true when it started a new chain. */
9
+ start(): boolean;
10
+ stop(): void;
11
+ };
@@ -1,3 +1,3 @@
1
1
  /** This package's version: sent in every report's `sdk`, and compared with the config's `minSdk`. Keep it in step with package.json. */
2
2
  export declare const SDK_NAME = "@keyframerdev/vitals";
3
- export declare const SDK_VERSION = "0.1.0";
3
+ export declare const SDK_VERSION = "0.1.2";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keyframerdev/vitals",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Motion Vitals for React Native: slow frames and janky animations from production, by screen and call site",
5
5
  "keywords": [
6
6
  "react-native",