@openstax/ts-utils 1.44.1 → 1.44.3

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.
Files changed (230) hide show
  1. package/dist/cjs/aws/ssmService.js +2 -2
  2. package/dist/cjs/config/awsParameterConfig.d.ts +1 -1
  3. package/dist/cjs/config/awsParameterConfig.js +7 -7
  4. package/dist/cjs/config/envConfig.d.ts +1 -1
  5. package/dist/cjs/config/envConfig.js +2 -2
  6. package/dist/cjs/config/index.d.ts +5 -5
  7. package/dist/cjs/config/index.js +5 -5
  8. package/dist/cjs/config/lambdaParameterConfig.d.ts +1 -1
  9. package/dist/cjs/config/lambdaParameterConfig.js +10 -10
  10. package/dist/cjs/config/replaceConfig.d.ts +1 -1
  11. package/dist/cjs/config/replaceConfig.js +3 -3
  12. package/dist/cjs/config/resolveConfigValue.d.ts +1 -1
  13. package/dist/cjs/errors/index.d.ts +1 -1
  14. package/dist/cjs/fetch/fetchStatusRetry.d.ts +2 -2
  15. package/dist/cjs/fetch/fetchStatusRetry.js +2 -2
  16. package/dist/cjs/fetch/index.d.ts +1 -1
  17. package/dist/cjs/index.d.ts +5 -5
  18. package/dist/cjs/index.js +5 -5
  19. package/dist/cjs/middleware/apiErrorHandler.d.ts +3 -3
  20. package/dist/cjs/middleware/apiErrorHandler.js +12 -12
  21. package/dist/cjs/middleware/apiSlowResponseMiddleware.d.ts +3 -3
  22. package/dist/cjs/middleware/apiSlowResponseMiddleware.js +9 -9
  23. package/dist/cjs/middleware/index.d.ts +1 -1
  24. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.d.ts +2 -2
  25. package/dist/cjs/middleware/lambdaCorsResponseMiddleware.js +5 -5
  26. package/dist/cjs/middleware/throwNotFoundMiddleware.js +2 -2
  27. package/dist/cjs/misc/helpers.d.ts +1 -1
  28. package/dist/cjs/misc/jwks.js +3 -3
  29. package/dist/cjs/misc/merge.d.ts +1 -1
  30. package/dist/cjs/misc/merge.js +2 -2
  31. package/dist/cjs/pagination/index.d.ts +1 -1
  32. package/dist/cjs/pagination/index.js +10 -10
  33. package/dist/cjs/routing/helpers.d.ts +1 -1
  34. package/dist/cjs/routing/helpers.js +7 -7
  35. package/dist/cjs/routing/index.d.ts +2 -2
  36. package/dist/cjs/routing/index.js +6 -6
  37. package/dist/cjs/routing/lambdaBatchRequestHandler.d.ts +2 -2
  38. package/dist/cjs/routing/lambdaBatchRequestHandler.js +6 -6
  39. package/dist/cjs/routing/validators/zod.js +2 -2
  40. package/dist/cjs/services/accountsGateway/index.d.ts +5 -5
  41. package/dist/cjs/services/accountsGateway/index.js +18 -18
  42. package/dist/cjs/services/apiGateway/index.d.ts +5 -5
  43. package/dist/cjs/services/apiGateway/index.js +12 -12
  44. package/dist/cjs/services/authProvider/browser.d.ts +4 -4
  45. package/dist/cjs/services/authProvider/browser.js +14 -14
  46. package/dist/cjs/services/authProvider/decryption.d.ts +3 -3
  47. package/dist/cjs/services/authProvider/decryption.js +17 -17
  48. package/dist/cjs/services/authProvider/index.d.ts +3 -3
  49. package/dist/cjs/services/authProvider/index.js +7 -7
  50. package/dist/cjs/services/authProvider/launchToken.d.ts +4 -4
  51. package/dist/cjs/services/authProvider/launchToken.js +6 -6
  52. package/dist/cjs/services/authProvider/subrequest.d.ts +3 -3
  53. package/dist/cjs/services/authProvider/subrequest.js +12 -12
  54. package/dist/cjs/services/authProvider/utils/decryptAndVerify.d.ts +1 -1
  55. package/dist/cjs/services/authProvider/utils/decryptAndVerify.js +3 -3
  56. package/dist/cjs/services/authProvider/utils/embeddedAuthProvider.d.ts +2 -2
  57. package/dist/cjs/services/authProvider/utils/userRoleValidator.d.ts +3 -3
  58. package/dist/cjs/services/authProvider/utils/userRoleValidator.js +7 -7
  59. package/dist/cjs/services/authProvider/utils/userSubrequest.d.ts +2 -2
  60. package/dist/cjs/services/documentStore/dynamoEncoding.d.ts +1 -1
  61. package/dist/cjs/services/documentStore/dynamoEncoding.js +2 -2
  62. package/dist/cjs/services/documentStore/unversioned/dynamodb.d.ts +2 -2
  63. package/dist/cjs/services/documentStore/unversioned/dynamodb.js +30 -30
  64. package/dist/cjs/services/documentStore/unversioned/file-system.d.ts +2 -2
  65. package/dist/cjs/services/documentStore/unversioned/file-system.js +13 -13
  66. package/dist/cjs/services/documentStore/unversioned/index.d.ts +1 -1
  67. package/dist/cjs/services/documentStore/versioned/dynamodb.d.ts +3 -3
  68. package/dist/cjs/services/documentStore/versioned/dynamodb.js +17 -17
  69. package/dist/cjs/services/documentStore/versioned/file-system.d.ts +3 -3
  70. package/dist/cjs/services/documentStore/versioned/file-system.js +2 -2
  71. package/dist/cjs/services/documentStore/versioned/index.d.ts +2 -2
  72. package/dist/cjs/services/exercisesGateway/index.d.ts +2 -2
  73. package/dist/cjs/services/exercisesGateway/index.js +14 -14
  74. package/dist/cjs/services/fileServer/index.js +3 -3
  75. package/dist/cjs/services/fileServer/localFileServer.d.ts +2 -2
  76. package/dist/cjs/services/fileServer/localFileServer.js +89 -28
  77. package/dist/cjs/services/fileServer/s3FileServer.d.ts +2 -2
  78. package/dist/cjs/services/fileServer/s3FileServer.js +14 -14
  79. package/dist/cjs/services/httpMessageVerifier/index.d.ts +1 -1
  80. package/dist/cjs/services/httpMessageVerifier/index.js +20 -20
  81. package/dist/cjs/services/launchParams/index.d.ts +2 -2
  82. package/dist/cjs/services/launchParams/index.js +4 -4
  83. package/dist/cjs/services/launchParams/signer.d.ts +2 -2
  84. package/dist/cjs/services/launchParams/signer.js +9 -9
  85. package/dist/cjs/services/launchParams/verifier.d.ts +1 -1
  86. package/dist/cjs/services/launchParams/verifier.js +11 -11
  87. package/dist/cjs/services/logger/console.d.ts +1 -1
  88. package/dist/cjs/services/logger/console.js +2 -2
  89. package/dist/cjs/services/logger/index.d.ts +1 -1
  90. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.d.ts +1 -1
  91. package/dist/cjs/services/lrsGateway/addStatementDefaultFields.js +2 -7
  92. package/dist/cjs/services/lrsGateway/attempt-utils.d.ts +11 -10
  93. package/dist/cjs/services/lrsGateway/attempt-utils.js +23 -8
  94. package/dist/cjs/services/lrsGateway/batching.d.ts +2 -2
  95. package/dist/cjs/services/lrsGateway/batching.js +2 -2
  96. package/dist/cjs/services/lrsGateway/file-system.d.ts +3 -3
  97. package/dist/cjs/services/lrsGateway/file-system.js +12 -17
  98. package/dist/cjs/services/lrsGateway/index.d.ts +7 -12
  99. package/dist/cjs/services/lrsGateway/index.js +26 -47
  100. package/dist/cjs/services/lrsGateway/xapiUtils.d.ts +4 -4
  101. package/dist/cjs/services/lrsGateway/xapiUtils.js +7 -7
  102. package/dist/cjs/services/postgresConnection/index.d.ts +2 -2
  103. package/dist/cjs/services/postgresConnection/index.js +14 -14
  104. package/dist/cjs/services/queueProvider/local.d.ts +2 -2
  105. package/dist/cjs/services/queueProvider/local.js +6 -7
  106. package/dist/cjs/services/queueProvider/sqs.d.ts +2 -2
  107. package/dist/cjs/services/queueProvider/sqs.js +7 -7
  108. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.d.ts +1 -1
  109. package/dist/cjs/services/searchProvider/memorySearchTheBadWay.js +9 -9
  110. package/dist/cjs/services/searchProvider/openSearch.d.ts +2 -2
  111. package/dist/cjs/services/searchProvider/openSearch.js +9 -9
  112. package/dist/cjs/services/searchProvider/streamIndexer.d.ts +2 -2
  113. package/dist/cjs/services/searchProvider/streamIndexer.js +3 -3
  114. package/dist/cjs/tsconfig.without-specs.cjs.tsbuildinfo +1 -1
  115. package/dist/esm/aws/ssmService.js +1 -1
  116. package/dist/esm/config/awsParameterConfig.d.ts +1 -1
  117. package/dist/esm/config/awsParameterConfig.js +3 -3
  118. package/dist/esm/config/envConfig.d.ts +1 -1
  119. package/dist/esm/config/envConfig.js +1 -1
  120. package/dist/esm/config/index.d.ts +5 -5
  121. package/dist/esm/config/index.js +5 -5
  122. package/dist/esm/config/lambdaParameterConfig.d.ts +1 -1
  123. package/dist/esm/config/lambdaParameterConfig.js +4 -4
  124. package/dist/esm/config/replaceConfig.d.ts +1 -1
  125. package/dist/esm/config/replaceConfig.js +1 -1
  126. package/dist/esm/config/resolveConfigValue.d.ts +1 -1
  127. package/dist/esm/errors/index.d.ts +1 -1
  128. package/dist/esm/fetch/fetchStatusRetry.d.ts +2 -2
  129. package/dist/esm/fetch/fetchStatusRetry.js +1 -1
  130. package/dist/esm/fetch/index.d.ts +1 -1
  131. package/dist/esm/index.d.ts +5 -5
  132. package/dist/esm/index.js +5 -5
  133. package/dist/esm/middleware/apiErrorHandler.d.ts +3 -3
  134. package/dist/esm/middleware/apiErrorHandler.js +3 -3
  135. package/dist/esm/middleware/apiSlowResponseMiddleware.d.ts +3 -3
  136. package/dist/esm/middleware/apiSlowResponseMiddleware.js +4 -4
  137. package/dist/esm/middleware/index.d.ts +1 -1
  138. package/dist/esm/middleware/lambdaCorsResponseMiddleware.d.ts +2 -2
  139. package/dist/esm/middleware/lambdaCorsResponseMiddleware.js +3 -3
  140. package/dist/esm/middleware/throwNotFoundMiddleware.js +1 -1
  141. package/dist/esm/misc/helpers.d.ts +1 -1
  142. package/dist/esm/misc/jwks.js +1 -1
  143. package/dist/esm/misc/merge.d.ts +1 -1
  144. package/dist/esm/misc/merge.js +1 -1
  145. package/dist/esm/pagination/index.d.ts +1 -1
  146. package/dist/esm/pagination/index.js +3 -3
  147. package/dist/esm/routing/helpers.d.ts +1 -1
  148. package/dist/esm/routing/helpers.js +3 -3
  149. package/dist/esm/routing/index.d.ts +2 -2
  150. package/dist/esm/routing/index.js +3 -3
  151. package/dist/esm/routing/lambdaBatchRequestHandler.d.ts +2 -2
  152. package/dist/esm/routing/lambdaBatchRequestHandler.js +3 -3
  153. package/dist/esm/routing/validators/zod.js +1 -1
  154. package/dist/esm/services/accountsGateway/index.d.ts +5 -5
  155. package/dist/esm/services/accountsGateway/index.js +5 -5
  156. package/dist/esm/services/apiGateway/index.d.ts +5 -5
  157. package/dist/esm/services/apiGateway/index.js +5 -5
  158. package/dist/esm/services/authProvider/browser.d.ts +4 -4
  159. package/dist/esm/services/authProvider/browser.js +6 -6
  160. package/dist/esm/services/authProvider/decryption.d.ts +3 -3
  161. package/dist/esm/services/authProvider/decryption.js +7 -7
  162. package/dist/esm/services/authProvider/index.d.ts +3 -3
  163. package/dist/esm/services/authProvider/index.js +2 -2
  164. package/dist/esm/services/authProvider/launchToken.d.ts +4 -4
  165. package/dist/esm/services/authProvider/launchToken.js +2 -2
  166. package/dist/esm/services/authProvider/subrequest.d.ts +3 -3
  167. package/dist/esm/services/authProvider/subrequest.js +5 -5
  168. package/dist/esm/services/authProvider/utils/decryptAndVerify.d.ts +1 -1
  169. package/dist/esm/services/authProvider/utils/decryptAndVerify.js +1 -1
  170. package/dist/esm/services/authProvider/utils/embeddedAuthProvider.d.ts +2 -2
  171. package/dist/esm/services/authProvider/utils/userRoleValidator.d.ts +3 -3
  172. package/dist/esm/services/authProvider/utils/userRoleValidator.js +4 -4
  173. package/dist/esm/services/authProvider/utils/userSubrequest.d.ts +2 -2
  174. package/dist/esm/services/documentStore/dynamoEncoding.d.ts +1 -1
  175. package/dist/esm/services/documentStore/dynamoEncoding.js +1 -1
  176. package/dist/esm/services/documentStore/unversioned/dynamodb.d.ts +2 -2
  177. package/dist/esm/services/documentStore/unversioned/dynamodb.js +5 -5
  178. package/dist/esm/services/documentStore/unversioned/file-system.d.ts +2 -2
  179. package/dist/esm/services/documentStore/unversioned/file-system.js +4 -4
  180. package/dist/esm/services/documentStore/unversioned/index.d.ts +1 -1
  181. package/dist/esm/services/documentStore/versioned/dynamodb.d.ts +3 -3
  182. package/dist/esm/services/documentStore/versioned/dynamodb.js +4 -4
  183. package/dist/esm/services/documentStore/versioned/file-system.d.ts +3 -3
  184. package/dist/esm/services/documentStore/versioned/file-system.js +1 -1
  185. package/dist/esm/services/documentStore/versioned/index.d.ts +2 -2
  186. package/dist/esm/services/exercisesGateway/index.d.ts +2 -2
  187. package/dist/esm/services/exercisesGateway/index.js +5 -5
  188. package/dist/esm/services/fileServer/index.js +1 -1
  189. package/dist/esm/services/fileServer/localFileServer.d.ts +2 -2
  190. package/dist/esm/services/fileServer/localFileServer.js +83 -22
  191. package/dist/esm/services/fileServer/s3FileServer.d.ts +2 -2
  192. package/dist/esm/services/fileServer/s3FileServer.js +5 -5
  193. package/dist/esm/services/httpMessageVerifier/index.d.ts +1 -1
  194. package/dist/esm/services/httpMessageVerifier/index.js +6 -6
  195. package/dist/esm/services/launchParams/index.d.ts +2 -2
  196. package/dist/esm/services/launchParams/index.js +2 -2
  197. package/dist/esm/services/launchParams/signer.d.ts +2 -2
  198. package/dist/esm/services/launchParams/signer.js +3 -3
  199. package/dist/esm/services/launchParams/verifier.d.ts +1 -1
  200. package/dist/esm/services/launchParams/verifier.js +5 -5
  201. package/dist/esm/services/logger/console.d.ts +1 -1
  202. package/dist/esm/services/logger/console.js +1 -1
  203. package/dist/esm/services/logger/index.d.ts +1 -1
  204. package/dist/esm/services/lrsGateway/addStatementDefaultFields.d.ts +1 -1
  205. package/dist/esm/services/lrsGateway/addStatementDefaultFields.js +2 -7
  206. package/dist/esm/services/lrsGateway/attempt-utils.d.ts +11 -10
  207. package/dist/esm/services/lrsGateway/attempt-utils.js +21 -7
  208. package/dist/esm/services/lrsGateway/batching.d.ts +2 -2
  209. package/dist/esm/services/lrsGateway/batching.js +1 -1
  210. package/dist/esm/services/lrsGateway/file-system.d.ts +3 -3
  211. package/dist/esm/services/lrsGateway/file-system.js +7 -12
  212. package/dist/esm/services/lrsGateway/index.d.ts +7 -12
  213. package/dist/esm/services/lrsGateway/index.js +12 -33
  214. package/dist/esm/services/lrsGateway/xapiUtils.d.ts +4 -4
  215. package/dist/esm/services/lrsGateway/xapiUtils.js +2 -2
  216. package/dist/esm/services/postgresConnection/index.d.ts +2 -2
  217. package/dist/esm/services/postgresConnection/index.js +4 -4
  218. package/dist/esm/services/queueProvider/local.d.ts +2 -2
  219. package/dist/esm/services/queueProvider/local.js +3 -4
  220. package/dist/esm/services/queueProvider/sqs.d.ts +2 -2
  221. package/dist/esm/services/queueProvider/sqs.js +3 -3
  222. package/dist/esm/services/searchProvider/memorySearchTheBadWay.d.ts +1 -1
  223. package/dist/esm/services/searchProvider/memorySearchTheBadWay.js +3 -3
  224. package/dist/esm/services/searchProvider/openSearch.d.ts +2 -2
  225. package/dist/esm/services/searchProvider/openSearch.js +4 -4
  226. package/dist/esm/services/searchProvider/streamIndexer.d.ts +2 -2
  227. package/dist/esm/services/searchProvider/streamIndexer.js +1 -1
  228. package/dist/esm/tsconfig.without-specs.esm.tsbuildinfo +1 -1
  229. package/package.json +39 -44
  230. package/script/build.bash +1 -1
@@ -1,5 +1,5 @@
1
1
  import { createDecipheriv, verify } from 'crypto';
2
- import { isPlainObject } from '../../../guards';
2
+ import { isPlainObject } from '../../../guards/index.js';
3
3
  export const decryptJwe = (jwe, encryptionPrivateKey) => {
4
4
  const jweParts = jwe.split('.', 6);
5
5
  if (jweParts.length !== 5 || jweParts[1]) {
@@ -1,5 +1,5 @@
1
- import { User } from '..';
2
- import { Window } from '../browser';
1
+ import { Window } from '../browser.js';
2
+ import { User } from '../index.js';
3
3
  export type UserData<T = User> = {
4
4
  user?: T;
5
5
  token: string | null;
@@ -1,6 +1,6 @@
1
- import { AuthProvider } from '..';
2
- import { AssertionFailed } from '../../../assertions';
3
- import { ConfigProviderForConfig } from '../../../config';
1
+ import { AssertionFailed } from '../../../assertions/index.js';
2
+ import { ConfigProviderForConfig } from '../../../config/index.js';
3
+ import { AuthProvider } from '../index.js';
4
4
  type Config = {
5
5
  application: string;
6
6
  };
@@ -1,7 +1,7 @@
1
- import { doThrow } from '../../../assertions';
2
- import { resolveConfigValue } from '../../../config/resolveConfigValue';
3
- import { UnauthorizedError } from '../../../errors';
4
- import { once } from '../../../misc/helpers';
1
+ import { doThrow } from '../../../assertions/index.js';
2
+ import { resolveConfigValue } from '../../../config/resolveConfigValue.js';
3
+ import { UnauthorizedError } from '../../../errors/index.js';
4
+ import { once } from '../../../misc/helpers.js';
5
5
  export const createUserRoleValidator = (auth, config) => {
6
6
  const application = once(() => resolveConfigValue(config.application));
7
7
  const getUserRoles = async () => {
@@ -1,3 +1,3 @@
1
- import { ApiUser } from '..';
2
- import { GenericFetch } from '../../../fetch';
1
+ import { GenericFetch } from '../../../fetch/index.js';
2
+ import { ApiUser } from '../index.js';
3
3
  export declare const loadUserData: (fetch: GenericFetch, accountsBase: string, cookieName: string, token: string) => Promise<ApiUser | undefined>;
@@ -1,5 +1,5 @@
1
1
  import { AttributeValue } from '@aws-sdk/client-dynamodb';
2
- import { DocumentBaseType, DocumentBaseValueTypes } from '.';
2
+ import { DocumentBaseType, DocumentBaseValueTypes } from './index.js';
3
3
  export declare const encodeDynamoAttribute: (value: DocumentBaseValueTypes) => AttributeValue;
4
4
  export declare const encodeDynamoDocument: (base: DocumentBaseType) => {
5
5
  [k: string]: AttributeValue;
@@ -1,4 +1,4 @@
1
- import { isPlainObject } from '../../guards';
1
+ import { isPlainObject } from '../../guards/index.js';
2
2
  export const encodeDynamoAttribute = (value) => {
3
3
  if (typeof value === 'string') {
4
4
  return { S: value };
@@ -1,6 +1,6 @@
1
1
  import { DynamoDB } from '@aws-sdk/client-dynamodb';
2
- import { Config, TDocument } from '..';
3
- import { ConfigProviderForConfig } from '../../../config';
2
+ import { ConfigProviderForConfig } from '../../../config/index.js';
3
+ import { Config, TDocument } from '../index.js';
4
4
  interface Initializer<C> {
5
5
  configSpace?: C;
6
6
  dynamoClient?: DynamoDB;
@@ -1,10 +1,10 @@
1
1
  import { BatchGetItemCommand, DynamoDB, GetItemCommand, PutItemCommand, QueryCommand, ScanCommand, UpdateItemCommand } from '@aws-sdk/client-dynamodb';
2
2
  import asyncPool from 'tiny-async-pool';
3
- import { once } from '../../..';
4
- import { resolveConfigValue } from '../../../config';
5
- import { ConflictError, NotFoundError } from '../../../errors';
6
- import { ifDefined } from '../../../guards';
7
- import { decodeDynamoDocument, encodeDynamoAttribute, encodeDynamoDocument } from '../dynamoEncoding';
3
+ import { resolveConfigValue } from '../../../config/index.js';
4
+ import { ConflictError, NotFoundError } from '../../../errors/index.js';
5
+ import { ifDefined } from '../../../guards/index.js';
6
+ import { once } from '../../../index.js';
7
+ import { decodeDynamoDocument, encodeDynamoAttribute, encodeDynamoDocument } from '../dynamoEncoding.js';
8
8
  export const dynamoUnversionedDocumentStore = (initializer) => {
9
9
  const init = ifDefined(initializer, {});
10
10
  const dynamodb = once(() => { var _a; return (_a = init.dynamoClient) !== null && _a !== void 0 ? _a : new DynamoDB({ apiVersion: '2012-08-10' }); });
@@ -1,5 +1,5 @@
1
- import { Config, TDocument } from '..';
2
- import { ConfigProviderForConfig } from '../../../config';
1
+ import { ConfigProviderForConfig } from '../../../config/index.js';
2
+ import { Config, TDocument } from '../index.js';
3
3
  interface Initializer<C> {
4
4
  dataDir: string;
5
5
  fs?: Pick<typeof import('fs'), 'mkdir' | 'readdir' | 'readFile' | 'writeFile'>;
@@ -1,9 +1,9 @@
1
1
  import * as fsModule from 'fs';
2
2
  import path from 'path';
3
- import { hashValue } from '../../..';
4
- import { resolveConfigValue } from '../../../config';
5
- import { ConflictError, NotFoundError } from '../../../errors';
6
- import { ifDefined, isDefined } from '../../../guards';
3
+ import { resolveConfigValue } from '../../../config/index.js';
4
+ import { ConflictError, NotFoundError } from '../../../errors/index.js';
5
+ import { ifDefined, isDefined } from '../../../guards/index.js';
6
+ import { hashValue } from '../../../index.js';
7
7
  export const fileSystemUnversionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, options) => {
8
8
  const tableName = resolveConfigValue(configProvider[initializer.configSpace || 'fileSystem'].tableName);
9
9
  const tablePath = tableName.then((table) => path.join(initializer.dataDir, table));
@@ -1,2 +1,2 @@
1
- import { dynamoUnversionedDocumentStore } from './dynamodb';
1
+ import { dynamoUnversionedDocumentStore } from './dynamodb.js';
2
2
  export type UnversionedDocumentStoreCreator = typeof dynamoUnversionedDocumentStore;
@@ -1,7 +1,7 @@
1
1
  import { DynamoDB } from '@aws-sdk/client-dynamodb';
2
- import { Config } from '..';
3
- import { ConfigProviderForConfig } from '../../../config';
4
- import { VersionedDocumentAuthor, VersionedTDocument } from '.';
2
+ import { ConfigProviderForConfig } from '../../../config/index.js';
3
+ import { Config } from '../index.js';
4
+ import { VersionedDocumentAuthor, VersionedTDocument } from './index.js';
5
5
  interface Initializer<C> {
6
6
  configSpace?: C;
7
7
  dynamoClient?: DynamoDB;
@@ -1,8 +1,8 @@
1
1
  import { DynamoDB, PutItemCommand, QueryCommand, ScanCommand } from '@aws-sdk/client-dynamodb';
2
- import { once } from '../../..';
3
- import { resolveConfigValue } from '../../../config';
4
- import { ifDefined } from '../../../guards';
5
- import { decodeDynamoDocument, encodeDynamoAttribute, encodeDynamoDocument } from '../dynamoEncoding';
2
+ import { resolveConfigValue } from '../../../config/index.js';
3
+ import { ifDefined } from '../../../guards/index.js';
4
+ import { once } from '../../../index.js';
5
+ import { decodeDynamoDocument, encodeDynamoAttribute, encodeDynamoDocument } from '../dynamoEncoding.js';
6
6
  // i'm not really excited about getAuthor being required, but ts is getting confused about the type when unspecified
7
7
  export const dynamoVersionedDocumentStore = (initializer) => {
8
8
  const init = ifDefined(initializer, {});
@@ -1,6 +1,6 @@
1
- import { Config } from '..';
2
- import { ConfigProviderForConfig } from '../../../config';
3
- import { VersionedDocumentAuthor, VersionedTDocument } from '.';
1
+ import { ConfigProviderForConfig } from '../../../config/index.js';
2
+ import { Config } from '../index.js';
3
+ import { VersionedDocumentAuthor, VersionedTDocument } from './index.js';
4
4
  interface Initializer<C> {
5
5
  dataDir: string;
6
6
  fs?: Pick<typeof import('fs'), 'mkdir' | 'readdir' | 'readFile' | 'writeFile'>;
@@ -1,4 +1,4 @@
1
- import { fileSystemUnversionedDocumentStore } from '../unversioned/file-system';
1
+ import { fileSystemUnversionedDocumentStore } from '../unversioned/file-system.js';
2
2
  const PAGE_LIMIT = 5;
3
3
  export const fileSystemVersionedDocumentStore = (initializer) => () => (configProvider) => (_, hashKey, options) => {
4
4
  const unversionedDocuments = fileSystemUnversionedDocumentStore(initializer)()(configProvider)({}, 'id');
@@ -1,5 +1,5 @@
1
- import { TDocument } from '..';
2
- import { dynamoVersionedDocumentStore } from './dynamodb';
1
+ import { TDocument } from '../index.js';
2
+ import { dynamoVersionedDocumentStore } from './dynamodb.js';
3
3
  export type VersionedDocumentAuthor = {
4
4
  type: 'user';
5
5
  uuid: string;
@@ -1,5 +1,5 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { GenericFetch } from '../../fetch';
1
+ import { ConfigProviderForConfig } from '../../config/index.js';
2
+ import { GenericFetch } from '../../fetch/index.js';
3
3
  export type Config = {
4
4
  defaultCorrectness?: string;
5
5
  exercisesHost: string;
@@ -1,9 +1,9 @@
1
1
  import * as queryString from 'query-string';
2
- import { once } from '../..';
3
- import { assertString } from '../../assertions';
4
- import { resolveConfigValue } from '../../config';
5
- import { ifDefined } from '../../guards';
6
- import { METHOD } from '../../routing';
2
+ import { assertString } from '../../assertions/index.js';
3
+ import { resolveConfigValue } from '../../config/index.js';
4
+ import { ifDefined } from '../../guards/index.js';
5
+ import { once } from '../../index.js';
6
+ import { METHOD } from '../../routing/index.js';
7
7
  export const exercisesGateway = (initializer) => (configProvider) => {
8
8
  const config = configProvider[ifDefined(initializer.configSpace, 'exercises')];
9
9
  const exercisesHost = once(() => resolveConfigValue(config.exercisesHost));
@@ -1,4 +1,4 @@
1
- import { isPlainObject } from '../../guards';
1
+ import { isPlainObject } from '../../guards/index.js';
2
2
  export const isFileValue = (thing) => isPlainObject(thing)
3
3
  && Object.keys(thing).every(key => ['dataType', 'path', 'label', 'mimeType'].includes(key))
4
4
  && thing.dataType === 'file'
@@ -1,5 +1,5 @@
1
- import { ConfigProviderForConfig } from '../../config';
2
- import { FileServerAdapter } from '.';
1
+ import { ConfigProviderForConfig } from '../../config/index.js';
2
+ import { FileServerAdapter } from './index.js';
3
3
  export type Config = {
4
4
  port?: string;
5
5
  host?: string;
@@ -1,39 +1,100 @@
1
- /* cspell:ignore originalname */
1
+ /* spell-checker: ignore originalname busboy */
2
2
  import crypto from 'crypto';
3
3
  import fs from 'fs';
4
4
  import https from 'https';
5
5
  import path from 'path';
6
- import cors from 'cors';
7
- import express from 'express';
8
- import multer from 'multer';
6
+ import { pipeline } from 'stream/promises';
7
+ import Busboy from 'busboy';
9
8
  import { v4 as uuid } from 'uuid';
10
- import { assertString } from '../../assertions';
11
- import { resolveConfigValue } from '../../config';
12
- import { ifDefined } from '../../guards';
13
- import { memoize } from '../../misc/helpers';
9
+ import { assertString } from '../../assertions/index.js';
10
+ import { resolveConfigValue } from '../../config/index.js';
11
+ import { ifDefined } from '../../guards/index.js';
12
+ import { memoize } from '../../misc/helpers.js';
14
13
  /* istanbul ignore next */
15
- const startServer = memoize((port, uploadDir) => {
16
- // TODO - re-evaluate the `preservePath` behavior to match whatever s3 does
17
- const upload = multer({ dest: uploadDir, preservePath: true });
18
- const fileServerApp = express();
19
- fileServerApp.use(cors());
20
- fileServerApp.use(express.static(uploadDir));
21
- fileServerApp.post('/', upload.single('file'), async (req, res) => {
22
- const file = req.file;
23
- if (!file) {
24
- return res.status(400).send({ message: 'file is required' });
14
+ const serveStaticFile = async (filePath, res) => {
15
+ try {
16
+ const stat = await fs.promises.stat(filePath);
17
+ if (!stat.isFile()) {
18
+ res.writeHead(404);
19
+ res.end();
20
+ return;
25
21
  }
26
- const destinationName = req.body.key.replace('${filename}', file.originalname);
22
+ res.writeHead(200, { 'Content-Length': stat.size });
23
+ await pipeline(fs.createReadStream(filePath), res);
24
+ }
25
+ catch {
26
+ res.writeHead(404);
27
+ res.end();
28
+ }
29
+ };
30
+ /* istanbul ignore next */
31
+ const handleUpload = (req, res, uploadDir) => {
32
+ const busboy = Busboy({ headers: req.headers });
33
+ let key = '';
34
+ let originalName = '';
35
+ let tempPath = '';
36
+ busboy.on('field', (name, value) => {
37
+ if (name === 'key')
38
+ key = value;
39
+ });
40
+ busboy.on('file', (_name, file, info) => {
41
+ originalName = info.filename;
42
+ tempPath = path.join(uploadDir, uuid());
43
+ file.pipe(fs.createWriteStream(tempPath));
44
+ });
45
+ busboy.on('finish', async () => {
46
+ if (!tempPath) {
47
+ res.writeHead(400, { 'Content-Type': 'application/json' });
48
+ res.end(JSON.stringify({ message: 'file is required' }));
49
+ return;
50
+ }
51
+ const destinationName = key.replace('${filename}', originalName);
27
52
  const destinationPath = path.join(uploadDir, destinationName);
28
53
  const destinationDirectory = path.dirname(destinationPath);
29
54
  await fs.promises.mkdir(destinationDirectory, { recursive: true });
30
- await fs.promises.rename(file.path, destinationPath);
31
- res.status(201).send();
55
+ await fs.promises.rename(tempPath, destinationPath);
56
+ res.writeHead(201);
57
+ res.end();
32
58
  });
59
+ req.pipe(busboy);
60
+ };
61
+ /* istanbul ignore next */
62
+ const setCorsHeaders = (res) => {
63
+ res.setHeader('Access-Control-Allow-Origin', '*');
64
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
65
+ res.setHeader('Access-Control-Allow-Headers', '*');
66
+ };
67
+ /* istanbul ignore next */
68
+ const startServer = memoize((port, uploadDir) => {
33
69
  const server = https.createServer({
34
70
  key: fs.readFileSync(assertString(process.env.SSL_KEY_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
35
71
  cert: fs.readFileSync(assertString(process.env.SSL_CRT_FILE, new Error('ssl key is required for localFileServer')), 'utf8'),
36
- }, fileServerApp);
72
+ }, (req, res) => {
73
+ setCorsHeaders(res);
74
+ if (req.method === 'OPTIONS') {
75
+ res.writeHead(204);
76
+ res.end();
77
+ return;
78
+ }
79
+ if (req.method === 'POST' && req.url === '/') {
80
+ handleUpload(req, res, uploadDir);
81
+ return;
82
+ }
83
+ if (req.method === 'GET') {
84
+ const urlPath = decodeURIComponent(new URL(req.url || '/', 'https://localhost').pathname);
85
+ const filePath = path.join(uploadDir, urlPath);
86
+ // prevent directory traversal
87
+ if (!filePath.startsWith(uploadDir)) {
88
+ res.writeHead(403);
89
+ res.end();
90
+ return;
91
+ }
92
+ serveStaticFile(filePath, res);
93
+ return;
94
+ }
95
+ res.writeHead(405);
96
+ res.end();
97
+ });
37
98
  server.once('error', function (err) {
38
99
  if (err.code === 'EADDRINUSE') {
39
100
  // when the local dev server reloads files on every request it doesn't
@@ -1,6 +1,6 @@
1
1
  import { S3Client } from '@aws-sdk/client-s3';
2
- import { ConfigProviderForConfig } from '../../config';
3
- import { FileServerAdapter } from '.';
2
+ import { ConfigProviderForConfig } from '../../config/index.js';
3
+ import { FileServerAdapter } from './index.js';
4
4
  export type Config = {
5
5
  bucketName: string;
6
6
  bucketRegion: string;
@@ -1,13 +1,13 @@
1
- /* cspell:ignore presigner */
1
+ /* spell-checker: ignore presigner */
2
2
  import path from 'path';
3
3
  import { CopyObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
4
4
  import { createPresignedPost } from '@aws-sdk/s3-presigned-post';
5
5
  import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
6
6
  import { v4 as uuid } from 'uuid';
7
- import { once } from '../..';
8
- import { assertDefined } from '../../assertions';
9
- import { resolveConfigValue } from '../../config';
10
- import { ifDefined } from '../../guards';
7
+ import { assertDefined } from '../../assertions/index.js';
8
+ import { resolveConfigValue } from '../../config/index.js';
9
+ import { ifDefined } from '../../guards/index.js';
10
+ import { once } from '../../index.js';
11
11
  export const s3FileServer = (initializer) => (configProvider) => {
12
12
  const config = configProvider[ifDefined(initializer.configSpace, 'deployed')];
13
13
  const bucketName = once(() => resolveConfigValue(config.bucketName));
@@ -1,7 +1,7 @@
1
1
  import { APIGatewayProxyEventV2 } from 'aws-lambda';
2
2
  import { VerifyConfig } from 'http-message-signatures';
3
3
  import { JWK } from 'node-jose';
4
- import { ConfigProviderForConfig } from '../../config';
4
+ import { ConfigProviderForConfig } from '../../config/index.js';
5
5
  type Config = {
6
6
  apiHost: string;
7
7
  bypassSignatureVerification: string;
@@ -1,13 +1,13 @@
1
- // cspell:ignore algs, httpbis, keyid
1
+ /* spell-checker: ignore algs httpbis keyid */
2
2
  import { createHash } from 'crypto';
3
3
  import { createVerifier, httpbis } from 'http-message-signatures';
4
4
  import { SigningKeyNotFoundError } from 'jwks-rsa';
5
5
  import { ByteSequence, parseDictionary, parseItem, Token } from 'structured-headers';
6
- import { assertString } from '../../assertions';
7
- import { resolveConfigValue } from '../../config';
8
- import { InvalidRequestError } from '../../errors';
9
- import { once } from '../../misc/helpers';
10
- import { getJwksClient } from '../../misc/jwks';
6
+ import { assertString } from '../../assertions/index.js';
7
+ import { resolveConfigValue } from '../../config/index.js';
8
+ import { InvalidRequestError } from '../../errors/index.js';
9
+ import { once } from '../../misc/helpers.js';
10
+ import { getJwksClient } from '../../misc/jwks.js';
11
11
  export const createHttpMessageVerifier = ({ configSpace, fetcher }) => (configProvider) => {
12
12
  const config = configProvider[configSpace !== null && configSpace !== void 0 ? configSpace : 'verifier'];
13
13
  const getApiHost = once(async () => await resolveConfigValue(config.apiHost));
@@ -1,2 +1,2 @@
1
- export { createLaunchSigner } from './signer';
2
- export { createLaunchVerifier } from './verifier';
1
+ export { createLaunchSigner } from './signer.js';
2
+ export { createLaunchVerifier } from './verifier.js';
@@ -1,2 +1,2 @@
1
- export { createLaunchSigner } from './signer';
2
- export { createLaunchVerifier } from './verifier';
1
+ export { createLaunchSigner } from './signer.js';
2
+ export { createLaunchVerifier } from './verifier.js';
@@ -1,6 +1,6 @@
1
1
  import { JWK } from 'node-jose';
2
- import { ConfigProviderForConfig } from '../../config';
3
- import type { JsonCompatibleStruct } from '../../routing';
2
+ import { ConfigProviderForConfig } from '../../config/index.js';
3
+ import type { JsonCompatibleStruct } from '../../routing/index.js';
4
4
  type Config = {
5
5
  alg: string;
6
6
  expiresIn: string;
@@ -1,9 +1,9 @@
1
1
  import jwt from 'jsonwebtoken';
2
2
  import ms from 'ms';
3
3
  import { JWK } from 'node-jose';
4
- import { once } from '../..';
5
- import { resolveConfigValue } from '../../config';
6
- import { ifDefined } from '../../guards';
4
+ import { resolveConfigValue } from '../../config/index.js';
5
+ import { ifDefined } from '../../guards/index.js';
6
+ import { once } from '../../index.js';
7
7
  const SUPPORTED_ALGORITHMS = [
8
8
  'RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'HS256', 'HS384', 'HS512', 'PS256', 'PS384', 'PS512'
9
9
  ];
@@ -1,6 +1,6 @@
1
1
  import jwt from 'jsonwebtoken';
2
2
  import type { JWK } from 'node-jose';
3
- import { ConfigProviderForConfig } from '../../config';
3
+ import { ConfigProviderForConfig } from '../../config/index.js';
4
4
  type Config = {
5
5
  trustedDomain: string;
6
6
  bypassSignatureVerification: string;
@@ -1,9 +1,9 @@
1
1
  import jwt, { TokenExpiredError } from 'jsonwebtoken';
2
- import { resolveConfigValue } from '../../config';
3
- import { InvalidRequestError, SessionExpiredError } from '../../errors';
4
- import { ifDefined } from '../../guards';
5
- import { once } from '../../misc/helpers';
6
- import { getJwksKey } from '../../misc/jwks';
2
+ import { resolveConfigValue } from '../../config/index.js';
3
+ import { InvalidRequestError, SessionExpiredError } from '../../errors/index.js';
4
+ import { ifDefined } from '../../guards/index.js';
5
+ import { once } from '../../misc/helpers.js';
6
+ import { getJwksKey } from '../../misc/jwks.js';
7
7
  /**
8
8
  * Creates a class that can verify launch params
9
9
  */
@@ -1,4 +1,4 @@
1
1
  /**
2
2
  * Creates a logger that logs to the console.
3
3
  */
4
- export declare const createConsoleLogger: () => import(".").Logger;
4
+ export declare const createConsoleLogger: () => import("./index.js").Logger;
@@ -1,4 +1,4 @@
1
- import { createCoreLogger } from '.';
1
+ import { createCoreLogger } from './index.js';
2
2
  /**
3
3
  * Creates a logger that logs to the console.
4
4
  */
@@ -1,4 +1,4 @@
1
- import { JsonCompatibleStruct } from '../../routing';
1
+ import { JsonCompatibleStruct } from '../../routing/index.js';
2
2
  /**
3
3
  * The log level
4
4
  */
@@ -1,4 +1,4 @@
1
- import { EagerXapiStatement, UXapiStatement, XapiStatement } from '.';
1
+ import { EagerXapiStatement, UXapiStatement, XapiStatement } from './index.js';
2
2
  export declare const addStatementDefaultFields: (statement: (Pick<XapiStatement, "object" | "verb" | "context" | "result"> & {
3
3
  id?: string;
4
4
  }) | UXapiStatement, user: {
@@ -1,14 +1,9 @@
1
1
  import formatISO from 'date-fns/formatISO';
2
2
  import { v4 as uuid } from 'uuid';
3
+ import { formatAgent } from './attempt-utils.js';
3
4
  export const addStatementDefaultFields = (statement, user) => ({
4
5
  id: uuid(),
5
- actor: {
6
- account: {
7
- homePage: 'https://openstax.org',
8
- name: user.uuid,
9
- },
10
- objectType: 'Agent',
11
- },
6
+ actor: formatAgent(user.uuid),
12
7
  timestamp: formatISO(new Date()),
13
8
  ...statement,
14
9
  });
@@ -1,4 +1,5 @@
1
- import { LrsGateway, UXapiStatement } from '.';
1
+ import { LrsGateway, UXapiStatement, XapiAgent } from './index.js';
2
+ export declare const formatAgent: (agent: string | XapiAgent) => XapiAgent;
2
3
  export declare const EXT_PENDING_SCORING = "https://openstax.org/xapi/extensions/pending-scoring";
3
4
  export type AttemptEntry = {
4
5
  attempt: UXapiStatement;
@@ -41,7 +42,7 @@ export declare const loadStatementsForActivityAndFirstChildren: (gateway: LrsGat
41
42
  attempt?: string;
42
43
  ensureSync?: boolean;
43
44
  user?: string;
44
- }) => Promise<import(".").XapiStatement[]>;
45
+ }) => Promise<import("./index.js").XapiStatement[]>;
45
46
  export declare const loadActivityAttemptInfo: (gateway: LrsGateway, activityIRI: string, options?: {
46
47
  currentAttempt?: string;
47
48
  parentActivityAttempt?: string;
@@ -54,7 +55,7 @@ export declare const createStatement: (verb: UXapiStatement["verb"], activity: {
54
55
  extensions?: {
55
56
  [key: string]: string;
56
57
  };
57
- }, attempt: string, parentActivityIRI?: string) => Pick<UXapiStatement, "object" | "verb" | "context">;
58
+ }, attempt: string, parentActivityIRI?: string, instructor?: string) => Pick<UXapiStatement, "object" | "verb" | "context">;
58
59
  export declare const createAttemptStatement: (activity: {
59
60
  iri: string;
60
61
  type: string;
@@ -76,14 +77,14 @@ export declare const putAttemptStatement: (gateway: LrsGateway, activity: {
76
77
  }, parentActivity?: {
77
78
  iri?: string;
78
79
  attempt?: string;
79
- }) => Promise<import(".").EagerXapiStatement>;
80
+ }) => Promise<import("./index.js").EagerXapiStatement>;
80
81
  export declare const createAttemptActivityStatement: (attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
81
- export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Promise<import(".").EagerXapiStatement>;
82
+ export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Promise<import("./index.js").EagerXapiStatement>;
82
83
  export declare const createCompletedStatement: (attemptStatement: UXapiStatement, result?: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
83
- export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string) => Promise<import(".").EagerXapiStatement>;
84
+ export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string) => Promise<import("./index.js").EagerXapiStatement>;
84
85
  export declare const createCompletedPendingScoringStatement: (attemptStatement: UXapiStatement) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
85
- export declare const putCompletedPendingScoringStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, user?: string) => Promise<import(".").EagerXapiStatement>;
86
- export declare const createScoredStatement: (attemptStatement: UXapiStatement, result: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
87
- export declare const putScoredStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string) => Promise<import(".").EagerXapiStatement>;
86
+ export declare const putCompletedPendingScoringStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, user?: string) => Promise<import("./index.js").EagerXapiStatement>;
87
+ export declare const createScoredStatement: (attemptStatement: UXapiStatement, result: UXapiStatement["result"], instructor?: string) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
88
+ export declare const putScoredStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string, instructor?: string) => Promise<import("./index.js").EagerXapiStatement>;
88
89
  export declare const createScoredPendingScoringStatement: (attemptStatement: UXapiStatement, result: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
89
- export declare const putScoredPendingScoringStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string) => Promise<import(".").EagerXapiStatement>;
90
+ export declare const putScoredPendingScoringStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string) => Promise<import("./index.js").EagerXapiStatement>;