@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.d.cts
CHANGED
|
@@ -301,6 +301,8 @@ declare const PatchAdamsConfigSchema: z.ZodObject<{
|
|
|
301
301
|
}, z.ZodTypeAny, "passthrough">>>>;
|
|
302
302
|
/** Optional skin name — adds 'pa-skinned' + skin class to <html>, loads skin CSS/JS after core files */
|
|
303
303
|
skin: z.ZodOptional<z.ZodString>;
|
|
304
|
+
/** URL for server-controlled asset cache version (e.g., https://api.example.com/create/skin/version) */
|
|
305
|
+
assetVersionUrl: z.ZodOptional<z.ZodString>;
|
|
304
306
|
}, "strip", z.ZodTypeAny, {
|
|
305
307
|
remoteDomain: string;
|
|
306
308
|
htmlClass: string;
|
|
@@ -353,6 +355,7 @@ declare const PatchAdamsConfigSchema: z.ZodObject<{
|
|
|
353
355
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
354
356
|
}, z.ZodTypeAny, "passthrough">>;
|
|
355
357
|
skin?: string | undefined;
|
|
358
|
+
assetVersionUrl?: string | undefined;
|
|
356
359
|
}, {
|
|
357
360
|
remoteDomain: string;
|
|
358
361
|
htmlClass?: string | undefined;
|
|
@@ -405,6 +408,7 @@ declare const PatchAdamsConfigSchema: z.ZodObject<{
|
|
|
405
408
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
406
409
|
}, z.ZodTypeAny, "passthrough">> | undefined;
|
|
407
410
|
skin?: string | undefined;
|
|
411
|
+
assetVersionUrl?: string | undefined;
|
|
408
412
|
}>;
|
|
409
413
|
type PatchAdamsConfig = z.infer<typeof PatchAdamsConfigSchema>;
|
|
410
414
|
type LrsBridgeConfig = z.infer<typeof LrsBridgeConfigSchema>;
|
|
@@ -1070,6 +1074,8 @@ interface JsBeforeOptions {
|
|
|
1070
1074
|
lrsBridge: LrsBridgeOptions;
|
|
1071
1075
|
/** Optional skin name */
|
|
1072
1076
|
skin?: string;
|
|
1077
|
+
/** URL for server-controlled asset cache version */
|
|
1078
|
+
assetVersionUrl?: string;
|
|
1073
1079
|
}
|
|
1074
1080
|
/**
|
|
1075
1081
|
* Generate the blocking JS loader for the "before" slot
|
package/dist/index.d.ts
CHANGED
|
@@ -301,6 +301,8 @@ declare const PatchAdamsConfigSchema: z.ZodObject<{
|
|
|
301
301
|
}, z.ZodTypeAny, "passthrough">>>>;
|
|
302
302
|
/** Optional skin name — adds 'pa-skinned' + skin class to <html>, loads skin CSS/JS after core files */
|
|
303
303
|
skin: z.ZodOptional<z.ZodString>;
|
|
304
|
+
/** URL for server-controlled asset cache version (e.g., https://api.example.com/create/skin/version) */
|
|
305
|
+
assetVersionUrl: z.ZodOptional<z.ZodString>;
|
|
304
306
|
}, "strip", z.ZodTypeAny, {
|
|
305
307
|
remoteDomain: string;
|
|
306
308
|
htmlClass: string;
|
|
@@ -353,6 +355,7 @@ declare const PatchAdamsConfigSchema: z.ZodObject<{
|
|
|
353
355
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
354
356
|
}, z.ZodTypeAny, "passthrough">>;
|
|
355
357
|
skin?: string | undefined;
|
|
358
|
+
assetVersionUrl?: string | undefined;
|
|
356
359
|
}, {
|
|
357
360
|
remoteDomain: string;
|
|
358
361
|
htmlClass?: string | undefined;
|
|
@@ -405,6 +408,7 @@ declare const PatchAdamsConfigSchema: z.ZodObject<{
|
|
|
405
408
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
406
409
|
}, z.ZodTypeAny, "passthrough">> | undefined;
|
|
407
410
|
skin?: string | undefined;
|
|
411
|
+
assetVersionUrl?: string | undefined;
|
|
408
412
|
}>;
|
|
409
413
|
type PatchAdamsConfig = z.infer<typeof PatchAdamsConfigSchema>;
|
|
410
414
|
type LrsBridgeConfig = z.infer<typeof LrsBridgeConfigSchema>;
|
|
@@ -1070,6 +1074,8 @@ interface JsBeforeOptions {
|
|
|
1070
1074
|
lrsBridge: LrsBridgeOptions;
|
|
1071
1075
|
/** Optional skin name */
|
|
1072
1076
|
skin?: string;
|
|
1077
|
+
/** URL for server-controlled asset cache version */
|
|
1078
|
+
assetVersionUrl?: string;
|
|
1073
1079
|
}
|
|
1074
1080
|
/**
|
|
1075
1081
|
* Generate the blocking JS loader for the "before" slot
|
package/dist/index.js
CHANGED
|
@@ -110,7 +110,9 @@ var PatchAdamsConfigSchema = z.object({
|
|
|
110
110
|
/** Plugin configurations - each plugin is keyed by its name */
|
|
111
111
|
plugins: PluginsConfigSchema,
|
|
112
112
|
/** Optional skin name — adds 'pa-skinned' + skin class to <html>, loads skin CSS/JS after core files */
|
|
113
|
-
skin: z.string().min(1).optional()
|
|
113
|
+
skin: z.string().min(1).optional(),
|
|
114
|
+
/** URL for server-controlled asset cache version (e.g., https://api.example.com/create/skin/version) */
|
|
115
|
+
assetVersionUrl: z.string().url().optional()
|
|
114
116
|
});
|
|
115
117
|
|
|
116
118
|
// src/config/defaults.ts
|
|
@@ -252,7 +254,8 @@ html.${htmlClass}.${loadingClass} body {
|
|
|
252
254
|
<script data-pa="css-before-loader">
|
|
253
255
|
(function() {
|
|
254
256
|
'use strict';
|
|
255
|
-
var
|
|
257
|
+
var v = window.__pa_v || '';
|
|
258
|
+
var REMOTE_URL = "${remoteUrl}" + (v ? "?v=" + v : "");
|
|
256
259
|
var LOCAL_PATH = "${localPath}";
|
|
257
260
|
|
|
258
261
|
function loadCSSSync(url) {
|
|
@@ -295,7 +298,7 @@ function generateCssAfterLoader(options) {
|
|
|
295
298
|
<script data-pa="css-after-loader">
|
|
296
299
|
(function() {
|
|
297
300
|
'use strict';
|
|
298
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
301
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "");
|
|
299
302
|
var LOCAL_PATH = "${localPath}";
|
|
300
303
|
var TIMEOUT = ${timeout};
|
|
301
304
|
|
|
@@ -1443,8 +1446,8 @@ function generateLrsBridgeCode(options) {
|
|
|
1443
1446
|
', bravaisUserId=' + employeeData.bravaisUserId + ', tenantUrl=' + employeeData.tenantUrl
|
|
1444
1447
|
: 'NO DATA'));
|
|
1445
1448
|
if (employeeData && employeeData.email) {
|
|
1446
|
-
actor.mbox = 'mailto:' + employeeData.email;
|
|
1447
|
-
log('Enhanced actor with email:', employeeData.email);
|
|
1449
|
+
actor.mbox = 'mailto:' + employeeData.email.toLowerCase();
|
|
1450
|
+
log('Enhanced actor with email:', employeeData.email.toLowerCase());
|
|
1448
1451
|
|
|
1449
1452
|
// Also update name if we got a better one
|
|
1450
1453
|
if (employeeData.name && (!actor.name || actor.name === 'Unknown Learner')) {
|
|
@@ -1609,6 +1612,18 @@ function generateLrsBridgeCode(options) {
|
|
|
1609
1612
|
return n === 'anonymous learner' || n === 'unknown learner' || n === 'anonymous' || n === 'unknown';
|
|
1610
1613
|
}
|
|
1611
1614
|
|
|
1615
|
+
/**
|
|
1616
|
+
* Normalize actor IFI fields for consistent matching in Bravais Analytics.
|
|
1617
|
+
* Lowercases mbox email (RFC 5321: local-part is case-insensitive in practice).
|
|
1618
|
+
*/
|
|
1619
|
+
function normalizeActor(actor) {
|
|
1620
|
+
if (!actor) return actor;
|
|
1621
|
+
if (actor.mbox && actor.mbox.indexOf('mailto:') === 0) {
|
|
1622
|
+
actor.mbox = 'mailto:' + actor.mbox.substring(7).toLowerCase();
|
|
1623
|
+
}
|
|
1624
|
+
return actor;
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1612
1627
|
/**
|
|
1613
1628
|
* Persist actor to localStorage for cross-frame sharing.
|
|
1614
1629
|
* Only stores non-anonymous actors.
|
|
@@ -1655,14 +1670,14 @@ function generateLrsBridgeCode(options) {
|
|
|
1655
1670
|
(LRS.actor.account && shared.account && LRS.actor.account.name !== shared.account.name)) {
|
|
1656
1671
|
log('Actor updated from cross-frame storage:', shared.name);
|
|
1657
1672
|
}
|
|
1658
|
-
LRS.actor = shared;
|
|
1659
|
-
return
|
|
1673
|
+
LRS.actor = normalizeActor(shared);
|
|
1674
|
+
return LRS.actor;
|
|
1660
1675
|
}
|
|
1661
1676
|
// Fallback to current actor or re-extract
|
|
1662
1677
|
if (LRS.actor && !isAnonymousActor(LRS.actor)) {
|
|
1663
|
-
return LRS.actor;
|
|
1678
|
+
return normalizeActor(LRS.actor);
|
|
1664
1679
|
}
|
|
1665
|
-
return LRS.actor || extractActor();
|
|
1680
|
+
return normalizeActor(LRS.actor || extractActor());
|
|
1666
1681
|
}
|
|
1667
1682
|
|
|
1668
1683
|
/**
|
|
@@ -1724,9 +1739,9 @@ function generateLrsBridgeCode(options) {
|
|
|
1724
1739
|
function finalizeActor(actor) {
|
|
1725
1740
|
// Try to enhance actor with email if missing
|
|
1726
1741
|
enhanceActorWithEmail(actor, function(enhancedActor) {
|
|
1727
|
-
LRS.actor = enhancedActor;
|
|
1728
|
-
persistActor(
|
|
1729
|
-
callback(
|
|
1742
|
+
LRS.actor = normalizeActor(enhancedActor);
|
|
1743
|
+
persistActor(LRS.actor);
|
|
1744
|
+
callback(LRS.actor);
|
|
1730
1745
|
});
|
|
1731
1746
|
}
|
|
1732
1747
|
|
|
@@ -5181,7 +5196,7 @@ function escapeJs(str) {
|
|
|
5181
5196
|
return str.replace(/\\/g, "\\\\").replace(/'/g, "\\'").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r");
|
|
5182
5197
|
}
|
|
5183
5198
|
function generateJsBeforeLoader(options) {
|
|
5184
|
-
const { remoteUrl, localPath, htmlClass, loadingClass, metadata, lrsBridge, skin } = options;
|
|
5199
|
+
const { remoteUrl, localPath, htmlClass, loadingClass, metadata, lrsBridge, skin, assetVersionUrl } = options;
|
|
5185
5200
|
const lrsBridgeCode = generateLrsBridgeCode(lrsBridge);
|
|
5186
5201
|
const courseLines = [];
|
|
5187
5202
|
if (metadata) {
|
|
@@ -5284,7 +5299,22 @@ window.pa_patcher = window.pa_patcher || {
|
|
|
5284
5299
|
|
|
5285
5300
|
(function() {
|
|
5286
5301
|
'use strict';
|
|
5287
|
-
|
|
5302
|
+
// Fetch server-controlled cache version (sync, once)
|
|
5303
|
+
var ASSET_VERSION_URL = "${assetVersionUrl || ""}";
|
|
5304
|
+
window.__pa_v = '';
|
|
5305
|
+
if (ASSET_VERSION_URL) {
|
|
5306
|
+
try {
|
|
5307
|
+
var xhr = new XMLHttpRequest();
|
|
5308
|
+
xhr.open('GET', ASSET_VERSION_URL, false);
|
|
5309
|
+
xhr.timeout = 2000;
|
|
5310
|
+
xhr.send();
|
|
5311
|
+
if (xhr.status === 200) {
|
|
5312
|
+
window.__pa_v = JSON.parse(xhr.responseText).v || '1';
|
|
5313
|
+
}
|
|
5314
|
+
} catch(e) { window.__pa_v = '1'; }
|
|
5315
|
+
}
|
|
5316
|
+
|
|
5317
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "");
|
|
5288
5318
|
var LOCAL_PATH = "${localPath}";
|
|
5289
5319
|
|
|
5290
5320
|
function loadJSSync(url) {
|
|
@@ -5353,7 +5383,8 @@ function buildJsBeforeOptions(config, metadata) {
|
|
|
5353
5383
|
loadingClass: config.loadingClass,
|
|
5354
5384
|
metadata: metadata ?? null,
|
|
5355
5385
|
lrsBridge,
|
|
5356
|
-
skin: config.skin
|
|
5386
|
+
skin: config.skin,
|
|
5387
|
+
assetVersionUrl: config.assetVersionUrl
|
|
5357
5388
|
};
|
|
5358
5389
|
}
|
|
5359
5390
|
|
|
@@ -5364,7 +5395,7 @@ function generateJsAfterLoader(options) {
|
|
|
5364
5395
|
<script data-pa="js-after-loader">
|
|
5365
5396
|
(function() {
|
|
5366
5397
|
'use strict';
|
|
5367
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
5398
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "");
|
|
5368
5399
|
var LOCAL_PATH = "${localPath}";
|
|
5369
5400
|
var TIMEOUT = ${timeout};
|
|
5370
5401
|
var LOADING_CLASS = "${loadingClass}";
|
|
@@ -5474,7 +5505,7 @@ function generateSkinCssLoader(options) {
|
|
|
5474
5505
|
<script data-pa="skin-css-loader">
|
|
5475
5506
|
(function() {
|
|
5476
5507
|
'use strict';
|
|
5477
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
5508
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "?v=" + Date.now().toString(36));
|
|
5478
5509
|
var LOCAL_PATH = "${localPath}";
|
|
5479
5510
|
var TIMEOUT = ${timeout};
|
|
5480
5511
|
|
|
@@ -5548,9 +5579,8 @@ function generateSkinCssLoader(options) {
|
|
|
5548
5579
|
}
|
|
5549
5580
|
function buildSkinCssOptions(config) {
|
|
5550
5581
|
if (!config.skin) return null;
|
|
5551
|
-
const cacheBuster = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
5552
5582
|
return {
|
|
5553
|
-
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/style.css
|
|
5583
|
+
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/style.css`,
|
|
5554
5584
|
localPath: `skin/${config.skin}/style.css`,
|
|
5555
5585
|
timeout: config.cssAfter.timeout
|
|
5556
5586
|
// reuse cssAfter timeout
|
|
@@ -5564,7 +5594,7 @@ function generateSkinJsLoader(options) {
|
|
|
5564
5594
|
<script data-pa="skin-js-loader">
|
|
5565
5595
|
(function() {
|
|
5566
5596
|
'use strict';
|
|
5567
|
-
var REMOTE_URL = "${remoteUrl}";
|
|
5597
|
+
var REMOTE_URL = "${remoteUrl}" + (window.__pa_v ? "?v=" + window.__pa_v : "?v=" + Date.now().toString(36));
|
|
5568
5598
|
var LOCAL_PATH = "${localPath}";
|
|
5569
5599
|
var TIMEOUT = ${timeout};
|
|
5570
5600
|
|
|
@@ -5650,9 +5680,8 @@ function generateSkinJsLoader(options) {
|
|
|
5650
5680
|
}
|
|
5651
5681
|
function buildSkinJsOptions(config) {
|
|
5652
5682
|
if (!config.skin) return null;
|
|
5653
|
-
const cacheBuster = Date.now().toString(36) + Math.random().toString(36).slice(2, 6);
|
|
5654
5683
|
return {
|
|
5655
|
-
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/script.js
|
|
5684
|
+
remoteUrl: `${config.remoteDomain}/skin/${config.skin}/script.js`,
|
|
5656
5685
|
localPath: `skin/${config.skin}/script.js`,
|
|
5657
5686
|
timeout: config.jsAfter.timeout
|
|
5658
5687
|
// reuse jsAfter timeout
|