@devvit/shared-types 0.12.2-next-2025-10-30-14-40-48-f40144719.0 → 0.12.2-next-2025-10-30-15-21-54-b1c02a24a.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devvit/shared-types",
|
|
3
|
-
"version": "0.12.2-next-2025-10-30-
|
|
3
|
+
"version": "0.12.2-next-2025-10-30-15-21-54-b1c02a24a.0",
|
|
4
4
|
"license": "BSD-3-Clause",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
},
|
|
34
34
|
"types": "./dist/index.d.ts",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@devvit/protos": "0.12.2-next-2025-10-30-
|
|
36
|
+
"@devvit/protos": "0.12.2-next-2025-10-30-15-21-54-b1c02a24a.0",
|
|
37
37
|
"jsonschema": "1.4.1",
|
|
38
38
|
"uuid": "9.0.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@devvit/repo-tools": "0.12.2-next-2025-10-30-
|
|
42
|
-
"@devvit/tsconfig": "0.12.2-next-2025-10-30-
|
|
41
|
+
"@devvit/repo-tools": "0.12.2-next-2025-10-30-15-21-54-b1c02a24a.0",
|
|
42
|
+
"@devvit/tsconfig": "0.12.2-next-2025-10-30-15-21-54-b1c02a24a.0",
|
|
43
43
|
"@types/redis-mock": "0.17.1",
|
|
44
44
|
"@types/uuid": "9.0.0",
|
|
45
45
|
"chokidar-cli": "3.0.0",
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
"vitest": "1.6.1"
|
|
52
52
|
},
|
|
53
53
|
"source": "./src/index.ts",
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "ecde8ca9bb5f2ff761d7917bbcf3740e8e8bde49"
|
|
55
55
|
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Scope } from '@devvit/protos';
|
|
6
6
|
import type { JsonObject, JsonValue } from '../json.js';
|
|
7
|
+
import type { Product } from '../payments/Product.js';
|
|
7
8
|
/**
|
|
8
9
|
* devvit.json with defaults. See config-file.v1.json schema. Schema is assumed
|
|
9
10
|
* to be v1.
|
|
@@ -21,6 +22,7 @@ export type AppConfig = {
|
|
|
21
22
|
blocks?: AppBlocksConfig;
|
|
22
23
|
dev?: AppDevConfig;
|
|
23
24
|
menu?: AppMenuConfig;
|
|
25
|
+
payments?: AppPaymentsConfig;
|
|
24
26
|
scheduler?: AppSchedulerConfig;
|
|
25
27
|
settings?: AppSettingsConfig;
|
|
26
28
|
forms?: AppFormsConfig;
|
|
@@ -109,6 +111,13 @@ export type AppMenuItemConfig = {
|
|
|
109
111
|
export type AppMenuConfig = {
|
|
110
112
|
items: AppMenuItemConfig[];
|
|
111
113
|
};
|
|
114
|
+
export type AppPaymentsConfig = {
|
|
115
|
+
products: Product[];
|
|
116
|
+
endpoints: {
|
|
117
|
+
fulfillOrder: string;
|
|
118
|
+
refundOrder?: string;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
112
121
|
export type AppFormsConfig = {
|
|
113
122
|
[formName: string]: string;
|
|
114
123
|
};
|
|
@@ -210,6 +219,7 @@ export type AppConfigJson = {
|
|
|
210
219
|
triggers?: AppTriggersConfig;
|
|
211
220
|
blocks?: AppBlocksConfigJson;
|
|
212
221
|
menu?: AppMenuConfigJson;
|
|
222
|
+
payments?: AppPaymentsConfigJson;
|
|
213
223
|
forms?: AppFormsConfigJson;
|
|
214
224
|
dev?: {
|
|
215
225
|
subreddit?: string;
|
|
@@ -235,6 +245,16 @@ export type AppMenuConfigJson = {
|
|
|
235
245
|
postFilter: AppMenuPostFilterConfig;
|
|
236
246
|
}[];
|
|
237
247
|
};
|
|
248
|
+
export type AppPaymentsConfigJson = {
|
|
249
|
+
endpoints: {
|
|
250
|
+
fulfillOrder: string;
|
|
251
|
+
refundOrder?: string;
|
|
252
|
+
};
|
|
253
|
+
} & ({
|
|
254
|
+
products: Product[];
|
|
255
|
+
} | {
|
|
256
|
+
productsFile: string;
|
|
257
|
+
});
|
|
238
258
|
export type AppPermissionConfigJson = {
|
|
239
259
|
http?: {
|
|
240
260
|
enable?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-file.v1.d.ts","sourceRoot":"","sources":["../../src/schemas/config-file.v1.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"config-file.v1.d.ts","sourceRoot":"","sources":["../../src/schemas/config-file.v1.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
* Warning: this file is not isomorphic. Do not functionally import this file
|
|
3
3
|
* from client code.
|
|
4
4
|
*/
|
|
5
|
+
import { readFileSync } from 'node:fs';
|
|
5
6
|
import { Scope, scopeFromJSON } from '@devvit/protos';
|
|
6
|
-
import jsonschema from 'jsonschema/lib/index.js';
|
|
7
|
+
import jsonschema, {} from 'jsonschema/lib/index.js';
|
|
7
8
|
import schema from './config-file.v1.json' with { type: 'json' };
|
|
8
9
|
import { defaultPostEntry, UNINITIALIZED_APP_NAME } from './constants.js';
|
|
10
|
+
import productsSchema from './products.json' with { type: 'json' };
|
|
11
|
+
import { validateProductsJSON } from './productsSchemaJSONValidator.js';
|
|
9
12
|
export function parseAppConfig(str, allowUninitializedConfig) {
|
|
10
13
|
if (!str)
|
|
11
14
|
throw Error('config is empty');
|
|
@@ -19,7 +22,7 @@ export function parseAppConfig(str, allowUninitializedConfig) {
|
|
|
19
22
|
return parseAppConfigJson(json, allowUninitializedConfig);
|
|
20
23
|
}
|
|
21
24
|
export function parseAppConfigJson(json, allowUninitializedConfig) {
|
|
22
|
-
const
|
|
25
|
+
const uninitializedSchema = {
|
|
23
26
|
...schema,
|
|
24
27
|
properties: {
|
|
25
28
|
...schema.properties,
|
|
@@ -29,11 +32,17 @@ export function parseAppConfigJson(json, allowUninitializedConfig) {
|
|
|
29
32
|
},
|
|
30
33
|
},
|
|
31
34
|
};
|
|
32
|
-
const
|
|
35
|
+
const devvitSchema = (allowUninitializedConfig
|
|
36
|
+
? uninitializedSchema
|
|
37
|
+
: schema);
|
|
38
|
+
const validator = new jsonschema.Validator();
|
|
39
|
+
validator.addSchema(devvitSchema, schema.$id);
|
|
40
|
+
validator.addSchema(productsSchema, productsSchema.$id);
|
|
41
|
+
const ret = validator.validate(json, devvitSchema);
|
|
33
42
|
if (!ret.valid)
|
|
34
43
|
throw new Error(ret.errors
|
|
35
44
|
.map((err) => {
|
|
36
|
-
if (!err.path.length && err.name === 'anyOf' && /\[subschema \d
|
|
45
|
+
if (!err.path.length && err.name === 'anyOf' && /\[subschema \d]/.test(err.stack))
|
|
37
46
|
return 'config requires property "post", "server", or "blocks".';
|
|
38
47
|
if (err.stack.includes('name does not match pattern'))
|
|
39
48
|
return err.stack
|
|
@@ -93,6 +102,8 @@ function AppConfig(json) {
|
|
|
93
102
|
: false;
|
|
94
103
|
if (json.menu || blocksMenu)
|
|
95
104
|
partial.menu = AppMenuConfig(json.menu);
|
|
105
|
+
if (json.payments)
|
|
106
|
+
partial.payments = AppPaymentsConfig(json.payments);
|
|
96
107
|
if (json.scheduler)
|
|
97
108
|
partial.scheduler = AppSchedulerConfig(json.scheduler);
|
|
98
109
|
const blocksSettings = json.blocks
|
|
@@ -219,6 +230,46 @@ function AppMenuConfig(menu) {
|
|
|
219
230
|
}
|
|
220
231
|
return { items };
|
|
221
232
|
}
|
|
233
|
+
function AppPaymentsConfig(payments) {
|
|
234
|
+
if (!payments) {
|
|
235
|
+
throw Error(`Invalid false-y payments config`);
|
|
236
|
+
}
|
|
237
|
+
if (!payments.endpoints?.fulfillOrder) {
|
|
238
|
+
throw Error(`Order fulfillment endpoint is required`);
|
|
239
|
+
}
|
|
240
|
+
const rawProducts = 'products' in payments ? [...payments.products] : [];
|
|
241
|
+
if ('productsFile' in payments) {
|
|
242
|
+
const fileContents = readFileSync(payments.productsFile).toString();
|
|
243
|
+
rawProducts.push(...validateProductsJSON(JSON.parse(fileContents)));
|
|
244
|
+
}
|
|
245
|
+
console.log(`Loaded ${rawProducts.length} products from payments config.`);
|
|
246
|
+
const products = [];
|
|
247
|
+
for (const rawProduct of rawProducts) {
|
|
248
|
+
const product = {
|
|
249
|
+
accountingType: rawProduct.accountingType,
|
|
250
|
+
displayName: rawProduct.displayName,
|
|
251
|
+
price: rawProduct.price,
|
|
252
|
+
sku: rawProduct.sku,
|
|
253
|
+
};
|
|
254
|
+
if (rawProduct.metadata) {
|
|
255
|
+
// Shallow copy to make sure any further mutations don't affect the config.
|
|
256
|
+
product.metadata = {
|
|
257
|
+
...rawProduct.metadata,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
if (rawProduct.images) {
|
|
261
|
+
product.images = rawProduct.images;
|
|
262
|
+
}
|
|
263
|
+
if (rawProduct.description) {
|
|
264
|
+
product.description = rawProduct.description;
|
|
265
|
+
}
|
|
266
|
+
products.push(product);
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
endpoints: payments.endpoints,
|
|
270
|
+
products,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
222
273
|
function AppSettingsConfig(blocksSettings, settings) {
|
|
223
274
|
const config = {};
|
|
224
275
|
if (settings?.global || blocksSettings) {
|
|
@@ -179,8 +179,8 @@
|
|
|
179
179
|
"items": {
|
|
180
180
|
"type": "object",
|
|
181
181
|
"description": "An option for a select-type setting.",
|
|
182
|
-
"additionalProperties": false,
|
|
183
182
|
"required": ["label", "value"],
|
|
183
|
+
"additionalProperties": false,
|
|
184
184
|
"properties": {
|
|
185
185
|
"label": {
|
|
186
186
|
"type": "string",
|
|
@@ -226,8 +226,8 @@
|
|
|
226
226
|
"items": {
|
|
227
227
|
"type": "object",
|
|
228
228
|
"description": "An option for a select-type setting.",
|
|
229
|
-
"additionalProperties": false,
|
|
230
229
|
"required": ["label", "value"],
|
|
230
|
+
"additionalProperties": false,
|
|
231
231
|
"properties": {
|
|
232
232
|
"label": {
|
|
233
233
|
"type": "string",
|
|
@@ -437,8 +437,8 @@
|
|
|
437
437
|
"entrypoints": {
|
|
438
438
|
"type": "object",
|
|
439
439
|
"description": "Map of named entrypoints for post rendering.",
|
|
440
|
-
"additionalProperties": false,
|
|
441
440
|
"required": ["default"],
|
|
441
|
+
"additionalProperties": false,
|
|
442
442
|
"properties": {
|
|
443
443
|
"default": {
|
|
444
444
|
"$ref": "#/$defs/Entrypoint",
|
|
@@ -578,8 +578,8 @@
|
|
|
578
578
|
"menu": {
|
|
579
579
|
"type": "object",
|
|
580
580
|
"description": "Menu configuration for the app.",
|
|
581
|
-
"additionalProperties": false,
|
|
582
581
|
"required": ["items"],
|
|
582
|
+
"additionalProperties": false,
|
|
583
583
|
"properties": {
|
|
584
584
|
"items": {
|
|
585
585
|
"type": "array",
|
|
@@ -627,6 +627,32 @@
|
|
|
627
627
|
}
|
|
628
628
|
},
|
|
629
629
|
|
|
630
|
+
"payments": {
|
|
631
|
+
"allOf": [{
|
|
632
|
+
"$ref": "https://developers.reddit.com/schema/products.json"
|
|
633
|
+
}, {
|
|
634
|
+
"required": ["endpoints"],
|
|
635
|
+
"oneOf": [{
|
|
636
|
+
"required": ["products"]
|
|
637
|
+
}, {
|
|
638
|
+
"required": ["productsFile"]
|
|
639
|
+
}],
|
|
640
|
+
"properties": {
|
|
641
|
+
"endpoints": {
|
|
642
|
+
"type": "object",
|
|
643
|
+
"description": "Internal endpoints for handling various payments-related actions",
|
|
644
|
+
"required": ["fulfillOrder"],
|
|
645
|
+
"additionalProperties": false,
|
|
646
|
+
"properties": {
|
|
647
|
+
"fulfillOrder": { "$ref": "#/$defs/InternalEndpoint" },
|
|
648
|
+
"refundOrder": { "$ref": "#/$defs/InternalEndpoint" }
|
|
649
|
+
}
|
|
650
|
+
},
|
|
651
|
+
"productsFile": { "$ref": "#/$defs/Path" }
|
|
652
|
+
}
|
|
653
|
+
}]
|
|
654
|
+
},
|
|
655
|
+
|
|
630
656
|
"forms": {
|
|
631
657
|
"type": "object",
|
|
632
658
|
"description": "Key-value pairs mapping form identifiers to their submit URLs.",
|
|
@@ -654,8 +680,8 @@
|
|
|
654
680
|
"scheduler": {
|
|
655
681
|
"type": "object",
|
|
656
682
|
"description": "Scheduler config.",
|
|
657
|
-
"additionalProperties": false,
|
|
658
683
|
"required": ["tasks"],
|
|
684
|
+
"additionalProperties": false,
|
|
659
685
|
"properties": {
|
|
660
686
|
"tasks": {
|
|
661
687
|
"type": "object",
|
|
@@ -731,8 +757,8 @@
|
|
|
731
757
|
"marketingAssets": {
|
|
732
758
|
"type": "object",
|
|
733
759
|
"description": "Marketing assets config.",
|
|
734
|
-
"additionalProperties": false,
|
|
735
760
|
"required": ["icon"],
|
|
761
|
+
"additionalProperties": false,
|
|
736
762
|
"properties": {
|
|
737
763
|
"icon": {
|
|
738
764
|
"type": "string",
|
package/schemas/products.json
CHANGED
|
@@ -9,10 +9,16 @@
|
|
|
9
9
|
"type": "array",
|
|
10
10
|
"items": {
|
|
11
11
|
"type": "object",
|
|
12
|
+
"required": [
|
|
13
|
+
"sku",
|
|
14
|
+
"displayName",
|
|
15
|
+
"price",
|
|
16
|
+
"accountingType"
|
|
17
|
+
],
|
|
12
18
|
"additionalProperties": false,
|
|
13
19
|
"properties": {
|
|
14
20
|
"sku": {
|
|
15
|
-
"description": "The product
|
|
21
|
+
"description": "The product SKU used as a unique identifier",
|
|
16
22
|
"maxLength": 50,
|
|
17
23
|
"type": "string",
|
|
18
24
|
"pattern": "^[A-z0-9-_]+$"
|
|
@@ -21,7 +27,7 @@
|
|
|
21
27
|
"description": "The product display name",
|
|
22
28
|
"maxLength": 50,
|
|
23
29
|
"type": "string",
|
|
24
|
-
"pattern": "
|
|
30
|
+
"pattern": ".+"
|
|
25
31
|
},
|
|
26
32
|
"description": {
|
|
27
33
|
"description": "The product description",
|
|
@@ -29,18 +35,21 @@
|
|
|
29
35
|
"maxLength": 250
|
|
30
36
|
},
|
|
31
37
|
"price": {
|
|
32
|
-
"description": "The price of the product (unit: Reddit Gold). See https://developers.reddit.com/docs/
|
|
33
|
-
"type": "integer",
|
|
38
|
+
"description": "The price of the product (unit: Reddit Gold). See https://developers.reddit.com/docs/earn-money/payments/payments_overview#how-to-get-paid for more information.",
|
|
34
39
|
"enum": [5, 25, 50, 100, 150, 250, 500, 1000, 2500]
|
|
35
40
|
},
|
|
36
41
|
"accountingType": {
|
|
37
42
|
"description": "The accounting type of the product",
|
|
38
|
-
"type": "string",
|
|
39
43
|
"enum": ["INSTANT", "DURABLE", "CONSUMABLE", "VALID_FOR_1D", "VALID_FOR_7D", "VALID_FOR_30D", "VALID_FOR_1Y"]
|
|
40
44
|
},
|
|
41
45
|
"images": {
|
|
42
46
|
"description": "The images associated with this product",
|
|
43
47
|
"type": "object",
|
|
48
|
+
"required": ["icon"],
|
|
49
|
+
"additionalProperties": false,
|
|
50
|
+
"examples": [{
|
|
51
|
+
"icon": "/assets/product-icon.png"
|
|
52
|
+
}],
|
|
44
53
|
"properties": {
|
|
45
54
|
"icon": {
|
|
46
55
|
"description": "The icon image URL (should be a path relative to /assets)",
|
|
@@ -51,12 +60,17 @@
|
|
|
51
60
|
"^.*$": {
|
|
52
61
|
"type": "string"
|
|
53
62
|
}
|
|
54
|
-
}
|
|
55
|
-
"additionalProperties": false,
|
|
56
|
-
"required": ["icon"]
|
|
63
|
+
}
|
|
57
64
|
},
|
|
58
65
|
"metadata": {
|
|
59
66
|
"description": "Additional metadata associated with this product",
|
|
67
|
+
"examples": [
|
|
68
|
+
{
|
|
69
|
+
"itemType": "weapon",
|
|
70
|
+
"durability": "30",
|
|
71
|
+
"rarity": "legendary"
|
|
72
|
+
}
|
|
73
|
+
],
|
|
60
74
|
"type": "object",
|
|
61
75
|
"maxProperties": 10,
|
|
62
76
|
"patternProperties": {
|
|
@@ -65,13 +79,7 @@
|
|
|
65
79
|
}
|
|
66
80
|
}
|
|
67
81
|
}
|
|
68
|
-
}
|
|
69
|
-
"required": [
|
|
70
|
-
"sku",
|
|
71
|
-
"displayName",
|
|
72
|
-
"price",
|
|
73
|
-
"accountingType"
|
|
74
|
-
]
|
|
82
|
+
}
|
|
75
83
|
}
|
|
76
84
|
}
|
|
77
85
|
}
|