@porulle/core 0.48.1 → 0.50.0
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/modules/audit/hooks.d.ts +0 -4
- package/dist/modules/audit/hooks.d.ts.map +1 -1
- package/dist/modules/audit/hooks.js +17 -0
- package/dist/modules/catalog/entity-service.d.ts +2 -0
- package/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +1 -1
- package/dist/modules/catalog/import-service.d.ts +108 -0
- package/dist/modules/catalog/import-service.d.ts.map +1 -0
- package/dist/modules/catalog/import-service.js +423 -0
- package/dist/modules/catalog/service.d.ts +8 -0
- package/dist/modules/catalog/service.d.ts.map +1 -1
- package/dist/modules/catalog/service.js +6 -0
- package/dist/modules/channels/catalog-schema.d.ts +130 -0
- package/dist/modules/channels/catalog-schema.d.ts.map +1 -0
- package/dist/modules/channels/catalog-schema.js +68 -0
- package/dist/modules/inventory/service.d.ts.map +1 -1
- package/dist/modules/inventory/service.js +13 -0
- package/dist/testing.d.ts +1 -0
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +3 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/index.ts +21 -0
- package/src/modules/audit/hooks.ts +18 -0
- package/src/modules/catalog/entity-service.ts +1 -1
- package/src/modules/catalog/import-service.ts +563 -0
- package/src/modules/catalog/service.ts +22 -0
- package/src/modules/channels/catalog-schema.ts +97 -0
- package/src/modules/inventory/service.ts +13 -0
- package/src/testing.ts +3 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { ChannelCatalogImage, ChannelCatalogItem, ChannelCatalogLocalizedAttributes, ChannelCatalogOptionType, ChannelCatalogPrice, ChannelCatalogVariant, ChannelInventoryLevel } from "./adapter.js";
|
|
3
|
+
export declare const channelCatalogLocalizedAttributesSchema: z.ZodObject<{
|
|
4
|
+
locale: z.ZodString;
|
|
5
|
+
title: z.ZodString;
|
|
6
|
+
subtitle: z.ZodExactOptional<z.ZodString>;
|
|
7
|
+
description: z.ZodExactOptional<z.ZodString>;
|
|
8
|
+
richDescription: z.ZodExactOptional<z.ZodUnknown>;
|
|
9
|
+
seoTitle: z.ZodExactOptional<z.ZodString>;
|
|
10
|
+
seoDescription: z.ZodExactOptional<z.ZodString>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export declare const channelCatalogImageSchema: z.ZodObject<{
|
|
13
|
+
externalId: z.ZodExactOptional<z.ZodString>;
|
|
14
|
+
url: z.ZodString;
|
|
15
|
+
alt: z.ZodExactOptional<z.ZodString>;
|
|
16
|
+
role: z.ZodEnum<{
|
|
17
|
+
document: "document";
|
|
18
|
+
video: "video";
|
|
19
|
+
primary: "primary";
|
|
20
|
+
gallery: "gallery";
|
|
21
|
+
thumbnail: "thumbnail";
|
|
22
|
+
}>;
|
|
23
|
+
sortOrder: z.ZodExactOptional<z.ZodNumber>;
|
|
24
|
+
variantExternalIds: z.ZodExactOptional<z.ZodArray<z.ZodString>>;
|
|
25
|
+
}, z.core.$strip>;
|
|
26
|
+
export declare const channelCatalogOptionTypeSchema: z.ZodObject<{
|
|
27
|
+
name: z.ZodString;
|
|
28
|
+
displayName: z.ZodString;
|
|
29
|
+
sortOrder: z.ZodExactOptional<z.ZodNumber>;
|
|
30
|
+
values: z.ZodArray<z.ZodObject<{
|
|
31
|
+
value: z.ZodString;
|
|
32
|
+
displayValue: z.ZodString;
|
|
33
|
+
sortOrder: z.ZodExactOptional<z.ZodNumber>;
|
|
34
|
+
}, z.core.$strip>>;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export declare const channelCatalogPriceSchema: z.ZodObject<{
|
|
37
|
+
currency: z.ZodString;
|
|
38
|
+
amount: z.ZodNumber;
|
|
39
|
+
compareAtAmount: z.ZodExactOptional<z.ZodNumber>;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
export declare const channelCatalogVariantSchema: z.ZodObject<{
|
|
42
|
+
externalId: z.ZodString;
|
|
43
|
+
sku: z.ZodExactOptional<z.ZodString>;
|
|
44
|
+
barcode: z.ZodExactOptional<z.ZodString>;
|
|
45
|
+
metadata: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
46
|
+
optionValues: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
47
|
+
prices: z.ZodExactOptional<z.ZodArray<z.ZodObject<{
|
|
48
|
+
currency: z.ZodString;
|
|
49
|
+
amount: z.ZodNumber;
|
|
50
|
+
compareAtAmount: z.ZodExactOptional<z.ZodNumber>;
|
|
51
|
+
}, z.core.$strip>>>;
|
|
52
|
+
}, z.core.$strip>;
|
|
53
|
+
export declare const channelCatalogItemSchema: z.ZodObject<{
|
|
54
|
+
externalId: z.ZodString;
|
|
55
|
+
slug: z.ZodString;
|
|
56
|
+
title: z.ZodString;
|
|
57
|
+
description: z.ZodExactOptional<z.ZodString>;
|
|
58
|
+
variants: z.ZodArray<z.ZodObject<{
|
|
59
|
+
externalId: z.ZodString;
|
|
60
|
+
sku: z.ZodExactOptional<z.ZodString>;
|
|
61
|
+
barcode: z.ZodExactOptional<z.ZodString>;
|
|
62
|
+
metadata: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
63
|
+
optionValues: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
64
|
+
prices: z.ZodExactOptional<z.ZodArray<z.ZodObject<{
|
|
65
|
+
currency: z.ZodString;
|
|
66
|
+
amount: z.ZodNumber;
|
|
67
|
+
compareAtAmount: z.ZodExactOptional<z.ZodNumber>;
|
|
68
|
+
}, z.core.$strip>>>;
|
|
69
|
+
}, z.core.$strip>>;
|
|
70
|
+
metadata: z.ZodExactOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
71
|
+
attributes: z.ZodExactOptional<z.ZodArray<z.ZodObject<{
|
|
72
|
+
locale: z.ZodString;
|
|
73
|
+
title: z.ZodString;
|
|
74
|
+
subtitle: z.ZodExactOptional<z.ZodString>;
|
|
75
|
+
description: z.ZodExactOptional<z.ZodString>;
|
|
76
|
+
richDescription: z.ZodExactOptional<z.ZodUnknown>;
|
|
77
|
+
seoTitle: z.ZodExactOptional<z.ZodString>;
|
|
78
|
+
seoDescription: z.ZodExactOptional<z.ZodString>;
|
|
79
|
+
}, z.core.$strip>>>;
|
|
80
|
+
images: z.ZodExactOptional<z.ZodArray<z.ZodObject<{
|
|
81
|
+
externalId: z.ZodExactOptional<z.ZodString>;
|
|
82
|
+
url: z.ZodString;
|
|
83
|
+
alt: z.ZodExactOptional<z.ZodString>;
|
|
84
|
+
role: z.ZodEnum<{
|
|
85
|
+
document: "document";
|
|
86
|
+
video: "video";
|
|
87
|
+
primary: "primary";
|
|
88
|
+
gallery: "gallery";
|
|
89
|
+
thumbnail: "thumbnail";
|
|
90
|
+
}>;
|
|
91
|
+
sortOrder: z.ZodExactOptional<z.ZodNumber>;
|
|
92
|
+
variantExternalIds: z.ZodExactOptional<z.ZodArray<z.ZodString>>;
|
|
93
|
+
}, z.core.$strip>>>;
|
|
94
|
+
options: z.ZodExactOptional<z.ZodArray<z.ZodObject<{
|
|
95
|
+
name: z.ZodString;
|
|
96
|
+
displayName: z.ZodString;
|
|
97
|
+
sortOrder: z.ZodExactOptional<z.ZodNumber>;
|
|
98
|
+
values: z.ZodArray<z.ZodObject<{
|
|
99
|
+
value: z.ZodString;
|
|
100
|
+
displayValue: z.ZodString;
|
|
101
|
+
sortOrder: z.ZodExactOptional<z.ZodNumber>;
|
|
102
|
+
}, z.core.$strip>>;
|
|
103
|
+
}, z.core.$strip>>>;
|
|
104
|
+
tags: z.ZodExactOptional<z.ZodArray<z.ZodString>>;
|
|
105
|
+
brand: z.ZodExactOptional<z.ZodString>;
|
|
106
|
+
categories: z.ZodExactOptional<z.ZodArray<z.ZodString>>;
|
|
107
|
+
status: z.ZodExactOptional<z.ZodEnum<{
|
|
108
|
+
active: "active";
|
|
109
|
+
draft: "draft";
|
|
110
|
+
archived: "archived";
|
|
111
|
+
discontinued: "discontinued";
|
|
112
|
+
}>>;
|
|
113
|
+
}, z.core.$strip>;
|
|
114
|
+
export declare const channelInventoryLevelSchema: z.ZodObject<{
|
|
115
|
+
externalId: z.ZodString;
|
|
116
|
+
available: z.ZodNumber;
|
|
117
|
+
}, z.core.$strip>;
|
|
118
|
+
type Equals<A, B> = (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false;
|
|
119
|
+
type Assert<T extends true> = T;
|
|
120
|
+
export type ChannelCatalogSchemaChecks = [
|
|
121
|
+
Assert<Equals<z.infer<typeof channelCatalogLocalizedAttributesSchema>, ChannelCatalogLocalizedAttributes>>,
|
|
122
|
+
Assert<Equals<z.infer<typeof channelCatalogImageSchema>, ChannelCatalogImage>>,
|
|
123
|
+
Assert<Equals<z.infer<typeof channelCatalogOptionTypeSchema>, ChannelCatalogOptionType>>,
|
|
124
|
+
Assert<Equals<z.infer<typeof channelCatalogPriceSchema>, ChannelCatalogPrice>>,
|
|
125
|
+
Assert<Equals<z.infer<typeof channelCatalogVariantSchema>, ChannelCatalogVariant>>,
|
|
126
|
+
Assert<Equals<z.infer<typeof channelCatalogItemSchema>, ChannelCatalogItem>>,
|
|
127
|
+
Assert<Equals<z.infer<typeof channelInventoryLevelSchema>, ChannelInventoryLevel>>
|
|
128
|
+
];
|
|
129
|
+
export {};
|
|
130
|
+
//# sourceMappingURL=catalog-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-schema.d.ts","sourceRoot":"","sources":["../../../src/modules/channels/catalog-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,iCAAiC,EACjC,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,cAAc,CAAC;AAWtB,eAAO,MAAM,uCAAuC;;;;;;;;iBAQlD,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;iBAOpC,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;;;;;;iBASzC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;iBAIpC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;iBAOtC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcnC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;iBAGtC,CAAC;AAEH,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AACzG,KAAK,MAAM,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;AAChC,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,uCAAuC,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAC1G,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC9E,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,EAAE,wBAAwB,CAAC,CAAC;IACxF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,EAAE,mBAAmB,CAAC,CAAC;IAC9E,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAClF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,EAAE,kBAAkB,CAAC,CAAC;IAC5E,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,EAAE,qBAAqB,CAAC,CAAC;CACnF,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* The parser for a catalog item that crossed a trust boundary — a queue message, an R2 object, a
|
|
4
|
+
* JSON fixture. Import this rather than re-declaring a subset: a consumer's hand-written schema that
|
|
5
|
+
* kept only the fields it knew about once converged 96 products with no options, prices or
|
|
6
|
+
* inventory, and a reconcile then "re-converged" all of them. The `Equals` checks at the bottom make
|
|
7
|
+
* this schema fail to compile the day it and the interfaces disagree.
|
|
8
|
+
*/
|
|
9
|
+
const record = z.record(z.string(), z.unknown());
|
|
10
|
+
export const channelCatalogLocalizedAttributesSchema = z.object({
|
|
11
|
+
locale: z.string(),
|
|
12
|
+
title: z.string(),
|
|
13
|
+
subtitle: z.string().exactOptional(),
|
|
14
|
+
description: z.string().exactOptional(),
|
|
15
|
+
richDescription: z.unknown().exactOptional(),
|
|
16
|
+
seoTitle: z.string().exactOptional(),
|
|
17
|
+
seoDescription: z.string().exactOptional(),
|
|
18
|
+
});
|
|
19
|
+
export const channelCatalogImageSchema = z.object({
|
|
20
|
+
externalId: z.string().exactOptional(),
|
|
21
|
+
url: z.string(),
|
|
22
|
+
alt: z.string().exactOptional(),
|
|
23
|
+
role: z.enum(["primary", "gallery", "thumbnail", "video", "document"]),
|
|
24
|
+
sortOrder: z.number().exactOptional(),
|
|
25
|
+
variantExternalIds: z.array(z.string()).exactOptional(),
|
|
26
|
+
});
|
|
27
|
+
export const channelCatalogOptionTypeSchema = z.object({
|
|
28
|
+
name: z.string(),
|
|
29
|
+
displayName: z.string(),
|
|
30
|
+
sortOrder: z.number().exactOptional(),
|
|
31
|
+
values: z.array(z.object({
|
|
32
|
+
value: z.string(),
|
|
33
|
+
displayValue: z.string(),
|
|
34
|
+
sortOrder: z.number().exactOptional(),
|
|
35
|
+
})),
|
|
36
|
+
});
|
|
37
|
+
export const channelCatalogPriceSchema = z.object({
|
|
38
|
+
currency: z.string(),
|
|
39
|
+
amount: z.number(),
|
|
40
|
+
compareAtAmount: z.number().exactOptional(),
|
|
41
|
+
});
|
|
42
|
+
export const channelCatalogVariantSchema = z.object({
|
|
43
|
+
externalId: z.string(),
|
|
44
|
+
sku: z.string().exactOptional(),
|
|
45
|
+
barcode: z.string().exactOptional(),
|
|
46
|
+
metadata: record.exactOptional(),
|
|
47
|
+
optionValues: z.record(z.string(), z.string()).exactOptional(),
|
|
48
|
+
prices: z.array(channelCatalogPriceSchema).exactOptional(),
|
|
49
|
+
});
|
|
50
|
+
export const channelCatalogItemSchema = z.object({
|
|
51
|
+
externalId: z.string(),
|
|
52
|
+
slug: z.string(),
|
|
53
|
+
title: z.string(),
|
|
54
|
+
description: z.string().exactOptional(),
|
|
55
|
+
variants: z.array(channelCatalogVariantSchema),
|
|
56
|
+
metadata: record.exactOptional(),
|
|
57
|
+
attributes: z.array(channelCatalogLocalizedAttributesSchema).exactOptional(),
|
|
58
|
+
images: z.array(channelCatalogImageSchema).exactOptional(),
|
|
59
|
+
options: z.array(channelCatalogOptionTypeSchema).exactOptional(),
|
|
60
|
+
tags: z.array(z.string()).exactOptional(),
|
|
61
|
+
brand: z.string().exactOptional(),
|
|
62
|
+
categories: z.array(z.string()).exactOptional(),
|
|
63
|
+
status: z.enum(["draft", "active", "archived", "discontinued"]).exactOptional(),
|
|
64
|
+
});
|
|
65
|
+
export const channelInventoryLevelSchema = z.object({
|
|
66
|
+
externalId: z.string(),
|
|
67
|
+
available: z.number(),
|
|
68
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/inventory/service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/inventory/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -267,6 +267,19 @@ export class InventoryService {
|
|
|
267
267
|
const warehouseId = input.warehouseId ?? (await this.pickWarehouse(actor, ctx));
|
|
268
268
|
const orgId = resolveOrgIdForCommerce(actor ?? ctx?.actor ?? null, this.deps.config);
|
|
269
269
|
const existingLevel = await this.repo.findLevelByKey(orgId, input.entityId, warehouseId, input.variantId, ctx);
|
|
270
|
+
// Already at the quantity: nothing to record. A zero-delta adjust would still write a movement
|
|
271
|
+
// and fire `inventory.afterAdjust`, and a periodic reconcile then re-announces every level it
|
|
272
|
+
// walked — 1,243 of them on one sim reconcile, each one a downstream re-projection.
|
|
273
|
+
// The permission still gates it, so a caller without `inventory:adjust` is refused either way.
|
|
274
|
+
if (existingLevel && existingLevel.quantityOnHand === input.quantity) {
|
|
275
|
+
try {
|
|
276
|
+
assertPermission(actor ?? null, "inventory:adjust");
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
return Err(toCommerceError(error));
|
|
280
|
+
}
|
|
281
|
+
return Ok(existingLevel);
|
|
282
|
+
}
|
|
270
283
|
const currentOnHand = existingLevel?.quantityOnHand ?? 0;
|
|
271
284
|
const delta = input.quantity - currentOnHand;
|
|
272
285
|
// Delegate to adjust() so hooks, movements, and permission checks are consistent
|
package/dist/testing.d.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* tsx, esbuild, and other heavy dev-only deps into bundlers like Turbopack.
|
|
7
7
|
*/
|
|
8
8
|
export { createTestKernel } from "./test-utils/create-test-kernel.js";
|
|
9
|
+
export { createPGliteTestAdapter, type PGliteTestAdapter, type QueryLog } from "./test-utils/create-pglite-adapter.js";
|
|
9
10
|
export { createTestPluginContext } from "./test-utils/create-test-plugin-context.js";
|
|
10
11
|
export { createRepositoryTestHarness } from "./test-utils/create-repository-test-harness.js";
|
|
11
12
|
export { createPluginTestApp, type PluginTestApp, type TestAppEnv } from "./test-utils/create-plugin-test-app.js";
|
package/dist/testing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGtE,OAAO,EAAE,uBAAuB,EAAE,KAAK,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gDAAgD,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAClH,OAAO,EACL,WAAW,EACX,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAClE,WAAW,GACZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAQ1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMjE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,YAAY,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/testing.js
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
* tsx, esbuild, and other heavy dev-only deps into bundlers like Turbopack.
|
|
7
7
|
*/
|
|
8
8
|
export { createTestKernel } from "./test-utils/create-test-kernel.js";
|
|
9
|
+
// The query log is the only honest statement counter: the PGlite logger sees every statement core
|
|
10
|
+
// issues, which a proxy around a plugin's own handle cannot.
|
|
11
|
+
export { createPGliteTestAdapter } from "./test-utils/create-pglite-adapter.js";
|
|
9
12
|
export { createTestPluginContext } from "./test-utils/create-test-plugin-context.js";
|
|
10
13
|
export { createRepositoryTestHarness } from "./test-utils/create-repository-test-harness.js";
|
|
11
14
|
export { createPluginTestApp } from "./test-utils/create-plugin-test-app.js";
|