@patch-adams/core 1.5.21 → 1.5.23
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/cli.cjs +51 -22
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +51 -22
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +51 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +51 -22
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -119,7 +119,9 @@ var PatchAdamsConfigSchema = zod.z.object({
|
|
|
119
119
|
/** Plugin configurations - each plugin is keyed by its name */
|
|
120
120
|
plugins: PluginsConfigSchema,
|
|
121
121
|
/** Optional skin name — adds 'pa-skinned' + skin class to <html>, loads skin CSS/JS after core files */
|
|
122
|
-
skin: zod.z.string().min(1).optional()
|
|
122
|
+
skin: zod.z.string().min(1).optional(),
|
|
123
|
+
/** URL for server-controlled asset cache version (e.g., https://api.example.com/create/skin/version) */
|
|
124
|
+
assetVersionUrl: zod.z.string().url().optional()
|
|
123
125
|
});
|
|
124
126
|
|
|
125
127
|
// src/config/defaults.ts
|
|
@@ -261,7 +263,8 @@ html.${htmlClass}.${loadingClass} body {
|
|
|
261
263
|
<script data-pa="css-before-loader">
|
|
262
264
|
(function() {
|
|
263
265
|
'use strict';
|
|
264
|
-
var
|
|
266
|
+
var v = window.__pa_v || '';
|
|
267
|
+
var REMOTE_URL = "${remoteUrl}" + (v ? "?v=" + v : "");
|
|
265
268
|
var LOCAL_PATH = "${localPath}";
|
|
266
269
|
|
|
267
270
|
function loadCSSSync(url) {
|
|
@@ -304,7 +307,7 @@ function generateCssAfterLoader(options) {
|
|
|
304
307
|
<script data-pa="css-after-loader">
|
|
305
308
|
(function() {
|
|
306
309
|
'use strict';
|
|
307
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
310
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "");
|
|
308
311
|
var LOCAL_PATH = "${localPath}";
|
|
309
312
|
var TIMEOUT = ${timeout};
|
|
310
313
|
|
|
@@ -1452,8 +1455,8 @@ function generateLrsBridgeCode(options) {
|
|
|
1452
1455
|
', bravaisUserId=' + employeeData.bravaisUserId + ', tenantUrl=' + employeeData.tenantUrl
|
|
1453
1456
|
: 'NO DATA'));
|
|
1454
1457
|
if (employeeData && employeeData.email) {
|
|
1455
|
-
actor.mbox = 'mailto:' + employeeData.email;
|
|
1456
|
-
log('Enhanced actor with email:', employeeData.email);
|
|
1458
|
+
actor.mbox = 'mailto:' + employeeData.email.toLowerCase();
|
|
1459
|
+
log('Enhanced actor with email:', employeeData.email.toLowerCase());
|
|
1457
1460
|
|
|
1458
1461
|
// Also update name if we got a better one
|
|
1459
1462
|
if (employeeData.name && (!actor.name || actor.name === 'Unknown Learner')) {
|
|
@@ -1618,6 +1621,18 @@ function generateLrsBridgeCode(options) {
|
|
|
1618
1621
|
return n === 'anonymous learner' || n === 'unknown learner' || n === 'anonymous' || n === 'unknown';
|
|
1619
1622
|
}
|
|
1620
1623
|
|
|
1624
|
+
/**
|
|
1625
|
+
* Normalize actor IFI fields for consistent matching in Bravais Analytics.
|
|
1626
|
+
* Lowercases mbox email (RFC 5321: local-part is case-insensitive in practice).
|
|
1627
|
+
*/
|
|
1628
|
+
function normalizeActor(actor) {
|
|
1629
|
+
if (!actor) return actor;
|
|
1630
|
+
if (actor.mbox && actor.mbox.indexOf('mailto:') === 0) {
|
|
1631
|
+
actor.mbox = 'mailto:' + actor.mbox.substring(7).toLowerCase();
|
|
1632
|
+
}
|
|
1633
|
+
return actor;
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1621
1636
|
/**
|
|
1622
1637
|
* Persist actor to localStorage for cross-frame sharing.
|
|
1623
1638
|
* Only stores non-anonymous actors.
|
|
@@ -1664,14 +1679,14 @@ function generateLrsBridgeCode(options) {
|
|
|
1664
1679
|
(LRS.actor.account && shared.account && LRS.actor.account.name !== shared.account.name)) {
|
|
1665
1680
|
log('Actor updated from cross-frame storage:', shared.name);
|
|
1666
1681
|
}
|
|
1667
|
-
LRS.actor = shared;
|
|
1668
|
-
return
|
|
1682
|
+
LRS.actor = normalizeActor(shared);
|
|
1683
|
+
return LRS.actor;
|
|
1669
1684
|
}
|
|
1670
1685
|
// Fallback to current actor or re-extract
|
|
1671
1686
|
if (LRS.actor && !isAnonymousActor(LRS.actor)) {
|
|
1672
|
-
return LRS.actor;
|
|
1687
|
+
return normalizeActor(LRS.actor);
|
|
1673
1688
|
}
|
|
1674
|
-
return LRS.actor || extractActor();
|
|
1689
|
+
return normalizeActor(LRS.actor || extractActor());
|
|
1675
1690
|
}
|
|
1676
1691
|
|
|
1677
1692
|
/**
|
|
@@ -1733,9 +1748,9 @@ function generateLrsBridgeCode(options) {
|
|
|
1733
1748
|
function finalizeActor(actor) {
|
|
1734
1749
|
// Try to enhance actor with email if missing
|
|
1735
1750
|
enhanceActorWithEmail(actor, function(enhancedActor) {
|
|
1736
|
-
LRS.actor = enhancedActor;
|
|
1737
|
-
persistActor(
|
|
1738
|
-
callback(
|
|
1751
|
+
LRS.actor = normalizeActor(enhancedActor);
|
|
1752
|
+
persistActor(LRS.actor);
|
|
1753
|
+
callback(LRS.actor);
|
|
1739
1754
|
});
|
|
1740
1755
|
}
|
|
1741
1756
|
|
|
@@ -5190,7 +5205,7 @@ function escapeJs(str) {
|
|
|
5190
5205
|
return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r");
|
|
5191
5206
|
}
|
|
5192
5207
|
function generateJsBeforeLoader(options) {
|
|
5193
|
-
const { remoteUrl, localPath, htmlClass, loadingClass, metadata, lrsBridge, skin } = options;
|
|
5208
|
+
const { remoteUrl, localPath, htmlClass, loadingClass, metadata, lrsBridge, skin, assetVersionUrl } = options;
|
|
5194
5209
|
const lrsBridgeCode = generateLrsBridgeCode(lrsBridge);
|
|
5195
5210
|
const courseLines = [];
|
|
5196
5211
|
if (metadata) {
|
|
@@ -5293,7 +5308,22 @@ window.pa_patcher = window.pa_patcher || {
|
|
|
5293
5308
|
|
|
5294
5309
|
(function() {
|
|
5295
5310
|
'use strict';
|
|
5296
|
-
|
|
5311
|
+
// Fetch server-controlled cache version (sync, once)
|
|
5312
|
+
var ASSET_VERSION_URL = "${assetVersionUrl || ""}";
|
|
5313
|
+
window.__pa_v = '';
|
|
5314
|
+
if (ASSET_VERSION_URL) {
|
|
5315
|
+
try {
|
|
5316
|
+
var xhr = new XMLHttpRequest();
|
|
5317
|
+
xhr.open('GET', ASSET_VERSION_URL, false);
|
|
5318
|
+
xhr.timeout = 2000;
|
|
5319
|
+
xhr.send();
|
|
5320
|
+
if (xhr.status === 200) {
|
|
5321
|
+
window.__pa_v = JSON.parse(xhr.responseText).v || '1';
|
|
5322
|
+
}
|
|
5323
|
+
} catch(e) { window.__pa_v = '1'; }
|
|
5324
|
+
}
|
|
5325
|
+
|
|
5326
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "");
|
|
5297
5327
|
var LOCAL_PATH = "${localPath}";
|
|
5298
5328
|
|
|
5299
5329
|
function loadJSSync(url) {
|
|
@@ -5362,7 +5392,8 @@ function buildJsBeforeOptions(config, metadata) {
|
|
|
5362
5392
|
loadingClass: config.loadingClass,
|
|
5363
5393
|
metadata: metadata ?? null,
|
|
5364
5394
|
lrsBridge,
|
|
5365
|
-
skin: config.skin
|
|
5395
|
+
skin: config.skin,
|
|
5396
|
+
assetVersionUrl: config.assetVersionUrl
|
|
5366
5397
|
};
|
|
5367
5398
|
}
|
|
5368
5399
|
|
|
@@ -5373,7 +5404,7 @@ function generateJsAfterLoader(options) {
|
|
|
5373
5404
|
<script data-pa="js-after-loader">
|
|
5374
5405
|
(function() {
|
|
5375
5406
|
'use strict';
|
|
5376
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
5407
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "");
|
|
5377
5408
|
var LOCAL_PATH = "${localPath}";
|
|
5378
5409
|
var TIMEOUT = ${timeout};
|
|
5379
5410
|
var LOADING_CLASS = "${loadingClass}";
|
|
@@ -5483,7 +5514,7 @@ function generateSkinCssLoader(options) {
|
|
|
5483
5514
|
<script data-pa="skin-css-loader">
|
|
5484
5515
|
(function() {
|
|
5485
5516
|
'use strict';
|
|
5486
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
5517
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "?v=" + Date.now().toString(36));
|
|
5487
5518
|
var LOCAL_PATH = "${localPath}";
|
|
5488
5519
|
var TIMEOUT = ${timeout};
|
|
5489
5520
|
|
|
@@ -5557,9 +5588,8 @@ function generateSkinCssLoader(options) {
|
|
|
5557
5588
|
}
|
|
5558
5589
|
function buildSkinCssOptions(config) {
|
|
5559
5590
|
if (!config.skin) return null;
|
|
5560
|
-
const cacheBuster = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
5561
5591
|
return {
|
|
5562
|
-
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/style.css
|
|
5592
|
+
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/style.css`,
|
|
5563
5593
|
localPath: `skin/${config.skin}/style.css`,
|
|
5564
5594
|
timeout: config.cssAfter.timeout
|
|
5565
5595
|
// reuse cssAfter timeout
|
|
@@ -5573,7 +5603,7 @@ function generateSkinJsLoader(options) {
|
|
|
5573
5603
|
<script data-pa="skin-js-loader">
|
|
5574
5604
|
(function() {
|
|
5575
5605
|
'use strict';
|
|
5576
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
5606
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "?v=" + Date.now().toString(36));
|
|
5577
5607
|
var LOCAL_PATH = "${localPath}";
|
|
5578
5608
|
var TIMEOUT = ${timeout};
|
|
5579
5609
|
|
|
@@ -5659,9 +5689,8 @@ function generateSkinJsLoader(options) {
|
|
|
5659
5689
|
}
|
|
5660
5690
|
function buildSkinJsOptions(config) {
|
|
5661
5691
|
if (!config.skin) return null;
|
|
5662
|
-
const cacheBuster = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
5663
5692
|
return {
|
|
5664
|
-
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/script.js
|
|
5693
|
+
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/script.js`,
|
|
5665
5694
|
localPath: `skin/${config.skin}/script.js`,
|
|
5666
5695
|
timeout: config.jsAfter.timeout
|
|
5667
5696
|
// reuse jsAfter timeout
|