@fengsoft/saas-core 0.1.0 → 0.1.1

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.
@@ -0,0 +1,254 @@
1
+ export type WorkspaceRole = "owner" | "admin" | "member" | "viewer";
2
+ export type BillingStatus = "trial" | "active" | "past_due" | "canceled" | "suspended";
3
+ export type BillingInterval = "month" | "year";
4
+ export type InviteStatus = "pending" | "accepted" | "revoked" | "expired";
5
+ export type FeatureKey = string;
6
+ export type QuotaKey = string;
7
+ export type SubscriptionState = {
8
+ planKey: string;
9
+ status: BillingStatus;
10
+ interval?: BillingInterval | null;
11
+ currentPeriodStart?: Date | null;
12
+ currentPeriodEnd?: Date | null;
13
+ externalCustomerId?: string | null;
14
+ externalSubscriptionId?: string | null;
15
+ };
16
+ export type Workspace = {
17
+ id: string;
18
+ slug: string;
19
+ name: string;
20
+ createdAt: Date;
21
+ updatedAt: Date;
22
+ metadata: Record<string, string>;
23
+ featureOverrides: Record<FeatureKey, boolean>;
24
+ quotaOverrides: Partial<Record<QuotaKey, number>>;
25
+ subscription: SubscriptionState;
26
+ };
27
+ export type WorkspaceMember = {
28
+ workspaceId: string;
29
+ userId: string;
30
+ role: WorkspaceRole;
31
+ createdAt: Date;
32
+ updatedAt: Date;
33
+ };
34
+ export type WorkspaceInvite = {
35
+ id: string;
36
+ workspaceId: string;
37
+ email: string;
38
+ role: WorkspaceRole;
39
+ token: string;
40
+ invitedByUserId: string;
41
+ status: InviteStatus;
42
+ expiresAt: Date;
43
+ createdAt: Date;
44
+ updatedAt: Date;
45
+ acceptedAt?: Date | null;
46
+ acceptedByUserId?: string | null;
47
+ };
48
+ export type PlanDefinition = {
49
+ key: string;
50
+ features?: FeatureKey[];
51
+ quotas?: Partial<Record<QuotaKey, number>>;
52
+ };
53
+ export type ResolvedEntitlements = {
54
+ features: Set<FeatureKey>;
55
+ quotas: Map<QuotaKey, number>;
56
+ };
57
+ export type UsageRecord = {
58
+ workspaceId: string;
59
+ quotaKey: QuotaKey;
60
+ reserved: number;
61
+ consumed: number;
62
+ updatedAt: Date;
63
+ };
64
+ export type UsageMutationResult = UsageRecord & {
65
+ remaining: number | null;
66
+ };
67
+ export type StartCheckoutInput = {
68
+ workspaceId: string;
69
+ planKey: string;
70
+ interval: BillingInterval;
71
+ };
72
+ export type StartCheckoutResult = {
73
+ url: string;
74
+ externalReference?: string | null;
75
+ };
76
+ export interface BillingProviderPort {
77
+ startCheckout(input: StartCheckoutInput): Promise<StartCheckoutResult>;
78
+ openBillingPortal(workspaceId: string): Promise<{
79
+ url: string;
80
+ }>;
81
+ syncSubscriptionState(workspaceId: string): Promise<SubscriptionState>;
82
+ handleBillingWebhook(input: {
83
+ headers: Record<string, string>;
84
+ body: string;
85
+ }): Promise<SubscriptionState | null>;
86
+ }
87
+ export interface AuditPort {
88
+ record(event: {
89
+ action: string;
90
+ workspaceId?: string;
91
+ actorId?: string;
92
+ metadata?: Record<string, unknown>;
93
+ }): Promise<void>;
94
+ }
95
+ export interface NotificationPort {
96
+ send(input: {
97
+ workspaceId: string;
98
+ type: string;
99
+ target: string;
100
+ payload: Record<string, unknown>;
101
+ }): Promise<void>;
102
+ }
103
+ export interface QueuePort {
104
+ enqueue(input: {
105
+ job: string;
106
+ payload: Record<string, unknown>;
107
+ }): Promise<void>;
108
+ }
109
+ export interface CachePort {
110
+ get<T>(key: string): Promise<T | null>;
111
+ set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
112
+ delete(key: string): Promise<void>;
113
+ }
114
+ export interface EventBusPort {
115
+ publish(input: {
116
+ type: string;
117
+ payload: Record<string, unknown>;
118
+ }): Promise<void>;
119
+ }
120
+ export interface WorkspaceStore {
121
+ create(workspace: Workspace): Promise<void>;
122
+ getById(workspaceId: string): Promise<Workspace | null>;
123
+ getBySlug(slug: string): Promise<Workspace | null>;
124
+ update(workspace: Workspace): Promise<void>;
125
+ }
126
+ export interface MembershipStore {
127
+ put(member: WorkspaceMember): Promise<void>;
128
+ get(workspaceId: string, userId: string): Promise<WorkspaceMember | null>;
129
+ listByWorkspace(workspaceId: string): Promise<WorkspaceMember[]>;
130
+ }
131
+ export interface InviteStore {
132
+ create(invite: WorkspaceInvite): Promise<void>;
133
+ getById(inviteId: string): Promise<WorkspaceInvite | null>;
134
+ getByToken(token: string): Promise<WorkspaceInvite | null>;
135
+ update(invite: WorkspaceInvite): Promise<void>;
136
+ }
137
+ export interface UsageStore {
138
+ get(workspaceId: string, quotaKey: QuotaKey): Promise<UsageRecord | null>;
139
+ put(record: UsageRecord): Promise<void>;
140
+ }
141
+ export declare class SaaSCoreError extends Error {
142
+ constructor(message: string);
143
+ }
144
+ export declare class InMemoryWorkspaceStore implements WorkspaceStore {
145
+ #private;
146
+ create(workspace: Workspace): Promise<void>;
147
+ getById(workspaceId: string): Promise<Workspace | null>;
148
+ getBySlug(slug: string): Promise<Workspace | null>;
149
+ update(workspace: Workspace): Promise<void>;
150
+ }
151
+ export declare class InMemoryMembershipStore implements MembershipStore {
152
+ #private;
153
+ put(member: WorkspaceMember): Promise<void>;
154
+ get(workspaceId: string, userId: string): Promise<WorkspaceMember | null>;
155
+ listByWorkspace(workspaceId: string): Promise<WorkspaceMember[]>;
156
+ }
157
+ export declare class InMemoryInviteStore implements InviteStore {
158
+ #private;
159
+ create(invite: WorkspaceInvite): Promise<void>;
160
+ getById(inviteId: string): Promise<WorkspaceInvite | null>;
161
+ getByToken(token: string): Promise<WorkspaceInvite | null>;
162
+ update(invite: WorkspaceInvite): Promise<void>;
163
+ }
164
+ export declare class InMemoryUsageStore implements UsageStore {
165
+ #private;
166
+ get(workspaceId: string, quotaKey: QuotaKey): Promise<UsageRecord | null>;
167
+ put(record: UsageRecord): Promise<void>;
168
+ }
169
+ export declare class EntitlementService {
170
+ #private;
171
+ constructor(plans: PlanDefinition[]);
172
+ getResolvedEntitlements(workspace: Workspace): ResolvedEntitlements;
173
+ hasFeature(workspace: Workspace, featureKey: FeatureKey): boolean;
174
+ getQuota(workspace: Workspace, quotaKey: QuotaKey): number | null;
175
+ }
176
+ export declare class WorkspaceService {
177
+ #private;
178
+ constructor(options: {
179
+ workspaceStore: WorkspaceStore;
180
+ membershipStore: MembershipStore;
181
+ });
182
+ createWorkspace(input: {
183
+ name: string;
184
+ slug: string;
185
+ ownerUserId: string;
186
+ planKey: string;
187
+ metadata?: Record<string, string>;
188
+ subscriptionStatus?: BillingStatus;
189
+ }): Promise<{
190
+ workspace: Workspace;
191
+ ownerMembership: WorkspaceMember;
192
+ }>;
193
+ updateSubscriptionState(workspaceId: string, subscription: SubscriptionState): Promise<Workspace>;
194
+ getWorkspace(workspaceId: string): Promise<Workspace | null>;
195
+ }
196
+ export declare class MembershipService {
197
+ #private;
198
+ constructor(options: {
199
+ membershipStore: MembershipStore;
200
+ });
201
+ listMembers(workspaceId: string): Promise<WorkspaceMember[]>;
202
+ changeMemberRole(input: {
203
+ workspaceId: string;
204
+ userId: string;
205
+ role: WorkspaceRole;
206
+ }): Promise<WorkspaceMember>;
207
+ }
208
+ export declare class InviteService {
209
+ #private;
210
+ constructor(options: {
211
+ inviteStore: InviteStore;
212
+ membershipStore: MembershipStore;
213
+ });
214
+ createInvite(input: {
215
+ workspaceId: string;
216
+ email: string;
217
+ role: WorkspaceRole;
218
+ invitedByUserId: string;
219
+ expiresAt?: Date;
220
+ }): Promise<WorkspaceInvite>;
221
+ acceptInvite(input: {
222
+ token: string;
223
+ userId: string;
224
+ }): Promise<{
225
+ invite: WorkspaceInvite;
226
+ member: WorkspaceMember;
227
+ }>;
228
+ revokeInvite(inviteId: string): Promise<WorkspaceInvite>;
229
+ }
230
+ export declare class UsageService {
231
+ #private;
232
+ constructor(options: {
233
+ workspaceStore: WorkspaceStore;
234
+ usageStore: UsageStore;
235
+ entitlementService: EntitlementService;
236
+ });
237
+ reserve(input: {
238
+ workspaceId: string;
239
+ quotaKey: QuotaKey;
240
+ amount: number;
241
+ }): Promise<UsageMutationResult>;
242
+ consume(input: {
243
+ workspaceId: string;
244
+ quotaKey: QuotaKey;
245
+ amount: number;
246
+ }): Promise<UsageMutationResult>;
247
+ release(input: {
248
+ workspaceId: string;
249
+ quotaKey: QuotaKey;
250
+ amount: number;
251
+ }): Promise<UsageMutationResult>;
252
+ getUsage(workspaceId: string, quotaKey: QuotaKey): Promise<UsageMutationResult>;
253
+ }
254
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,365 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export class SaaSCoreError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = "SaaSCoreError";
6
+ }
7
+ }
8
+ export class InMemoryWorkspaceStore {
9
+ #workspaces = new Map();
10
+ #workspaceIdBySlug = new Map();
11
+ async create(workspace) {
12
+ if (this.#workspaceIdBySlug.has(workspace.slug)) {
13
+ throw new SaaSCoreError(`Workspace slug already exists: ${workspace.slug}`);
14
+ }
15
+ this.#workspaceIdBySlug.set(workspace.slug, workspace.id);
16
+ this.#workspaces.set(workspace.id, structuredClone(workspace));
17
+ }
18
+ async getById(workspaceId) {
19
+ const workspace = this.#workspaces.get(workspaceId);
20
+ return workspace ? structuredClone(workspace) : null;
21
+ }
22
+ async getBySlug(slug) {
23
+ const workspaceId = this.#workspaceIdBySlug.get(slug);
24
+ return workspaceId ? this.getById(workspaceId) : null;
25
+ }
26
+ async update(workspace) {
27
+ if (!this.#workspaces.has(workspace.id)) {
28
+ throw new SaaSCoreError(`Workspace not found: ${workspace.id}`);
29
+ }
30
+ this.#workspaceIdBySlug.set(workspace.slug, workspace.id);
31
+ this.#workspaces.set(workspace.id, structuredClone(workspace));
32
+ }
33
+ }
34
+ export class InMemoryMembershipStore {
35
+ #members = new Map();
36
+ async put(member) {
37
+ this.#members.set(this.#key(member.workspaceId, member.userId), structuredClone(member));
38
+ }
39
+ async get(workspaceId, userId) {
40
+ const member = this.#members.get(this.#key(workspaceId, userId));
41
+ return member ? structuredClone(member) : null;
42
+ }
43
+ async listByWorkspace(workspaceId) {
44
+ return [...this.#members.values()]
45
+ .filter((member) => member.workspaceId === workspaceId)
46
+ .map((member) => structuredClone(member));
47
+ }
48
+ #key(workspaceId, userId) {
49
+ return `${workspaceId}:${userId}`;
50
+ }
51
+ }
52
+ export class InMemoryInviteStore {
53
+ #invites = new Map();
54
+ #inviteIdByToken = new Map();
55
+ async create(invite) {
56
+ this.#invites.set(invite.id, structuredClone(invite));
57
+ this.#inviteIdByToken.set(invite.token, invite.id);
58
+ }
59
+ async getById(inviteId) {
60
+ const invite = this.#invites.get(inviteId);
61
+ return invite ? structuredClone(invite) : null;
62
+ }
63
+ async getByToken(token) {
64
+ const inviteId = this.#inviteIdByToken.get(token);
65
+ return inviteId ? this.getById(inviteId) : null;
66
+ }
67
+ async update(invite) {
68
+ this.#invites.set(invite.id, structuredClone(invite));
69
+ this.#inviteIdByToken.set(invite.token, invite.id);
70
+ }
71
+ }
72
+ export class InMemoryUsageStore {
73
+ #usage = new Map();
74
+ async get(workspaceId, quotaKey) {
75
+ const record = this.#usage.get(this.#key(workspaceId, quotaKey));
76
+ return record ? structuredClone(record) : null;
77
+ }
78
+ async put(record) {
79
+ this.#usage.set(this.#key(record.workspaceId, record.quotaKey), structuredClone(record));
80
+ }
81
+ #key(workspaceId, quotaKey) {
82
+ return `${workspaceId}:${quotaKey}`;
83
+ }
84
+ }
85
+ export class EntitlementService {
86
+ #plans = new Map();
87
+ constructor(plans) {
88
+ for (const plan of plans) {
89
+ this.#plans.set(plan.key, plan);
90
+ }
91
+ }
92
+ getResolvedEntitlements(workspace) {
93
+ const plan = this.#plans.get(workspace.subscription.planKey);
94
+ if (!plan) {
95
+ throw new SaaSCoreError(`Plan not found for workspace: ${workspace.subscription.planKey}`);
96
+ }
97
+ const features = new Set(plan.features ?? []);
98
+ for (const [feature, enabled] of Object.entries(workspace.featureOverrides)) {
99
+ if (enabled) {
100
+ features.add(feature);
101
+ }
102
+ else {
103
+ features.delete(feature);
104
+ }
105
+ }
106
+ const quotas = new Map();
107
+ for (const [quotaKey, value] of Object.entries(plan.quotas ?? {})) {
108
+ if (typeof value === "number") {
109
+ quotas.set(quotaKey, value);
110
+ }
111
+ }
112
+ for (const [quotaKey, value] of Object.entries(workspace.quotaOverrides)) {
113
+ if (typeof value === "number") {
114
+ quotas.set(quotaKey, value);
115
+ }
116
+ }
117
+ return { features, quotas };
118
+ }
119
+ hasFeature(workspace, featureKey) {
120
+ return this.getResolvedEntitlements(workspace).features.has(featureKey);
121
+ }
122
+ getQuota(workspace, quotaKey) {
123
+ return this.getResolvedEntitlements(workspace).quotas.get(quotaKey) ?? null;
124
+ }
125
+ }
126
+ export class WorkspaceService {
127
+ #workspaceStore;
128
+ #membershipStore;
129
+ constructor(options) {
130
+ this.#workspaceStore = options.workspaceStore;
131
+ this.#membershipStore = options.membershipStore;
132
+ }
133
+ async createWorkspace(input) {
134
+ const now = new Date();
135
+ const workspace = {
136
+ id: randomUUID(),
137
+ slug: input.slug,
138
+ name: input.name,
139
+ createdAt: now,
140
+ updatedAt: now,
141
+ metadata: { ...(input.metadata ?? {}) },
142
+ featureOverrides: {},
143
+ quotaOverrides: {},
144
+ subscription: {
145
+ planKey: input.planKey,
146
+ status: input.subscriptionStatus ?? "trial",
147
+ },
148
+ };
149
+ const ownerMembership = {
150
+ workspaceId: workspace.id,
151
+ userId: input.ownerUserId,
152
+ role: "owner",
153
+ createdAt: now,
154
+ updatedAt: now,
155
+ };
156
+ await this.#workspaceStore.create(workspace);
157
+ await this.#membershipStore.put(ownerMembership);
158
+ return { workspace, ownerMembership };
159
+ }
160
+ async updateSubscriptionState(workspaceId, subscription) {
161
+ const workspace = await this.#workspaceStore.getById(workspaceId);
162
+ if (!workspace) {
163
+ throw new SaaSCoreError(`Workspace not found: ${workspaceId}`);
164
+ }
165
+ const updated = {
166
+ ...workspace,
167
+ subscription,
168
+ updatedAt: new Date(),
169
+ };
170
+ await this.#workspaceStore.update(updated);
171
+ return updated;
172
+ }
173
+ async getWorkspace(workspaceId) {
174
+ return this.#workspaceStore.getById(workspaceId);
175
+ }
176
+ }
177
+ export class MembershipService {
178
+ #membershipStore;
179
+ constructor(options) {
180
+ this.#membershipStore = options.membershipStore;
181
+ }
182
+ async listMembers(workspaceId) {
183
+ return this.#membershipStore.listByWorkspace(workspaceId);
184
+ }
185
+ async changeMemberRole(input) {
186
+ const member = await this.#membershipStore.get(input.workspaceId, input.userId);
187
+ if (!member) {
188
+ throw new SaaSCoreError(`Workspace member not found: ${input.workspaceId}:${input.userId}`);
189
+ }
190
+ const updated = {
191
+ ...member,
192
+ role: input.role,
193
+ updatedAt: new Date(),
194
+ };
195
+ await this.#membershipStore.put(updated);
196
+ return updated;
197
+ }
198
+ }
199
+ export class InviteService {
200
+ #inviteStore;
201
+ #membershipStore;
202
+ constructor(options) {
203
+ this.#inviteStore = options.inviteStore;
204
+ this.#membershipStore = options.membershipStore;
205
+ }
206
+ async createInvite(input) {
207
+ const now = new Date();
208
+ const invite = {
209
+ id: randomUUID(),
210
+ workspaceId: input.workspaceId,
211
+ email: input.email,
212
+ role: input.role,
213
+ token: randomUUID(),
214
+ invitedByUserId: input.invitedByUserId,
215
+ status: "pending",
216
+ expiresAt: input.expiresAt ?? new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000),
217
+ createdAt: now,
218
+ updatedAt: now,
219
+ };
220
+ await this.#inviteStore.create(invite);
221
+ return invite;
222
+ }
223
+ async acceptInvite(input) {
224
+ const invite = await this.#inviteStore.getByToken(input.token);
225
+ if (!invite) {
226
+ throw new SaaSCoreError("Invite not found");
227
+ }
228
+ if (invite.status !== "pending") {
229
+ throw new SaaSCoreError(`Invite cannot be accepted from status: ${invite.status}`);
230
+ }
231
+ if (invite.expiresAt.getTime() <= Date.now()) {
232
+ const expiredInvite = {
233
+ ...invite,
234
+ status: "expired",
235
+ updatedAt: new Date(),
236
+ };
237
+ await this.#inviteStore.update(expiredInvite);
238
+ throw new SaaSCoreError("Invite expired");
239
+ }
240
+ const now = new Date();
241
+ const member = {
242
+ workspaceId: invite.workspaceId,
243
+ userId: input.userId,
244
+ role: invite.role,
245
+ createdAt: now,
246
+ updatedAt: now,
247
+ };
248
+ const acceptedInvite = {
249
+ ...invite,
250
+ status: "accepted",
251
+ acceptedAt: now,
252
+ acceptedByUserId: input.userId,
253
+ updatedAt: now,
254
+ };
255
+ await this.#membershipStore.put(member);
256
+ await this.#inviteStore.update(acceptedInvite);
257
+ return { invite: acceptedInvite, member };
258
+ }
259
+ async revokeInvite(inviteId) {
260
+ const invite = await this.#inviteStore.getById(inviteId);
261
+ if (!invite) {
262
+ throw new SaaSCoreError("Invite not found");
263
+ }
264
+ const revokedInvite = {
265
+ ...invite,
266
+ status: "revoked",
267
+ updatedAt: new Date(),
268
+ };
269
+ await this.#inviteStore.update(revokedInvite);
270
+ return revokedInvite;
271
+ }
272
+ }
273
+ export class UsageService {
274
+ #workspaceStore;
275
+ #usageStore;
276
+ #entitlementService;
277
+ constructor(options) {
278
+ this.#workspaceStore = options.workspaceStore;
279
+ this.#usageStore = options.usageStore;
280
+ this.#entitlementService = options.entitlementService;
281
+ }
282
+ async reserve(input) {
283
+ return this.#mutate(input, (current) => ({
284
+ ...current,
285
+ reserved: current.reserved + input.amount,
286
+ }));
287
+ }
288
+ async consume(input) {
289
+ return this.#mutate(input, (current) => {
290
+ if (current.reserved < input.amount) {
291
+ throw new SaaSCoreError("Cannot consume more than reserved quota");
292
+ }
293
+ return {
294
+ ...current,
295
+ reserved: current.reserved - input.amount,
296
+ consumed: current.consumed + input.amount,
297
+ };
298
+ });
299
+ }
300
+ async release(input) {
301
+ return this.#mutate(input, (current) => {
302
+ if (current.reserved < input.amount) {
303
+ throw new SaaSCoreError("Cannot release more than reserved quota");
304
+ }
305
+ return {
306
+ ...current,
307
+ reserved: current.reserved - input.amount,
308
+ };
309
+ });
310
+ }
311
+ async getUsage(workspaceId, quotaKey) {
312
+ const workspace = await this.#requireWorkspace(workspaceId);
313
+ const current = (await this.#usageStore.get(workspaceId, quotaKey)) ??
314
+ createUsageRecord(workspaceId, quotaKey);
315
+ return {
316
+ ...current,
317
+ remaining: computeRemaining(this.#entitlementService.getQuota(workspace, quotaKey), current),
318
+ };
319
+ }
320
+ async #mutate(input, mutator) {
321
+ if (input.amount <= 0) {
322
+ throw new SaaSCoreError("Usage amount must be greater than zero");
323
+ }
324
+ const workspace = await this.#requireWorkspace(input.workspaceId);
325
+ const current = (await this.#usageStore.get(input.workspaceId, input.quotaKey)) ??
326
+ createUsageRecord(input.workspaceId, input.quotaKey);
327
+ const next = {
328
+ ...mutator(current),
329
+ updatedAt: new Date(),
330
+ };
331
+ const quota = this.#entitlementService.getQuota(workspace, input.quotaKey);
332
+ const remaining = computeRemaining(quota, next);
333
+ if (remaining !== null && remaining < 0) {
334
+ throw new SaaSCoreError("Quota exceeded");
335
+ }
336
+ await this.#usageStore.put(next);
337
+ return {
338
+ ...next,
339
+ remaining,
340
+ };
341
+ }
342
+ async #requireWorkspace(workspaceId) {
343
+ const workspace = await this.#workspaceStore.getById(workspaceId);
344
+ if (!workspace) {
345
+ throw new SaaSCoreError(`Workspace not found: ${workspaceId}`);
346
+ }
347
+ return workspace;
348
+ }
349
+ }
350
+ function createUsageRecord(workspaceId, quotaKey) {
351
+ return {
352
+ workspaceId,
353
+ quotaKey,
354
+ reserved: 0,
355
+ consumed: 0,
356
+ updatedAt: new Date(),
357
+ };
358
+ }
359
+ function computeRemaining(quota, record) {
360
+ if (quota === null) {
361
+ return null;
362
+ }
363
+ return quota - record.reserved - record.consumed;
364
+ }
365
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fengsoft/saas-core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",