@hot-updater/plugin-core 1.0.0-rc.1 → 1.0.0-rc.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.
- package/dist/_virtual/_rolldown/runtime.cjs +1 -1
- package/dist/assetStorageLayout.cjs +4 -2
- package/dist/assetStorageLayout.d.cts +5 -24
- package/dist/assetStorageLayout.d.mts +5 -24
- package/dist/assetStorageLayout.mjs +4 -2
- package/dist/calculatePagination.d.cts +0 -1
- package/dist/calculatePagination.d.mts +0 -1
- package/dist/compressionFormat.cjs +12 -5
- package/dist/compressionFormat.d.cts +1 -1
- package/dist/compressionFormat.d.mts +1 -1
- package/dist/compressionFormat.mjs +11 -4
- package/dist/contentAddressedAssets.d.cts +1 -4
- package/dist/contentAddressedAssets.d.mts +1 -4
- package/dist/createDatabasePlugin.cjs +161 -40
- package/dist/createDatabasePlugin.d.cts +3 -1
- package/dist/createDatabasePlugin.d.mts +3 -1
- package/dist/createDatabasePlugin.mjs +161 -41
- package/dist/createStoragePlugin.d.cts +0 -1
- package/dist/createStoragePlugin.d.mts +0 -1
- package/dist/databaseClient.cjs +6 -1
- package/dist/databaseClient.d.cts +1 -2
- package/dist/databaseClient.d.mts +1 -2
- package/dist/databaseClient.mjs +6 -2
- package/dist/databaseClientReads.cjs +3 -1
- package/dist/databaseClientReads.mjs +3 -2
- package/dist/databaseClientUpdates.cjs +2 -1
- package/dist/databaseClientUpdates.d.cts +1 -1
- package/dist/databaseClientUpdates.d.mts +1 -1
- package/dist/databaseClientUpdates.mjs +2 -0
- package/dist/databaseJsonValue.cjs +2 -0
- package/dist/databaseJsonValue.d.cts +1 -0
- package/dist/databaseJsonValue.d.mts +1 -0
- package/dist/databaseJsonValue.mjs +1 -1
- package/dist/databaseMetadata.cjs +0 -1
- package/dist/databasePluginCrud.cjs +3 -1
- package/dist/databasePluginCrud.d.cts +4 -1
- package/dist/databasePluginCrud.d.mts +4 -1
- package/dist/databasePluginCrud.mjs +4 -3
- package/dist/databasePluginCrudValidation.d.cts +6 -1
- package/dist/databasePluginCrudValidation.d.mts +6 -1
- package/dist/databasePluginCrudValidationErrors.cjs +1 -0
- package/dist/databasePluginCrudValidationErrors.mjs +1 -0
- package/dist/databasePluginCrudValidationFields.cjs +44 -14
- package/dist/databasePluginCrudValidationFields.d.cts +1 -1
- package/dist/databasePluginCrudValidationFields.d.mts +1 -1
- package/dist/databasePluginCrudValidationFields.mjs +42 -14
- package/dist/databasePluginCrudValidationMutations.cjs +20 -1
- package/dist/databasePluginCrudValidationMutations.d.cts +1 -1
- package/dist/databasePluginCrudValidationMutations.d.mts +1 -1
- package/dist/databasePluginCrudValidationMutations.mjs +20 -2
- package/dist/databasePluginCrudValidationQueries.d.cts +2 -1
- package/dist/databasePluginCrudValidationQueries.d.mts +2 -1
- package/dist/databasePluginCrudValidationRows.cjs +1 -1
- package/dist/databasePluginCrudValidationRows.d.cts +1 -1
- package/dist/databasePluginCrudValidationRows.d.mts +1 -1
- package/dist/databasePluginCrudValidationRows.mjs +1 -1
- package/dist/databaseRows.cjs +0 -1
- package/dist/databaseRows.d.cts +2 -6
- package/dist/databaseRows.d.mts +2 -6
- package/dist/index.cjs +4 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.mts +4 -3
- package/dist/index.mjs +2 -1
- package/dist/insightsContract.cjs +157 -0
- package/dist/insightsContract.d.cts +11 -0
- package/dist/insightsContract.d.mts +11 -0
- package/dist/insightsContract.mjs +153 -0
- package/dist/internal.d.cts +5 -4
- package/dist/internal.d.mts +5 -4
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/comparison-DenM3wCn.cjs +136 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/comparison-DenM3wCn.mjs +116 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/range-DvX-Y6iv.cjs +167 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/range-DvX-Y6iv.mjs +165 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/set-CC5YeoYX.cjs +42 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/set-CC5YeoYX.mjs +39 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/version-CQ98ZBpL.cjs +39 -0
- package/dist/node_modules/.pnpm/verkit@0.4.0/node_modules/verkit/dist/version-CQ98ZBpL.mjs +37 -0
- package/dist/paginateBundles.d.cts +1 -8
- package/dist/paginateBundles.d.mts +1 -8
- package/dist/parseStorageUri.d.cts +1 -5
- package/dist/parseStorageUri.d.mts +1 -5
- package/dist/queryBundles.d.cts +0 -1
- package/dist/queryBundles.d.mts +0 -1
- package/dist/releaseCatalogCompiler.cjs +15 -12
- package/dist/releaseCatalogCompiler.d.cts +0 -1
- package/dist/releaseCatalogCompiler.d.mts +0 -1
- package/dist/releaseCatalogCompiler.mjs +11 -7
- package/dist/releaseCatalogMutation.cjs +1 -1
- package/dist/releaseCatalogMutation.d.cts +1 -1
- package/dist/releaseCatalogMutation.d.mts +1 -1
- package/dist/releaseCatalogMutation.mjs +1 -0
- package/dist/releaseManagement.cjs +3 -2
- package/dist/releaseManagement.d.cts +1 -1
- package/dist/releaseManagement.d.mts +1 -1
- package/dist/releaseManagement.mjs +3 -1
- package/dist/remoteBundleSigning.cjs +4 -4
- package/dist/remoteBundleSigning.d.cts +2 -13
- package/dist/remoteBundleSigning.d.mts +2 -13
- package/dist/remoteBundleSigning.mjs +4 -4
- package/dist/requestBundleCache.d.cts +1 -2
- package/dist/requestBundleCache.d.mts +1 -2
- package/dist/semverSatisfies.cjs +4 -3
- package/dist/semverSatisfies.mjs +2 -1
- package/dist/storageDownloadPath.cjs +2 -1
- package/dist/storageDownloadPath.d.cts +1 -3
- package/dist/storageDownloadPath.d.mts +1 -3
- package/dist/storageDownloadPath.mjs +2 -1
- package/dist/types/database.d.cts +4 -3
- package/dist/types/database.d.mts +4 -3
- package/dist/types/databaseFields.cjs +13 -0
- package/dist/types/databaseFields.d.cts +1 -0
- package/dist/types/databaseFields.d.mts +1 -0
- package/dist/types/databaseFields.mjs +13 -0
- package/dist/types/databaseOperations.d.cts +26 -15
- package/dist/types/databaseOperations.d.mts +26 -15
- package/dist/types/databasePlugin.d.cts +70 -12
- package/dist/types/databasePlugin.d.mts +70 -12
- package/dist/types/databaseQuery.d.cts +2 -3
- package/dist/types/databaseQuery.d.mts +2 -3
- package/dist/types/databaseRows.d.cts +4 -3
- package/dist/types/databaseRows.d.mts +4 -3
- package/dist/types/index.d.cts +11 -7
- package/dist/types/index.d.mts +11 -7
- package/dist/types/internal.d.cts +5 -4
- package/dist/types/internal.d.mts +5 -4
- package/dist/types/public.d.cts +4 -3
- package/dist/types/public.d.mts +4 -3
- package/dist/types/utils.d.cts +1 -1
- package/dist/types/utils.d.mts +1 -1
- package/dist/uuidv7.cjs +7 -2
- package/dist/uuidv7.d.cts +0 -1
- package/dist/uuidv7.d.mts +0 -1
- package/dist/uuidv7.mjs +1 -1
- package/package.json +3 -3
- package/dist/node_modules/.pnpm/verkit@0.3.2/node_modules/verkit/dist/index.cjs +0 -345
- package/dist/node_modules/.pnpm/verkit@0.3.2/node_modules/verkit/dist/index.mjs +0 -341
|
@@ -15,7 +15,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
15
|
}
|
|
16
16
|
return to;
|
|
17
17
|
};
|
|
18
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
18
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
19
19
|
value: mod,
|
|
20
20
|
enumerable: true
|
|
21
21
|
}) : target, mod));
|
|
@@ -5,7 +5,8 @@ const require_parseStorageUri = require("./parseStorageUri.cjs");
|
|
|
5
5
|
const isBrotliManifestAssetPath = (assetPath) => /(^|\/)index\.[^/]+\.bundle$/.test(assetPath.replace(/\\/g, "/"));
|
|
6
6
|
const getManifestAssetDownloadPath = (assetPath) => isBrotliManifestAssetPath(assetPath) ? `${assetPath}.br` : assetPath;
|
|
7
7
|
const createStorageUriWithRelativePath = ({ baseStorageUri, relativePath }) => {
|
|
8
|
-
const
|
|
8
|
+
const protocol = new URL(baseStorageUri).protocol.replace(":", "");
|
|
9
|
+
const parsed = require_parseStorageUri.parseStorageUri(baseStorageUri, protocol);
|
|
9
10
|
const childKey = require_createStorageKeyBuilder.createStorageKeyBuilder(void 0)(relativePath);
|
|
10
11
|
if (!childKey) throw new Error("Relative storage key must not be empty.");
|
|
11
12
|
return require_parseStorageUri.createStorageUri({
|
|
@@ -15,7 +16,8 @@ const createStorageUriWithRelativePath = ({ baseStorageUri, relativePath }) => {
|
|
|
15
16
|
});
|
|
16
17
|
};
|
|
17
18
|
const replaceStorageUriKeySuffix = ({ storageUri, keySuffix, replacement }) => {
|
|
18
|
-
const
|
|
19
|
+
const protocol = new URL(storageUri).protocol.replace(":", "");
|
|
20
|
+
const parsed = require_parseStorageUri.parseStorageUri(storageUri, protocol);
|
|
19
21
|
const normalizedSuffix = require_createStorageKeyBuilder.createStorageKeyBuilder(void 0)(keySuffix);
|
|
20
22
|
const normalizedReplacement = require_createStorageKeyBuilder.createStorageKeyBuilder(void 0)(replacement);
|
|
21
23
|
if (!normalizedSuffix || !normalizedReplacement) throw new Error("Storage URI key suffix and replacement must not be empty.");
|
|
@@ -1,44 +1,25 @@
|
|
|
1
1
|
//#region src/assetStorageLayout.d.ts
|
|
2
2
|
declare const isBrotliManifestAssetPath: (assetPath: string) => boolean;
|
|
3
3
|
declare const getManifestAssetDownloadPath: (assetPath: string) => string;
|
|
4
|
-
declare const createStorageUriWithRelativePath: ({
|
|
5
|
-
baseStorageUri,
|
|
6
|
-
relativePath
|
|
7
|
-
}: {
|
|
4
|
+
declare const createStorageUriWithRelativePath: ({ baseStorageUri, relativePath }: {
|
|
8
5
|
baseStorageUri: string;
|
|
9
6
|
relativePath: string;
|
|
10
7
|
}) => string;
|
|
11
|
-
declare const replaceStorageUriKeySuffix: ({
|
|
12
|
-
storageUri,
|
|
13
|
-
keySuffix,
|
|
14
|
-
replacement
|
|
15
|
-
}: {
|
|
8
|
+
declare const replaceStorageUriKeySuffix: ({ storageUri, keySuffix, replacement }: {
|
|
16
9
|
storageUri: string;
|
|
17
10
|
keySuffix: string;
|
|
18
11
|
replacement: string;
|
|
19
12
|
}) => string;
|
|
20
|
-
declare const resolveManifestAssetStorageFileHash: ({
|
|
21
|
-
downloadFileHash,
|
|
22
|
-
fileHash
|
|
23
|
-
}: {
|
|
13
|
+
declare const resolveManifestAssetStorageFileHash: ({ downloadFileHash, fileHash }: {
|
|
24
14
|
downloadFileHash?: unknown;
|
|
25
15
|
fileHash: string;
|
|
26
16
|
}) => string;
|
|
27
|
-
declare const getManifestAssetStoragePath: ({
|
|
28
|
-
assetPath,
|
|
29
|
-
downloadFileHash,
|
|
30
|
-
fileHash
|
|
31
|
-
}: {
|
|
17
|
+
declare const getManifestAssetStoragePath: ({ assetPath, downloadFileHash, fileHash }: {
|
|
32
18
|
assetPath: string;
|
|
33
19
|
downloadFileHash?: unknown;
|
|
34
20
|
fileHash: string;
|
|
35
21
|
}) => string;
|
|
36
|
-
declare const resolveManifestAssetStorageUri: ({
|
|
37
|
-
assetBaseStorageUri,
|
|
38
|
-
assetPath,
|
|
39
|
-
downloadFileHash,
|
|
40
|
-
fileHash
|
|
41
|
-
}: {
|
|
22
|
+
declare const resolveManifestAssetStorageUri: ({ assetBaseStorageUri, assetPath, downloadFileHash, fileHash }: {
|
|
42
23
|
assetBaseStorageUri: string;
|
|
43
24
|
assetPath: string;
|
|
44
25
|
downloadFileHash?: unknown;
|
|
@@ -1,44 +1,25 @@
|
|
|
1
1
|
//#region src/assetStorageLayout.d.ts
|
|
2
2
|
declare const isBrotliManifestAssetPath: (assetPath: string) => boolean;
|
|
3
3
|
declare const getManifestAssetDownloadPath: (assetPath: string) => string;
|
|
4
|
-
declare const createStorageUriWithRelativePath: ({
|
|
5
|
-
baseStorageUri,
|
|
6
|
-
relativePath
|
|
7
|
-
}: {
|
|
4
|
+
declare const createStorageUriWithRelativePath: ({ baseStorageUri, relativePath }: {
|
|
8
5
|
baseStorageUri: string;
|
|
9
6
|
relativePath: string;
|
|
10
7
|
}) => string;
|
|
11
|
-
declare const replaceStorageUriKeySuffix: ({
|
|
12
|
-
storageUri,
|
|
13
|
-
keySuffix,
|
|
14
|
-
replacement
|
|
15
|
-
}: {
|
|
8
|
+
declare const replaceStorageUriKeySuffix: ({ storageUri, keySuffix, replacement }: {
|
|
16
9
|
storageUri: string;
|
|
17
10
|
keySuffix: string;
|
|
18
11
|
replacement: string;
|
|
19
12
|
}) => string;
|
|
20
|
-
declare const resolveManifestAssetStorageFileHash: ({
|
|
21
|
-
downloadFileHash,
|
|
22
|
-
fileHash
|
|
23
|
-
}: {
|
|
13
|
+
declare const resolveManifestAssetStorageFileHash: ({ downloadFileHash, fileHash }: {
|
|
24
14
|
downloadFileHash?: unknown;
|
|
25
15
|
fileHash: string;
|
|
26
16
|
}) => string;
|
|
27
|
-
declare const getManifestAssetStoragePath: ({
|
|
28
|
-
assetPath,
|
|
29
|
-
downloadFileHash,
|
|
30
|
-
fileHash
|
|
31
|
-
}: {
|
|
17
|
+
declare const getManifestAssetStoragePath: ({ assetPath, downloadFileHash, fileHash }: {
|
|
32
18
|
assetPath: string;
|
|
33
19
|
downloadFileHash?: unknown;
|
|
34
20
|
fileHash: string;
|
|
35
21
|
}) => string;
|
|
36
|
-
declare const resolveManifestAssetStorageUri: ({
|
|
37
|
-
assetBaseStorageUri,
|
|
38
|
-
assetPath,
|
|
39
|
-
downloadFileHash,
|
|
40
|
-
fileHash
|
|
41
|
-
}: {
|
|
22
|
+
declare const resolveManifestAssetStorageUri: ({ assetBaseStorageUri, assetPath, downloadFileHash, fileHash }: {
|
|
42
23
|
assetBaseStorageUri: string;
|
|
43
24
|
assetPath: string;
|
|
44
25
|
downloadFileHash?: unknown;
|
|
@@ -5,7 +5,8 @@ import { createStorageUri, parseStorageUri } from "./parseStorageUri.mjs";
|
|
|
5
5
|
const isBrotliManifestAssetPath = (assetPath) => /(^|\/)index\.[^/]+\.bundle$/.test(assetPath.replace(/\\/g, "/"));
|
|
6
6
|
const getManifestAssetDownloadPath = (assetPath) => isBrotliManifestAssetPath(assetPath) ? `${assetPath}.br` : assetPath;
|
|
7
7
|
const createStorageUriWithRelativePath = ({ baseStorageUri, relativePath }) => {
|
|
8
|
-
const
|
|
8
|
+
const protocol = new URL(baseStorageUri).protocol.replace(":", "");
|
|
9
|
+
const parsed = parseStorageUri(baseStorageUri, protocol);
|
|
9
10
|
const childKey = createStorageKeyBuilder(void 0)(relativePath);
|
|
10
11
|
if (!childKey) throw new Error("Relative storage key must not be empty.");
|
|
11
12
|
return createStorageUri({
|
|
@@ -15,7 +16,8 @@ const createStorageUriWithRelativePath = ({ baseStorageUri, relativePath }) => {
|
|
|
15
16
|
});
|
|
16
17
|
};
|
|
17
18
|
const replaceStorageUriKeySuffix = ({ storageUri, keySuffix, replacement }) => {
|
|
18
|
-
const
|
|
19
|
+
const protocol = new URL(storageUri).protocol.replace(":", "");
|
|
20
|
+
const parsed = parseStorageUri(storageUri, protocol);
|
|
19
21
|
const normalizedSuffix = createStorageKeyBuilder(void 0)(keySuffix);
|
|
20
22
|
const normalizedReplacement = createStorageKeyBuilder(void 0)(replacement);
|
|
21
23
|
if (!normalizedSuffix || !normalizedReplacement) throw new Error("Storage URI key suffix and replacement must not be empty.");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
|
|
2
2
|
let mime = require("mime");
|
|
3
|
-
mime = require_runtime.__toESM(mime);
|
|
3
|
+
mime = require_runtime.__toESM(mime, 1);
|
|
4
4
|
//#region src/compressionFormat.ts
|
|
5
5
|
/**
|
|
6
6
|
* Compression formats registry
|
|
@@ -24,21 +24,28 @@ const COMPRESSION_FORMATS = {
|
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
/**
|
|
27
|
+
* Finds the compression format matching a filename extension
|
|
28
|
+
* @param filename The filename to match
|
|
29
|
+
* @returns Compression format information, or undefined when nothing matches
|
|
30
|
+
*/
|
|
31
|
+
function findCompressionFormat(filename) {
|
|
32
|
+
return Object.values(COMPRESSION_FORMATS).find((info) => filename.endsWith(info.fileExtension));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
27
35
|
* Detects compression format from filename
|
|
28
36
|
* @param filename The filename to detect format from
|
|
29
37
|
* @returns Compression format information
|
|
30
38
|
*/
|
|
31
39
|
function detectCompressionFormat(filename) {
|
|
32
|
-
|
|
33
|
-
return COMPRESSION_FORMATS.zip;
|
|
40
|
+
return findCompressionFormat(filename) ?? COMPRESSION_FORMATS.zip;
|
|
34
41
|
}
|
|
35
42
|
/**
|
|
36
43
|
* Gets MIME type for a filename
|
|
37
44
|
* @param filename The filename to get MIME type for
|
|
38
|
-
* @returns MIME type string
|
|
45
|
+
* @returns MIME type string, or undefined when the filename is not an archive
|
|
39
46
|
*/
|
|
40
47
|
function getCompressionMimeType(filename) {
|
|
41
|
-
return
|
|
48
|
+
return findCompressionFormat(filename)?.mimeType;
|
|
42
49
|
}
|
|
43
50
|
/**
|
|
44
51
|
* Gets Content-Type for a bundle file with 3-tier fallback
|
|
@@ -20,7 +20,7 @@ declare function detectCompressionFormat(filename: string): CompressionFormatInf
|
|
|
20
20
|
/**
|
|
21
21
|
* Gets MIME type for a filename
|
|
22
22
|
* @param filename The filename to get MIME type for
|
|
23
|
-
* @returns MIME type string
|
|
23
|
+
* @returns MIME type string, or undefined when the filename is not an archive
|
|
24
24
|
*/
|
|
25
25
|
declare function getCompressionMimeType(filename: string): string | undefined;
|
|
26
26
|
/**
|
|
@@ -20,7 +20,7 @@ declare function detectCompressionFormat(filename: string): CompressionFormatInf
|
|
|
20
20
|
/**
|
|
21
21
|
* Gets MIME type for a filename
|
|
22
22
|
* @param filename The filename to get MIME type for
|
|
23
|
-
* @returns MIME type string
|
|
23
|
+
* @returns MIME type string, or undefined when the filename is not an archive
|
|
24
24
|
*/
|
|
25
25
|
declare function getCompressionMimeType(filename: string): string | undefined;
|
|
26
26
|
/**
|
|
@@ -22,21 +22,28 @@ const COMPRESSION_FORMATS = {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
/**
|
|
25
|
+
* Finds the compression format matching a filename extension
|
|
26
|
+
* @param filename The filename to match
|
|
27
|
+
* @returns Compression format information, or undefined when nothing matches
|
|
28
|
+
*/
|
|
29
|
+
function findCompressionFormat(filename) {
|
|
30
|
+
return Object.values(COMPRESSION_FORMATS).find((info) => filename.endsWith(info.fileExtension));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
25
33
|
* Detects compression format from filename
|
|
26
34
|
* @param filename The filename to detect format from
|
|
27
35
|
* @returns Compression format information
|
|
28
36
|
*/
|
|
29
37
|
function detectCompressionFormat(filename) {
|
|
30
|
-
|
|
31
|
-
return COMPRESSION_FORMATS.zip;
|
|
38
|
+
return findCompressionFormat(filename) ?? COMPRESSION_FORMATS.zip;
|
|
32
39
|
}
|
|
33
40
|
/**
|
|
34
41
|
* Gets MIME type for a filename
|
|
35
42
|
* @param filename The filename to get MIME type for
|
|
36
|
-
* @returns MIME type string
|
|
43
|
+
* @returns MIME type string, or undefined when the filename is not an archive
|
|
37
44
|
*/
|
|
38
45
|
function getCompressionMimeType(filename) {
|
|
39
|
-
return
|
|
46
|
+
return findCompressionFormat(filename)?.mimeType;
|
|
40
47
|
}
|
|
41
48
|
/**
|
|
42
49
|
* Gets Content-Type for a bundle file with 3-tier fallback
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
//#region src/contentAddressedAssets.d.ts
|
|
2
2
|
declare const CONTENT_ADDRESSED_ASSET_PREFIX = "assets";
|
|
3
3
|
declare const isContentAddressedAssetFileHash: (value: unknown) => value is string;
|
|
4
|
-
declare const getContentAddressedAssetStoragePath: ({
|
|
5
|
-
assetPath,
|
|
6
|
-
fileHash
|
|
7
|
-
}: {
|
|
4
|
+
declare const getContentAddressedAssetStoragePath: ({ assetPath, fileHash }: {
|
|
8
5
|
assetPath: string;
|
|
9
6
|
fileHash: string;
|
|
10
7
|
}) => string;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
//#region src/contentAddressedAssets.d.ts
|
|
2
2
|
declare const CONTENT_ADDRESSED_ASSET_PREFIX = "assets";
|
|
3
3
|
declare const isContentAddressedAssetFileHash: (value: unknown) => value is string;
|
|
4
|
-
declare const getContentAddressedAssetStoragePath: ({
|
|
5
|
-
assetPath,
|
|
6
|
-
fileHash
|
|
7
|
-
}: {
|
|
4
|
+
declare const getContentAddressedAssetStoragePath: ({ assetPath, fileHash }: {
|
|
8
5
|
assetPath: string;
|
|
9
6
|
fileHash: string;
|
|
10
7
|
}) => string;
|
|
@@ -4,10 +4,91 @@ const require_databasePluginCrudValidationRows = require("./databasePluginCrudVa
|
|
|
4
4
|
const require_databasePluginCrudValidationMutations = require("./databasePluginCrudValidationMutations.cjs");
|
|
5
5
|
const require_databasePluginCrud = require("./databasePluginCrud.cjs");
|
|
6
6
|
const require_databasePluginTransaction = require("./databasePluginTransaction.cjs");
|
|
7
|
+
const require_insightsContract = require("./insightsContract.cjs");
|
|
7
8
|
//#region src/createDatabasePlugin.ts
|
|
8
9
|
const PAGE_SIZE = 100;
|
|
9
10
|
const compareChannelRows = (left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
|
|
11
|
+
const toInsightsBundleWhere = (filter) => [
|
|
12
|
+
{
|
|
13
|
+
field: "platform",
|
|
14
|
+
value: filter.platform
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
field: "channel",
|
|
18
|
+
value: filter.channel
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
field: "type",
|
|
22
|
+
value: filter.type
|
|
23
|
+
},
|
|
24
|
+
filter.type === "RECOVERED" ? {
|
|
25
|
+
field: "from_bundle_id",
|
|
26
|
+
value: filter.fromBundleId
|
|
27
|
+
} : {
|
|
28
|
+
field: "to_bundle_id",
|
|
29
|
+
value: filter.toBundleId
|
|
30
|
+
}
|
|
31
|
+
];
|
|
32
|
+
const toInsightsEventRanges = (filter) => {
|
|
33
|
+
if (filter.kind === "all") return [[]];
|
|
34
|
+
if (filter.kind === "bundle") return [toInsightsBundleWhere(filter)];
|
|
35
|
+
return ["UPDATE_APPLIED", "RECOVERED"].map((type) => [{
|
|
36
|
+
field: "install_id",
|
|
37
|
+
value: filter.installId
|
|
38
|
+
}, {
|
|
39
|
+
field: "type",
|
|
40
|
+
value: type
|
|
41
|
+
}]);
|
|
42
|
+
};
|
|
43
|
+
const listInsightsEventRange = async (crud, input, filterWhere) => {
|
|
44
|
+
const where = [...filterWhere, {
|
|
45
|
+
field: "received_at_ms",
|
|
46
|
+
operator: "gte",
|
|
47
|
+
value: input.sinceMs ?? 0
|
|
48
|
+
}];
|
|
49
|
+
const sameTimestamp = input.after === void 0 ? [] : await crud.findMany({
|
|
50
|
+
model: "bundle_events",
|
|
51
|
+
where: [
|
|
52
|
+
...filterWhere,
|
|
53
|
+
{
|
|
54
|
+
field: "received_at_ms",
|
|
55
|
+
value: input.after.receivedAtMs
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
field: "id",
|
|
59
|
+
operator: "lt",
|
|
60
|
+
value: input.after.id
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
orderBy: [{
|
|
64
|
+
field: "id",
|
|
65
|
+
direction: "desc"
|
|
66
|
+
}],
|
|
67
|
+
limit: input.limit,
|
|
68
|
+
offset: 0
|
|
69
|
+
});
|
|
70
|
+
if (sameTimestamp.length === input.limit) return sameTimestamp;
|
|
71
|
+
const older = await crud.findMany({
|
|
72
|
+
model: "bundle_events",
|
|
73
|
+
where: [...where, {
|
|
74
|
+
field: "received_at_ms",
|
|
75
|
+
operator: "lt",
|
|
76
|
+
value: input.after?.receivedAtMs ?? input.beforeReceivedAtMs
|
|
77
|
+
}],
|
|
78
|
+
orderBy: [{
|
|
79
|
+
field: "received_at_ms",
|
|
80
|
+
direction: "desc"
|
|
81
|
+
}, {
|
|
82
|
+
field: "id",
|
|
83
|
+
direction: "desc"
|
|
84
|
+
}],
|
|
85
|
+
limit: input.limit - sameTimestamp.length,
|
|
86
|
+
offset: 0
|
|
87
|
+
});
|
|
88
|
+
return [...sameTimestamp, ...older];
|
|
89
|
+
};
|
|
10
90
|
var DatabaseAtomicCommitUnsupportedError = class extends Error {
|
|
91
|
+
pluginName;
|
|
11
92
|
name = "DatabaseAtomicCommitUnsupportedError";
|
|
12
93
|
constructor(pluginName) {
|
|
13
94
|
super(`Database plugin "${pluginName}" cannot atomically commit changes across models.`);
|
|
@@ -28,6 +109,7 @@ var DatabaseRowReferencedError = class extends Error {
|
|
|
28
109
|
}
|
|
29
110
|
};
|
|
30
111
|
var DatabaseCommitConflictError = class extends Error {
|
|
112
|
+
result;
|
|
31
113
|
name = "DatabaseCommitConflictError";
|
|
32
114
|
constructor(result) {
|
|
33
115
|
super("Database commit precondition failed.");
|
|
@@ -255,12 +337,6 @@ const applyChange = async (database, change, changeIndex) => {
|
|
|
255
337
|
}
|
|
256
338
|
return;
|
|
257
339
|
}
|
|
258
|
-
case "insights":
|
|
259
|
-
await database.create({
|
|
260
|
-
model: "bundle_events",
|
|
261
|
-
data: change.row
|
|
262
|
-
});
|
|
263
|
-
return;
|
|
264
340
|
case "apiKeys": switch (change.operation) {
|
|
265
341
|
case "insert":
|
|
266
342
|
await database.create({
|
|
@@ -442,14 +518,6 @@ const validateDatabaseChange = (change) => {
|
|
|
442
518
|
return;
|
|
443
519
|
default: throw new require_databasePluginCrudValidationErrors.DatabasePluginInputError("invalid-operation");
|
|
444
520
|
}
|
|
445
|
-
case "insights":
|
|
446
|
-
if (change.operation !== "insert" || !hasOnlyKeys(change, [
|
|
447
|
-
"model",
|
|
448
|
-
"operation",
|
|
449
|
-
"row"
|
|
450
|
-
])) throw new require_databasePluginCrudValidationErrors.DatabasePluginInputError("invalid-operation");
|
|
451
|
-
require_databasePluginCrudValidationRows.validateCreateData("bundle_events", change.row);
|
|
452
|
-
return;
|
|
453
521
|
case "apiKeys": switch (change.operation) {
|
|
454
522
|
case "insert":
|
|
455
523
|
if (!hasOnlyKeys(change, [
|
|
@@ -718,36 +786,82 @@ const createDatabasePluginAdapter = (name, implementation) => {
|
|
|
718
786
|
}
|
|
719
787
|
},
|
|
720
788
|
insights: {
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
789
|
+
record: (input) => implementation.recordInsights(input),
|
|
790
|
+
async listEvents(input) {
|
|
791
|
+
const ranges = await Promise.all(toInsightsEventRanges(input.filter).map((where) => listInsightsEventRange(crud, input, where)));
|
|
792
|
+
if (ranges.length === 1) return ranges[0];
|
|
793
|
+
return ranges.flat().sort((left, right) => right.received_at_ms - left.received_at_ms || require_insightsContract.compareInsightsText(right.id, left.id)).slice(0, input.limit);
|
|
726
794
|
},
|
|
727
|
-
async
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
model: "bundle_events",
|
|
795
|
+
async findInstallations(input) {
|
|
796
|
+
if ("installId" in input) {
|
|
797
|
+
const row = await crud.findOne({
|
|
798
|
+
model: "bundle_installations",
|
|
732
799
|
where: [{
|
|
800
|
+
field: "install_id",
|
|
801
|
+
value: input.installId
|
|
802
|
+
}]
|
|
803
|
+
});
|
|
804
|
+
return row === null ? [] : [row];
|
|
805
|
+
}
|
|
806
|
+
return crud.findMany({
|
|
807
|
+
model: "bundle_installations",
|
|
808
|
+
where: [{
|
|
809
|
+
field: "user_id",
|
|
810
|
+
value: input.userId
|
|
811
|
+
}, ...input.afterInstallId === void 0 ? [] : [{
|
|
812
|
+
field: "install_id",
|
|
813
|
+
operator: "gt",
|
|
814
|
+
value: input.afterInstallId
|
|
815
|
+
}]],
|
|
816
|
+
orderBy: [{
|
|
817
|
+
field: "install_id",
|
|
818
|
+
direction: "asc"
|
|
819
|
+
}],
|
|
820
|
+
limit: input.limit,
|
|
821
|
+
offset: 0
|
|
822
|
+
});
|
|
823
|
+
},
|
|
824
|
+
countInstallations(input) {
|
|
825
|
+
return crud.count({
|
|
826
|
+
model: "bundle_installations",
|
|
827
|
+
where: [
|
|
828
|
+
{
|
|
829
|
+
field: "platform",
|
|
830
|
+
value: input.platform
|
|
831
|
+
},
|
|
832
|
+
{
|
|
833
|
+
field: "channel",
|
|
834
|
+
value: input.channel
|
|
835
|
+
},
|
|
836
|
+
{
|
|
837
|
+
field: "received_at_ms",
|
|
838
|
+
operator: "gte",
|
|
839
|
+
value: input.sinceMs
|
|
840
|
+
},
|
|
841
|
+
...input.bundleId === void 0 ? [] : [{
|
|
842
|
+
field: "to_bundle_id",
|
|
843
|
+
value: input.bundleId
|
|
844
|
+
}]
|
|
845
|
+
]
|
|
846
|
+
});
|
|
847
|
+
},
|
|
848
|
+
countEvents(input) {
|
|
849
|
+
return crud.count({
|
|
850
|
+
model: "bundle_events",
|
|
851
|
+
where: [
|
|
852
|
+
...toInsightsBundleWhere(input.filter),
|
|
853
|
+
{
|
|
854
|
+
field: "received_at_ms",
|
|
855
|
+
operator: "gte",
|
|
856
|
+
value: input.sinceMs
|
|
857
|
+
},
|
|
858
|
+
{
|
|
733
859
|
field: "received_at_ms",
|
|
734
860
|
operator: "lt",
|
|
735
861
|
value: input.beforeReceivedAtMs
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
direction: "asc"
|
|
740
|
-
}, {
|
|
741
|
-
field: "id",
|
|
742
|
-
direction: "asc"
|
|
743
|
-
}],
|
|
744
|
-
limit: PAGE_SIZE,
|
|
745
|
-
offset
|
|
746
|
-
});
|
|
747
|
-
rows.push(...page.filter((row) => input.after === void 0 || row.received_at_ms > input.after.receivedAtMs || row.received_at_ms === input.after.receivedAtMs && row.id > input.after.id));
|
|
748
|
-
if (page.length < PAGE_SIZE) break;
|
|
749
|
-
}
|
|
750
|
-
return rows.slice(0, input.limit);
|
|
862
|
+
}
|
|
863
|
+
]
|
|
864
|
+
});
|
|
751
865
|
}
|
|
752
866
|
},
|
|
753
867
|
apiKeys: {
|
|
@@ -791,9 +905,16 @@ const createDatabasePluginAdapter = (name, implementation) => {
|
|
|
791
905
|
...implementation.dispose ? { dispose: implementation.dispose } : {}
|
|
792
906
|
};
|
|
793
907
|
};
|
|
794
|
-
const createDatabasePlugin = (options) => ({
|
|
908
|
+
const createDatabasePlugin = (options) => ({
|
|
909
|
+
...options,
|
|
910
|
+
models: {
|
|
911
|
+
...options.models,
|
|
912
|
+
insights: require_insightsContract.createValidatedInsightsModel(options.models.insights)
|
|
913
|
+
}
|
|
914
|
+
});
|
|
795
915
|
//#endregion
|
|
796
916
|
exports.DatabaseAtomicCommitUnsupportedError = DatabaseAtomicCommitUnsupportedError;
|
|
917
|
+
exports.DatabasePluginInputError = require_databasePluginCrudValidationErrors.DatabasePluginInputError;
|
|
797
918
|
exports.DatabaseRowReferencedError = DatabaseRowReferencedError;
|
|
798
919
|
exports.createDatabasePlugin = createDatabasePlugin;
|
|
799
920
|
exports.createDatabasePluginAdapter = createDatabasePluginAdapter;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DatabasePlugin } from "./types/databasePlugin.cjs";
|
|
2
2
|
import { DatabasePluginImplementation } from "./types/databaseOperations.cjs";
|
|
3
|
+
import "./types/internal.cjs";
|
|
3
4
|
import { DatabasePluginInputError, DatabasePluginInputErrorCode } from "./databasePluginCrudValidationErrors.cjs";
|
|
5
|
+
import "./databasePluginCrud.cjs";
|
|
4
6
|
//#region src/createDatabasePlugin.d.ts
|
|
5
7
|
declare class DatabaseAtomicCommitUnsupportedError extends Error {
|
|
6
8
|
readonly pluginName: string;
|
|
@@ -23,4 +25,4 @@ type DatabasePluginAdapter = Omit<DatabasePlugin, "name">;
|
|
|
23
25
|
declare const createDatabasePluginAdapter: (name: string, implementation: DatabasePluginImplementation) => DatabasePluginAdapter;
|
|
24
26
|
declare const createDatabasePlugin: (options: CreateDatabasePluginOptions) => DatabasePlugin;
|
|
25
27
|
//#endregion
|
|
26
|
-
export { CreateDatabasePluginOptions, DatabaseAtomicCommitUnsupportedError, DatabasePluginAdapter, DatabaseRowReferencedError, createDatabasePlugin, createDatabasePluginAdapter };
|
|
28
|
+
export { CreateDatabasePluginOptions, DatabaseAtomicCommitUnsupportedError, DatabasePluginAdapter, DatabasePluginInputError, type DatabasePluginInputErrorCode, DatabaseRowReferencedError, createDatabasePlugin, createDatabasePluginAdapter };
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { DatabasePlugin } from "./types/databasePlugin.mjs";
|
|
2
2
|
import { DatabasePluginImplementation } from "./types/databaseOperations.mjs";
|
|
3
|
+
import "./types/internal.mjs";
|
|
3
4
|
import { DatabasePluginInputError, DatabasePluginInputErrorCode } from "./databasePluginCrudValidationErrors.mjs";
|
|
5
|
+
import "./databasePluginCrud.mjs";
|
|
4
6
|
//#region src/createDatabasePlugin.d.ts
|
|
5
7
|
declare class DatabaseAtomicCommitUnsupportedError extends Error {
|
|
6
8
|
readonly pluginName: string;
|
|
@@ -23,4 +25,4 @@ type DatabasePluginAdapter = Omit<DatabasePlugin, "name">;
|
|
|
23
25
|
declare const createDatabasePluginAdapter: (name: string, implementation: DatabasePluginImplementation) => DatabasePluginAdapter;
|
|
24
26
|
declare const createDatabasePlugin: (options: CreateDatabasePluginOptions) => DatabasePlugin;
|
|
25
27
|
//#endregion
|
|
26
|
-
export { CreateDatabasePluginOptions, DatabaseAtomicCommitUnsupportedError, DatabasePluginAdapter, DatabaseRowReferencedError, createDatabasePlugin, createDatabasePluginAdapter };
|
|
28
|
+
export { CreateDatabasePluginOptions, DatabaseAtomicCommitUnsupportedError, DatabasePluginAdapter, DatabasePluginInputError, type DatabasePluginInputErrorCode, DatabaseRowReferencedError, createDatabasePlugin, createDatabasePluginAdapter };
|