@openstax/ts-utils 1.20.0 → 1.20.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.
@@ -0,0 +1,5 @@
1
+ import { User } from '../authProvider';
2
+ import { EagerXapiStatement, UXapiStatement, XapiStatement } from '.';
3
+ export declare const addStatementDefaultFields: (statement: (Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'> & {
4
+ id?: string;
5
+ }) | UXapiStatement, user: User) => EagerXapiStatement;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.addStatementDefaultFields = void 0;
7
+ const formatISO_1 = __importDefault(require("date-fns/formatISO"));
8
+ const uuid_1 = require("uuid");
9
+ const addStatementDefaultFields = (statement, user) => ({
10
+ id: (0, uuid_1.v4)(),
11
+ actor: {
12
+ account: {
13
+ homePage: 'https://openstax.org',
14
+ name: user.uuid,
15
+ },
16
+ objectType: 'Agent',
17
+ },
18
+ timestamp: (0, formatISO_1.default)(new Date()),
19
+ ...statement,
20
+ });
21
+ exports.addStatementDefaultFields = addStatementDefaultFields;
@@ -1,23 +1,23 @@
1
- import { LrsGateway, XapiStatement } from '.';
1
+ import { LrsGateway, UXapiStatement } from '.';
2
2
  export declare type ActivityState = {
3
3
  attempts: number;
4
4
  completedAttempts: number;
5
- currentAttempt?: XapiStatement;
6
- currentAttemptCompleted?: XapiStatement;
7
- currentAttemptStatements: XapiStatement[];
8
- mostRecentAttemptWithCompleted?: XapiStatement;
9
- mostRecentAttemptWithCompletedCompleted?: XapiStatement;
5
+ currentAttempt?: UXapiStatement;
6
+ currentAttemptCompleted?: UXapiStatement;
7
+ currentAttemptStatements: UXapiStatement[];
8
+ mostRecentAttemptWithCompleted?: UXapiStatement;
9
+ mostRecentAttemptWithCompletedCompleted?: UXapiStatement;
10
10
  };
11
- export declare const matchAttempt: (statement: XapiStatement) => boolean;
12
- export declare const matchAttemptCompleted: (attempt: XapiStatement) => (statement: XapiStatement) => boolean;
13
- export declare const resolveAttempts: (statements: XapiStatement[], options?: {
11
+ export declare const matchAttempt: (statement: UXapiStatement) => boolean;
12
+ export declare const matchAttemptCompleted: (attempt: UXapiStatement) => (statement: UXapiStatement) => boolean;
13
+ export declare const resolveAttempts: (statements: UXapiStatement[], options?: {
14
14
  activityIRI?: string | undefined;
15
15
  parentActivityAttempt?: string | undefined;
16
- } | undefined) => XapiStatement[];
17
- export declare const resolveCompletedForAttempt: (statements: XapiStatement[], attempt: XapiStatement, activityIRI?: string | undefined) => XapiStatement | undefined;
18
- export declare const oldestStatement: (statements: XapiStatement[]) => XapiStatement | undefined;
19
- export declare const mostRecentStatement: (statements: XapiStatement[]) => XapiStatement | undefined;
20
- export declare const resolveAttemptInfo: (statements: XapiStatement[], options?: {
16
+ } | undefined) => UXapiStatement[];
17
+ export declare const resolveCompletedForAttempt: (statements: UXapiStatement[], attempt: UXapiStatement, activityIRI?: string | undefined) => UXapiStatement | undefined;
18
+ export declare const oldestStatement: (statements: UXapiStatement[]) => UXapiStatement | undefined;
19
+ export declare const mostRecentStatement: (statements: UXapiStatement[]) => UXapiStatement | undefined;
20
+ export declare const resolveAttemptInfo: (statements: UXapiStatement[], options?: {
21
21
  activityIRI?: string | undefined;
22
22
  currentAttempt?: string | undefined;
23
23
  parentActivityAttempt?: string | undefined;
@@ -28,20 +28,20 @@ export declare const loadStatementsForActivityAndFirstChildren: (gateway: LrsGat
28
28
  attempt?: string | undefined;
29
29
  ensureSync?: boolean | undefined;
30
30
  user?: string | undefined;
31
- } | undefined) => Promise<XapiStatement[]>;
31
+ } | undefined) => Promise<import(".").XapiStatement[]>;
32
32
  export declare const loadActivityAttemptInfo: (gateway: LrsGateway, activityIRI: string, options?: {
33
33
  currentAttempt?: string | undefined;
34
34
  parentActivityAttempt?: string | undefined;
35
35
  ensureSync?: boolean | undefined;
36
36
  } | undefined) => Promise<ActivityState>;
37
- export declare const createStatement: (verb: XapiStatement['verb'], activity: {
37
+ export declare const createStatement: (verb: UXapiStatement['verb'], activity: {
38
38
  iri: string;
39
39
  type: string;
40
40
  name: string;
41
41
  extensions?: {
42
42
  [key: string]: string;
43
43
  } | undefined;
44
- }, attempt: string, parentActivityIRI?: string | undefined) => Pick<XapiStatement, 'object' | 'verb' | 'context'>;
44
+ }, attempt: string, parentActivityIRI?: string | undefined) => Pick<UXapiStatement, 'object' | 'verb' | 'context'>;
45
45
  export declare const createAttemptStatement: (activity: {
46
46
  iri: string;
47
47
  type: string;
@@ -52,7 +52,7 @@ export declare const createAttemptStatement: (activity: {
52
52
  }, parentActivity?: {
53
53
  iri?: string | undefined;
54
54
  attempt?: string | undefined;
55
- } | undefined) => Pick<XapiStatement, 'object' | 'verb' | 'context'>;
55
+ } | undefined) => Pick<UXapiStatement, 'object' | 'verb' | 'context'>;
56
56
  export declare const putAttemptStatement: (gateway: LrsGateway, activity: {
57
57
  iri: string;
58
58
  type: string;
@@ -64,7 +64,7 @@ export declare const putAttemptStatement: (gateway: LrsGateway, activity: {
64
64
  iri?: string | undefined;
65
65
  attempt?: string | undefined;
66
66
  } | undefined) => Promise<import(".").EagerXapiStatement>;
67
- export declare const createAttemptActivityStatement: (attemptStatement: XapiStatement, verb: XapiStatement['verb'], result?: XapiStatement['result']) => Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'>;
68
- export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: XapiStatement, verb: XapiStatement['verb'], result?: XapiStatement['result']) => Promise<import(".").EagerXapiStatement>;
69
- export declare const createCompletedStatement: (attemptStatement: XapiStatement, result?: XapiStatement['result']) => Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'>;
70
- export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: XapiStatement, result: XapiStatement['result']) => Promise<import(".").EagerXapiStatement>;
67
+ export declare const createAttemptActivityStatement: (attemptStatement: UXapiStatement, verb: UXapiStatement['verb'], result?: UXapiStatement['result']) => Pick<UXapiStatement, 'object' | 'verb' | 'context' | 'result'>;
68
+ export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, verb: UXapiStatement['verb'], result?: UXapiStatement['result']) => Promise<import(".").EagerXapiStatement>;
69
+ export declare const createCompletedStatement: (attemptStatement: UXapiStatement, result?: UXapiStatement['result']) => Pick<UXapiStatement, 'object' | 'verb' | 'context' | 'result'>;
70
+ export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement['result']) => Promise<import(".").EagerXapiStatement>;
@@ -42,9 +42,9 @@ exports.resolveAttempts = resolveAttempts;
42
42
  const resolveCompletedForAttempt = (statements, attempt, activityIRI) => statements.find(statement => (0, exports.matchAttemptCompleted)(attempt)(statement)
43
43
  && (!activityIRI || statement.object.id === activityIRI));
44
44
  exports.resolveCompletedForAttempt = resolveCompletedForAttempt;
45
- const oldestStatement = (statements) => statements.reduce((result, statement) => result && (0, isBefore_1.default)((0, parseISO_1.default)(result.stored || result.timestamp), (0, parseISO_1.default)(statement.timestamp)) ? result : statement, statements[0]);
45
+ const oldestStatement = (statements) => statements.reduce((result, statement) => result && (0, isBefore_1.default)((0, parseISO_1.default)('stored' in result && result.stored ? result.stored : result.timestamp), (0, parseISO_1.default)(statement.timestamp)) ? result : statement, statements[0]);
46
46
  exports.oldestStatement = oldestStatement;
47
- const mostRecentStatement = (statements) => statements.reduce((result, statement) => result && (0, isAfter_1.default)((0, parseISO_1.default)(result.stored || result.timestamp), (0, parseISO_1.default)(statement.timestamp)) ? result : statement, statements[0]);
47
+ const mostRecentStatement = (statements) => statements.reduce((result, statement) => result && (0, isAfter_1.default)((0, parseISO_1.default)('stored' in result && result.stored ? result.stored : result.timestamp), (0, parseISO_1.default)(statement.timestamp)) ? result : statement, statements[0]);
48
48
  exports.mostRecentStatement = mostRecentStatement;
49
49
  const resolveAttemptInfo = (statements, options) => {
50
50
  // TODO optimize. i'm 100% that this could all be done in one iteration but i'm not messing around with that for now.
@@ -74,15 +74,16 @@ export interface XapiStatement {
74
74
  }
75
75
  export declare type SavedXapiStatement = WithRequired<XapiStatement, 'stored'>;
76
76
  export declare type EagerXapiStatement = Omit<XapiStatement, 'stored'>;
77
+ export declare type UXapiStatement = XapiStatement | EagerXapiStatement | SavedXapiStatement;
77
78
  export declare type LrsGateway = ReturnType<ReturnType<ReturnType<typeof lrsGateway>>>;
78
79
  export declare type LrsProvider = ReturnType<ReturnType<typeof lrsGateway>>;
79
80
  export declare const lrsGateway: <C extends string = "lrs">(initializer: Initializer<C>) => (configProvider: { [key in C]: {
80
81
  lrsHost: import("../../config").ConfigValueProvider<string>;
81
82
  lrsAuthorization: import("../../config").ConfigValueProvider<string>;
82
83
  }; }) => (authProvider: AuthProvider) => {
83
- putXapiStatements: (statements: Array<Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'> & {
84
+ putXapiStatements: (statements: Array<(Pick<XapiStatement, 'object' | 'verb' | 'context' | 'result'> & {
84
85
  id?: string;
85
- }>) => Promise<EagerXapiStatement[]>;
86
+ }) | UXapiStatement>) => Promise<EagerXapiStatement[]>;
86
87
  getXapiStatements: (params: {
87
88
  verb?: string | undefined;
88
89
  activity?: string | undefined;
@@ -22,12 +22,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
25
  Object.defineProperty(exports, "__esModule", { value: true });
29
26
  exports.lrsGateway = void 0;
30
- const formatISO_1 = __importDefault(require("date-fns/formatISO"));
31
27
  const queryString = __importStar(require("query-string"));
32
28
  const __1 = require("../..");
33
29
  const assertions_1 = require("../../assertions");
@@ -36,6 +32,7 @@ const errors_1 = require("../../errors");
36
32
  const fetchStatusRetry_1 = require("../../fetch/fetchStatusRetry");
37
33
  const guards_1 = require("../../guards");
38
34
  const routing_1 = require("../../routing");
35
+ const addStatementDefaultFields_1 = require("./addStatementDefaultFields");
39
36
  const lrsGateway = (initializer) => (configProvider) => {
40
37
  const config = configProvider[(0, guards_1.ifDefined)(initializer.configSpace, 'lrs')];
41
38
  const lrsHost = (0, __1.once)(() => (0, config_1.resolveConfigValue)(config.lrsHost));
@@ -45,17 +42,7 @@ const lrsGateway = (initializer) => (configProvider) => {
45
42
  // Note: This method actually uses POST
46
43
  const putXapiStatements = async (statements) => {
47
44
  const user = (0, assertions_1.assertDefined)(await authProvider.getUser(), new errors_1.UnauthorizedError);
48
- const statementsWithDefaults = statements.map(statement => ({
49
- ...statement,
50
- actor: {
51
- account: {
52
- homePage: 'https://openstax.org',
53
- name: user.uuid,
54
- },
55
- objectType: 'Agent',
56
- },
57
- timestamp: (0, formatISO_1.default)(new Date())
58
- }));
45
+ const statementsWithDefaults = statements.map(statement => (0, addStatementDefaultFields_1.addStatementDefaultFields)(statement, user));
59
46
  const response = await fetcher((await lrsHost()).replace(/\/+$/, '') + '/data/xAPI/statements', {
60
47
  body: JSON.stringify(statementsWithDefaults),
61
48
  headers: {
@@ -70,8 +57,8 @@ const lrsGateway = (initializer) => (configProvider) => {
70
57
 
71
58
  ${await response.text()}`);
72
59
  }
73
- const ids = await response.json();
74
- return ids.map((id, index) => ({ id, ...statementsWithDefaults[index] }));
60
+ await response.json();
61
+ return statementsWithDefaults;
75
62
  };
76
63
  // Note: This code does not currently handle a single statement response,
77
64
  // which can return 404 if the statement is not found