nomkit 0.0.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.
Files changed (82) hide show
  1. package/LICENSE.txt +21 -0
  2. package/dist/_virtual/_rolldown/runtime.js +27 -0
  3. package/dist/adapters/index.d.ts +15 -0
  4. package/dist/adapters/index.js +6 -0
  5. package/dist/cli/commands/push.d.ts +6 -0
  6. package/dist/cli/commands/push.js +143 -0
  7. package/dist/cli/index.d.ts +4 -0
  8. package/dist/cli/index.js +18 -0
  9. package/dist/cli/lib/collection_sync.d.ts +107 -0
  10. package/dist/cli/lib/collection_sync.js +158 -0
  11. package/dist/cli/lib/config_loader.d.ts +15 -0
  12. package/dist/cli/lib/config_loader.js +43 -0
  13. package/dist/cli/lib/hash.d.ts +22 -0
  14. package/dist/cli/lib/hash.js +63 -0
  15. package/dist/cli/lib/migrations.d.ts +6 -0
  16. package/dist/cli/lib/migrations.js +17 -0
  17. package/dist/client/index.d.ts +13 -0
  18. package/dist/client/index.js +34 -0
  19. package/dist/core/nomba_api/banks.d.ts +14 -0
  20. package/dist/core/nomba_api/banks.js +0 -0
  21. package/dist/core/nomba_api/charge-tokenized-card.d.ts +33 -0
  22. package/dist/core/nomba_api/charge-tokenized-card.js +0 -0
  23. package/dist/core/nomba_api/checkout.d.ts +44 -0
  24. package/dist/core/nomba_api/checkout.js +0 -0
  25. package/dist/core/nomba_api/get_checkout.d.ts +57 -0
  26. package/dist/core/nomba_api/get_checkout.js +0 -0
  27. package/dist/core/nomba_api/index.d.ts +313 -0
  28. package/dist/core/nomba_api/index.js +179 -0
  29. package/dist/core/nomba_api/lib/utils.d.ts +235 -0
  30. package/dist/core/nomba_api/lib/utils.js +313 -0
  31. package/dist/core/nomba_api/list-tokenized-cards.d.ts +24 -0
  32. package/dist/core/nomba_api/list-tokenized-cards.js +0 -0
  33. package/dist/core/nomba_api/token-manager/index.d.ts +51 -0
  34. package/dist/core/nomba_api/token-manager/index.js +109 -0
  35. package/dist/core/pg_db/index.d.ts +108 -0
  36. package/dist/core/pg_db/index.js +76 -0
  37. package/dist/core/pg_db/migrations/20260703085901_wealthy_blacklash/migration.sql +120 -0
  38. package/dist/core/pg_db/migrations/20260703085901_wealthy_blacklash/snapshot.json +1616 -0
  39. package/dist/core/pg_db/relations.d.ts +46 -0
  40. package/dist/core/pg_db/relations.js +83 -0
  41. package/dist/core/pg_db/schema.d.ts +1138 -0
  42. package/dist/core/pg_db/schema.js +124 -0
  43. package/dist/endpoints/customers/api.js +51 -0
  44. package/dist/endpoints/entitlements/api.js +42 -0
  45. package/dist/endpoints/routes.d.ts +15 -0
  46. package/dist/endpoints/routes.js +15 -0
  47. package/dist/endpoints/subscriptions/api.js +263 -0
  48. package/dist/endpoints/subscriptions/utils.js +105 -0
  49. package/dist/endpoints/webhooks/invoice/api.js +28 -0
  50. package/dist/endpoints/webhooks/nomba/api.js +76 -0
  51. package/dist/endpoints/webhooks/nomba/utils.js +36 -0
  52. package/dist/index.d.ts +204 -0
  53. package/dist/index.js +175 -0
  54. package/dist/lib/utils.d.ts +21 -0
  55. package/dist/lib/utils.js +41 -0
  56. package/dist/node_modules/.pnpm/@better-fetch_fetch@1.3.1/node_modules/@better-fetch/fetch/dist/index.js +475 -0
  57. package/dist/package.js +4 -0
  58. package/dist/queue/backends/pglite/backend.d.ts +43 -0
  59. package/dist/queue/backends/pglite/backend.js +33 -0
  60. package/dist/queue/backends/pglite/index.d.ts +4 -0
  61. package/dist/queue/backends/pglite/index.js +4 -0
  62. package/dist/queue/backends/pglite/migrations/schema.d.ts +4 -0
  63. package/dist/queue/backends/pglite/migrations/schema.js +37 -0
  64. package/dist/queue/backends/pglite/notification-channel.d.ts +17 -0
  65. package/dist/queue/backends/pglite/notification-channel.js +61 -0
  66. package/dist/queue/backends/pglite/repository.d.ts +38 -0
  67. package/dist/queue/backends/pglite/repository.js +299 -0
  68. package/dist/queue/backends/redis/index.d.ts +7 -0
  69. package/dist/queue/backends/redis/index.js +1 -0
  70. package/dist/queue/client/index.d.ts +12 -0
  71. package/dist/queue/client/index.js +31 -0
  72. package/dist/queue/endpoints/api.d.ts +53 -0
  73. package/dist/queue/endpoints/api.js +45 -0
  74. package/dist/queue/endpoints/routes.d.ts +32 -0
  75. package/dist/queue/endpoints/routes.js +5 -0
  76. package/dist/queue/init.d.ts +27 -0
  77. package/dist/queue/init.js +31 -0
  78. package/dist/queue/lib/billing.d.ts +25 -0
  79. package/dist/queue/lib/billing.js +87 -0
  80. package/dist/queue/lib/utils.d.ts +30 -0
  81. package/dist/queue/lib/utils.js +35 -0
  82. package/package.json +71 -0
@@ -0,0 +1,87 @@
1
+ import { getInterval } from "./utils.js";
2
+ import ms from "ms";
3
+ import { Temporal } from "temporal-polyfill";
4
+ //#region queue/lib/billing.ts
5
+ var Workflow = class {
6
+ async step(cb) {
7
+ try {
8
+ return {
9
+ ok: true,
10
+ value: await cb()
11
+ };
12
+ } catch (error) {
13
+ return {
14
+ ok: false,
15
+ error
16
+ };
17
+ }
18
+ }
19
+ };
20
+ var Billing = class {
21
+ hasInit = false;
22
+ agenda;
23
+ nomkit;
24
+ ID = "billing";
25
+ wf = new Workflow();
26
+ constructor(args) {
27
+ this.agenda = args.agenda;
28
+ this.nomkit = args.nomkit;
29
+ if (!this.hasInit) {
30
+ this.agenda.define(this.ID, async (job) => {
31
+ const wf = this.wf;
32
+ const data = job.attrs.data;
33
+ const retryCount = data.retryCount ?? 0;
34
+ const retryPolicy = data.retryPolicy ?? [];
35
+ const now = Temporal.Now.instant();
36
+ if (retryCount === retryPolicy.length) {
37
+ await this.unsubscribe(data);
38
+ console.log("Job cancelled.");
39
+ return;
40
+ }
41
+ if (!(await wf.step(async () => {})).ok) {
42
+ const delay = retryPolicy[retryCount];
43
+ const delayMs = ms(delay);
44
+ const nextRunAt = now.add({ milliseconds: delayMs });
45
+ const nextRetryCount = retryCount + 1;
46
+ job.attrs.data = {
47
+ ...data,
48
+ retryCount: nextRetryCount
49
+ };
50
+ job.schedule(new Date(nextRunAt.epochMilliseconds));
51
+ await job.save();
52
+ return;
53
+ }
54
+ if (retryCount > 0) {
55
+ job.attrs.data = {
56
+ ...data,
57
+ retryCount: 0
58
+ };
59
+ await job.save();
60
+ }
61
+ console.log(`Billed customer at ${now.toLocaleString()};`);
62
+ });
63
+ this.hasInit = true;
64
+ }
65
+ }
66
+ async subscribe(args) {
67
+ if (!this.hasInit) throw new Error(`You have to call new Billing()`);
68
+ const { interval, startDate, endDate } = getInterval(args.interval);
69
+ await this.agenda.every(interval, this.ID, args, {
70
+ startDate,
71
+ endDate,
72
+ skipImmediate: args.skipImmediate
73
+ });
74
+ }
75
+ async unsubscribe(args) {
76
+ this.agenda.cancel({
77
+ name: this.ID,
78
+ data: {
79
+ id: args.id,
80
+ customerId: args.customerId,
81
+ productId: args.productId
82
+ }
83
+ });
84
+ }
85
+ };
86
+ //#endregion
87
+ export { Billing };
@@ -0,0 +1,30 @@
1
+ import { DefineMethod, InferRequired } from "../../lib/utils.js";
2
+ import { QueueContext } from "../init.js";
3
+ import { Endpoint, EndpointContext } from "better-call";
4
+ import ms from "ms";
5
+ import { z as z$1 } from "zod";
6
+
7
+ //#region queue/lib/utils.d.ts
8
+ declare function getInterval(value: ms.StringValue): {
9
+ startDate: string;
10
+ endDate: string;
11
+ milliseconds: number;
12
+ interval: string;
13
+ };
14
+ declare const queueMiddleware: import("better-call").Middleware<(inputContext: Record<string, any>) => Promise<QueueContext>>;
15
+ type BetterCallEndpointContext<TPath extends string, TSchema extends object | undefined, TRequireHeaders extends boolean = false, TRequireRequest extends boolean = false> = EndpointContext<TPath, "POST", TSchema, // request body schema
16
+ undefined, // query schema
17
+ [typeof queueMiddleware], // middleware array
18
+ TRequireHeaders, // require headers
19
+ TRequireRequest, // require request
20
+ {}, undefined>;
21
+ type QueueMethodContext<TPath extends string, TSchema extends object | undefined, TRequireHeaders extends boolean = false, TRequireRequest extends boolean = false, TContext extends QueueContext = QueueContext> = Omit<BetterCallEndpointContext<TPath, TSchema, TRequireHeaders, TRequireRequest>, "context" | "body"> & {
22
+ queue: TContext;
23
+ input: z$1.infer<TSchema>;
24
+ };
25
+ declare function defineQueueMethod<TSchema extends z$1.ZodType, TPath extends string, TArgs extends DefineMethod<TSchema, TPath>, TQueueContext extends QueueContext, TResponse = any>(args: TArgs, handler: (ctx: QueueMethodContext<TArgs["route"]["path"], TArgs["input"], InferRequired<TArgs["route"]["requireHeaders"]>, InferRequired<TArgs["route"]["requireRequest"]>, TQueueContext>) => Promise<TResponse>): Endpoint<TArgs["route"]["path"], "POST", z$1.infer<TArgs["input"]>, Record<string, any> | undefined, // query
26
+ [], TResponse, {
27
+ scope: "http";
28
+ }, undefined>;
29
+ //#endregion
30
+ export { defineQueueMethod, getInterval };
@@ -0,0 +1,35 @@
1
+ import { createEndpoint, createMiddleware } from "better-call";
2
+ import ms from "ms";
3
+ import { Temporal } from "temporal-polyfill";
4
+ import hd from "humanize-duration";
5
+ //#region queue/lib/utils.ts
6
+ function getInterval(value) {
7
+ const milliseconds = ms(value);
8
+ if (typeof milliseconds !== "number" || Number.isNaN(milliseconds)) throw new Error("You have an invalid interval");
9
+ if (milliseconds < 0) throw new Error("timestamp cannot include negative intervals");
10
+ const startDate = Temporal.Now.instant();
11
+ const endDate = startDate.add({ milliseconds });
12
+ return {
13
+ startDate: startDate.toString(),
14
+ endDate: endDate.toString(),
15
+ milliseconds,
16
+ interval: hd(milliseconds)
17
+ };
18
+ }
19
+ createMiddleware(async () => void 0);
20
+ function defineQueueMethod(args, handler) {
21
+ return createEndpoint(args.route.path, {
22
+ method: "POST",
23
+ body: args.input,
24
+ ...args.route.clientOnly === true && { metadata: { scope: "http" } }
25
+ }, async (ctx) => {
26
+ const { context = {}, body, ...baseCtx } = ctx;
27
+ return handler({
28
+ ...baseCtx,
29
+ queue: context,
30
+ input: body
31
+ });
32
+ });
33
+ }
34
+ //#endregion
35
+ export { defineQueueMethod, getInterval };
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "nomkit",
3
+ "description": "Nomkit is an embedded subscription billing framework that lets developers define products, pricing, and feature entitlements in code.",
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "bin": {
14
+ "nomkit": "./dist/cli/index.js"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./client": {
22
+ "types": "./dist/client/index.d.ts",
23
+ "default": "./dist/client/index.js"
24
+ },
25
+ "./queue": {
26
+ "types": "./dist/queue/init.d.ts",
27
+ "default": "./dist/queue/init.js"
28
+ },
29
+ "./backend-pglite": {
30
+ "types": "./dist/queue/backends/pglite/index.d.ts",
31
+ "default": "./dist/queue/backends/pglite/index.js"
32
+ },
33
+ "./backend-redis": {
34
+ "types": "./dist/queue/backends/redis/index.d.ts",
35
+ "default": "./dist/queue/backends/redis/index.js"
36
+ },
37
+ "./adapters": {
38
+ "types": "./dist/adapters/index.d.ts",
39
+ "default": "./dist/adapters/index.js"
40
+ }
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "dependencies": {
46
+ "@electric-sql/pglite": "^0.5.2",
47
+ "agenda": "^6.2.5",
48
+ "better-call": "^2.0.4",
49
+ "commander": "^15.0.0",
50
+ "dotenv": "^17.4.2",
51
+ "drizzle-orm": "^1.0.0-rc.4-5d5b77c",
52
+ "humanize-duration": "^3.33.2",
53
+ "jiti": "^2.7.0",
54
+ "ms": "^2.1.3",
55
+ "nanoid": "^5.1.15",
56
+ "ora": "^9.4.1",
57
+ "pg": "^8.21.0",
58
+ "temporal-polyfill": "^1.0.1",
59
+ "tsconfig-paths": "^4.2.0",
60
+ "zod": "^4.1.13"
61
+ },
62
+ "devDependencies": {
63
+ "@types/commander": "^2.12.5",
64
+ "tsdown": "^0.22.3"
65
+ },
66
+ "scripts": {
67
+ "nomkit:build": "bun tsdown",
68
+ "db:generate": "bun drizzle-kit generate --config=./core/pg_db/drizzle.config.ts",
69
+ "db:migrate": "bun drizzle-kit migrate --config=./core/pg_db/drizzle.config.ts"
70
+ }
71
+ }