Skip to content

Commit

Permalink
Updated getConfig; added setObjectPathValue; updated tasks accord…
Browse files Browse the repository at this point in the history
…ingly.
  • Loading branch information
danielghost committed Jan 28, 2025
1 parent 3fbf6d8 commit b394388
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 103 deletions.
76 changes: 47 additions & 29 deletions migrations/v2.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe , whereContent, whereFromPlugin, whereToPlugin, mutateContent, checkContent, updatePlugin } from 'adapt-migrations';

function getConfig(content) {
return content.find(({ __path__ }) => __path__ === 'src/course/config.json');
return content.find(({ __path__ }) => __path__.endsWith('config.json'))
}

function getSpoorConfig(content) {
Expand All @@ -13,54 +13,72 @@ function hasKey(object, key) {
return Object.hasOwn(object, key);
}

function setObjectPathValue(object, path, value) {
if (!object) return;
const paths = path.split('.');
const key = paths.pop();
const target = paths.reduce((o, p) => {
if (!hasKey(o, p)) o[p] = {};
return o?.[p];
}, object);
if (hasKey(target, key)) return;
target[key] = value;
}

/**
* `_tracking._shouldStoreResponse` default set to false but task updated to use v3.0.0 value
* the following attributes were missing default values - migration not included as not possible to discern author values from defaults:
* _isEnabled
* _tracking: _requireCourseCompleted, _requireAssessmentPassed, _shouldSubmitScore
* _reporting: _onTrackingCriteriaMet, _onAssessmentFailure
* _advancedSettings: _showDebugWindow, _commitOnStatusChange, _timedCommitFrequency, _maxCommitRetries, _commitRetryDelay
*/
describe('adapt-contrib-spoor - v2.0.0 to v2.0.2', async () => {
whereFromPlugin('adapt-contrib-spoor - from v2.0.0 to v2.0.2', { name: 'adapt-contrib-spoor', version: '<2.0.2'});
let spoorConfig;
whereContent('adapt-contrib-spoor - where _spoor._advancedSettings._scormVersion', async content => {
whereContent('adapt-contrib-spoor - where _spoor', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (!hasKey(spoorConfig._advancedSettings, '_scormVersion')) return false;
return spoorConfig;
});
mutateContent('adapt-contrib-spoor - add _spoor._tracking._shouldStoreResponses', async () => {
setObjectPathValue(spoorConfig, '_tracking._shouldStoreResponses', true);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._tracking._shouldStoreResponses added', async () => {
const isValid = hasKey(spoorConfig._tracking, '_shouldStoreResponses');
if (!isValid) throw new Error('_spoor._tracking._shouldStoreResponses not added');
return true;
});
mutateContent('adapt-contrib-spoor - remove _spoor._advancedSettings._scormVersion', async () => {
delete spoorConfig._advancedSettings._scormVersion;
delete spoorConfig?._advancedSettings?._scormVersion;
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._scormVersion removed', async () => {
const isValid = !hasKey(spoorConfig._advancedSettings, '_scormVersion');
if (!isValid) throw new Error('_spoor._advancedSettings._scormVersion not removed');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v2.0.2', {name: 'adapt-contrib-spoor', version: '2.0.2', framework: '>=2'})
updatePlugin('adapt-contrib-spoor - update to v2.0.2', {name: 'adapt-contrib-spoor', version: '2.0.2', framework: '>=2.0.0'})
});

/**
* <2.0.2 - the following attributes were missing default values - migration not included as not possible to discern author values from defaults:
* _isEnabled
* _tracking: _requireCourseCompleted, _requireAssessmentPassed, _shouldSubmitScore, _shouldStoreResponses
* _reporting: _onTrackingCriteriaMet, _onAssessmentFailure
* _advancedSettings: _scormVersion, _showDebugWindow, _commitOnStatusChange, _timedCommitFrequency, _maxCommitRetries, _commitRetryDelay
*/

describe('adapt-contrib-spoor - v2.0.0 to v2.0.5', async () => {
whereFromPlugin('adapt-contrib-spoor - from v2.0.0 to v2.0.5', { name: 'adapt-contrib-spoor', version: '<2.0.5'});
let spoorConfig;
whereContent('adapt-contrib-spoor - where missing _spoor._advancedSettings._suppressErrors', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._advancedSettings, '_suppressErrors')) return false;
return true;
return !hasKey(spoorConfig._advancedSettings, '_suppressErrors');
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._suppressErrors', async () => {
spoorConfig._advancedSettings._suppressErrors = false;
setObjectPathValue(spoorConfig, '_advancedSettings._suppressErrors', false);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._suppressErrors added', async () => {
const isValid = hasKey(spoorConfig._advancedSettings, '_suppressErrors');
if (!isValid) throw new Error('_spoor._advancedSettings._suppressErrors not added');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v2.0.5', {name: 'adapt-contrib-spoor', version: '2.0.5', framework: '>=2'})
updatePlugin('adapt-contrib-spoor - update to v2.0.5', {name: 'adapt-contrib-spoor', version: '2.0.5', framework: '>=2.0.0'})
});

describe('adapt-contrib-spoor - v2.0.0 to v2.0.11', async () => {
Expand All @@ -69,19 +87,18 @@ describe('adapt-contrib-spoor - v2.0.0 to v2.0.11', async () => {
whereContent('adapt-contrib-spoor - where missing _spoor._advancedSettings._commitOnVisibilityChangeHidden', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._advancedSettings, '_commitOnVisibilityChangeHidden')) return false;
return true;
return !hasKey(spoorConfig._advancedSettings, '_commitOnVisibilityChangeHidden');
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._commitOnVisibilityChangeHidden', async () => {
spoorConfig._advancedSettings._commitOnVisibilityChangeHidden = true;
setObjectPathValue(spoorConfig, '_advancedSettings._commitOnVisibilityChangeHidden', true);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._commitOnVisibilityChangeHidden added', async () => {
const isValid = hasKey(spoorConfig._advancedSettings, '_commitOnVisibilityChangeHidden');
if (!isValid) throw new Error('_spoor._advancedSettings._commitOnVisibilityChangeHidden not added');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v2.0.11', {name: 'adapt-contrib-spoor', version: '2.0.11', framework: '>=2'})
updatePlugin('adapt-contrib-spoor - update to v2.0.11', {name: 'adapt-contrib-spoor', version: '2.0.11', framework: '>=2.0.0'})
});

describe('adapt-contrib-spoor - v2.0.0 to v2.0.13', async () => {
Expand All @@ -90,32 +107,33 @@ describe('adapt-contrib-spoor - v2.0.0 to v2.0.13', async () => {
whereContent('adapt-contrib-spoor - where missing _spoor._reporting._resetStatusOnLanguageChange', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._reporting, '_resetStatusOnLanguageChange')) return false;
return true;
return !hasKey(spoorConfig._reporting, '_resetStatusOnLanguageChange');
});
mutateContent('adapt-contrib-spoor - add _spoor._reporting._resetStatusOnLanguageChange', async () => {
spoorConfig._reporting._resetStatusOnLanguageChange = false;
setObjectPathValue(spoorConfig, '_reporting._resetStatusOnLanguageChange', false);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._reporting._resetStatusOnLanguageChange added', async () => {
const isValid = hasKey(spoorConfig._reporting, '_resetStatusOnLanguageChange');
if (!isValid) throw new Error('_spoor._reporting._resetStatusOnLanguageChange not added');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v2.0.13', {name: 'adapt-contrib-spoor', version: '2.0.13', framework: '>=2.0.16'})
updatePlugin('adapt-contrib-spoor - update to v2.0.13', {name: 'adapt-contrib-spoor', version: '2.0.13', framework: '>=2.0.0'})
});

/**
* added to schemas in v2.1.1 but attribute added in v2.0.5
*/
describe('adapt-contrib-spoor - v2.0.0 to v2.1.1', async () => {
whereFromPlugin('adapt-contrib-spoor - from v2.0.0 to v2.1.1', { name: 'adapt-contrib-spoor', version: '<2.1.1'});
let spoorConfig;
whereContent('adapt-contrib-spoor - where missing _spoor._tracking._shouldRecordInteractions', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._tracking, '_shouldRecordInteractions')) return false;
return true;
return !hasKey(spoorConfig._tracking, '_shouldRecordInteractions');
});
mutateContent('adapt-contrib-spoor - add _spoor._tracking._shouldRecordInteractions', async () => {
spoorConfig._tracking._shouldRecordInteractions = true;
setObjectPathValue(spoorConfig, '_tracking._shouldRecordInteractions', true);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._tracking._shouldRecordInteractions added', async () => {
Expand Down
70 changes: 41 additions & 29 deletions migrations/v3.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { describe , whereContent, whereFromPlugin, whereToPlugin, mutateContent, checkContent, updatePlugin } from 'adapt-migrations';

function getConfig(content) {
return content.find(({ __path__ }) => __path__ === 'src/course/config.json');
return content.find(({ __path__ }) => __path__.endsWith('config.json'))
}

function getSpoorConfig(content) {
Expand All @@ -13,24 +13,41 @@ function hasKey(object, key) {
return Object.hasOwn(object, key);
}

function setObjectPathValue(object, path, value) {
if (!object) return;
const paths = path.split('.');
const key = paths.pop();
const target = paths.reduce((o, p) => {
if (!hasKey(o, p)) o[p] = {};
return o?.[p];
}, object);
if (hasKey(target, key)) return;
target[key] = value;
}

/**
* v3.0.0 - the following attributes default values changed - migration not included as not possible to discern author values from defaults:
* _tracking: _shouldStoreResponses
* `_tracking._shouldStoreResponse` default updated to `true` - also applied in v2.0.2 task when added with a different default value
*/

describe('adapt-contrib-spoor - v2.0.0 to v3.0.0', async () => {
whereFromPlugin('adapt-contrib-spoor - from v2.0.0 to v3.0.0', { name: 'adapt-contrib-spoor', version: '<3.0.0'});
let config, spoorConfig;
whereContent('adapt-contrib-spoor - where using legacy tracking config', async content => {
whereContent('adapt-contrib-spoor - where _spoor', async content => {
config = getConfig(content);
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (!hasKey(spoorConfig._tracking, '_requireCourseCompleted') && !hasKey(spoorConfig._tracking, '_requireAssessmentPassed')) return false;
return spoorConfig;
});
mutateContent('adapt-contrib-spoor - add _spoor._tracking._shouldStoreResponses', async () => {
setObjectPathValue(spoorConfig, '_tracking._shouldStoreResponses', true);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._tracking._shouldStoreResponses added', async () => {
const isValid = hasKey(spoorConfig._tracking, '_shouldStoreResponses');
if (!isValid) throw new Error('_spoor._tracking._shouldStoreResponses not added');
return true;
});
mutateContent('adapt-contrib-spoor - replace _spoor._tracking._requireCourseCompleted with _completionCriteria._requireContentCompleted', async () => {
if (!hasKey(config._completionCriteria, '_requireContentCompleted')) config._completionCriteria._requireContentCompleted = spoorConfig?._tracking?._requireCourseCompleted ?? true;
delete spoorConfig._tracking._requireCourseCompleted;
if (!hasKey(config._completionCriteria, '_requireContentCompleted')) setObjectPathValue(config, '_completionCriteria._requireContentCompleted', spoorConfig?._tracking?._requireCourseCompleted ?? true);
delete spoorConfig?._tracking?._requireCourseCompleted;
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._tracking._requireCourseCompleted replaced', async () => {
Expand All @@ -39,16 +56,16 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.0.0', async () => {
return true;
});
mutateContent('adapt-contrib-spoor - replace _spoor._tracking._requireAssessmentPassed with _completionCriteria._requireAssessmentCompleted', async () => {
if (!hasKey(config._completionCriteria, '_requireAssessmentCompleted')) config._completionCriteria._requireAssessmentCompleted = spoorConfig?._tracking?._requireAssessmentPassed ?? false;
delete spoorConfig._tracking._requireAssessmentPassed;
if (!hasKey(config._completionCriteria, '_requireAssessmentCompleted')) setObjectPathValue(config, '_completionCriteria._requireAssessmentCompleted', spoorConfig?._tracking?._requireAssessmentPassed ?? false);
delete spoorConfig?._tracking?._requireAssessmentPassed;
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._tracking._requireAssessmentPassed replaced', async () => {
const isValid = !hasKey(spoorConfig._tracking, '_requireAssessmentPassed') && hasKey(config._completionCriteria, '_requireAssessmentCompleted');
if (!isValid) throw new Error('_spoor._tracking._requireAssessmentPassed not replaced');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v3', {name: 'adapt-contrib-spoor', version: '3.0.0', framework: '>=3'})
updatePlugin('adapt-contrib-spoor - update to v3', {name: 'adapt-contrib-spoor', version: '3.0.0', framework: '>=3.0.0'})
});

describe('adapt-contrib-spoor - v2.0.0 to v3.2.0', async () => {
Expand All @@ -57,19 +74,18 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.2.0', async () => {
whereContent('adapt-contrib-spoor - where missing _spoor._advancedSettings._manifestIdentifier', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._advancedSettings, '_manifestIdentifier')) return false;
return true;
return !hasKey(spoorConfig._advancedSettings, '_manifestIdentifier');
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._manifestIdentifier', async () => {
spoorConfig._advancedSettings._manifestIdentifier = 'adapt_manifest';
setObjectPathValue(spoorConfig, '_advancedSettings._manifestIdentifier', 'adapt_manifest');
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._manifestIdentifier added', async () => {
const isValid = hasKey(spoorConfig._advancedSettings, '_manifestIdentifier');
if (!isValid) throw new Error('_spoor._advancedSettings._manifestIdentifier not added');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v3.2.0', {name: 'adapt-contrib-spoor', version: '3.2.0', framework: '>=3.5'})
updatePlugin('adapt-contrib-spoor - update to v3.2.0', {name: 'adapt-contrib-spoor', version: '3.2.0', framework: '>=3.5.0'})
});

describe('adapt-contrib-spoor - v2.0.0 to v3.3.0', async () => {
Expand All @@ -78,11 +94,10 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.3.0', async () => {
whereContent('adapt-contrib-spoor - where missing exit status', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._advancedSettings, '_exitStateIfIncomplete') && hasKey(spoorConfig._advancedSettings, '_exitStateIfComplete')) return false;
return true;
return !hasKey(spoorConfig._advancedSettings, '_exitStateIfIncomplete') || !hasKey(spoorConfig._advancedSettings, '_exitStateIfComplete');
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._exitStateIfIncomplete', async () => {
if (!hasKey(spoorConfig._advancedSettings, '_exitStateIfIncomplete')) spoorConfig._advancedSettings._exitStateIfIncomplete = 'auto';
setObjectPathValue(spoorConfig, '_advancedSettings._exitStateIfIncomplete', 'auto');
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._exitStateIfIncomplete added', async () => {
Expand All @@ -91,15 +106,15 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.3.0', async () => {
return true;
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._exitStateIfComplete', async () => {
if (!hasKey(spoorConfig._advancedSettings, '_exitStateIfComplete')) spoorConfig._advancedSettings._exitStateIfComplete = 'auto';
setObjectPathValue(spoorConfig, '_advancedSettings._exitStateIfComplete', 'auto');
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._exitStateIfComplete added', async () => {
const isValid = hasKey(spoorConfig._advancedSettings, '_exitStateIfComplete');
if (!isValid) throw new Error('_spoor._advancedSettings._exitStateIfComplete not added');
return true;
});
updatePlugin('adapt-contrib-spoor - update to v3.3.0', {name: 'adapt-contrib-spoor', version: '3.3.0', framework: '>=3.5'})
updatePlugin('adapt-contrib-spoor - update to v3.3.0', {name: 'adapt-contrib-spoor', version: '3.3.0', framework: '>=3.5.0'})
});

describe('adapt-contrib-spoor - v2.0.0 to v3.4.0', async () => {
Expand All @@ -108,11 +123,10 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.4.0', async () => {
whereContent('adapt-contrib-spoor - where missing _spoor._advancedSettings._shouldStoreAttempts', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._advancedSettings, '_shouldStoreAttempts')) return false;
return true;
return !hasKey(spoorConfig._advancedSettings, '_shouldStoreAttempts');
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._shouldStoreAttempts', async () => {
spoorConfig._advancedSettings._shouldStoreAttempts = false;
setObjectPathValue(spoorConfig, '_advancedSettings._shouldStoreAttempts', false);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._shouldStoreAttempts added', async () => {
Expand All @@ -129,11 +143,10 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.5.0', async () => {
whereContent('adapt-contrib-spoor - where missing _spoor._advancedSettings._commitOnAnyChange', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (hasKey(spoorConfig._advancedSettings, '_commitOnAnyChange')) return false;
return true;
return !hasKey(spoorConfig._advancedSettings, '_commitOnAnyChange');
});
mutateContent('adapt-contrib-spoor - add _spoor._advancedSettings._commitOnAnyChange', async () => {
spoorConfig._advancedSettings._commitOnAnyChange = false;
setObjectPathValue(spoorConfig, '_advancedSettings._commitOnAnyChange', false);
return true;
});
checkContent('adapt-contrib-spoor - check _spoor._advancedSettings._commitOnAnyChange added', async () => {
Expand All @@ -150,8 +163,7 @@ describe('adapt-contrib-spoor - v2.0.0 to v3.6.0', async () => {
whereContent('adapt-contrib-spoor - where missing _spoor._messages', async content => {
spoorConfig = getSpoorConfig(content);
if (!spoorConfig) return false;
if (spoorConfig._messages) return false;
return true;
return !spoorConfig._messages;
});
mutateContent('adapt-contrib-spoor - add _spoor._messages', async () => {
spoorConfig._messages = {};
Expand Down
Loading

0 comments on commit b394388

Please sign in to comment.