@contractspec/example.saas-boilerplate 1.44.1 → 1.45.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.
- package/.turbo/turbo-build$colon$bundle.log +24 -24
- package/.turbo/turbo-build.log +24 -24
- package/CHANGELOG.md +45 -0
- package/dist/billing/billing.event.js +3 -3
- package/dist/billing/billing.event.js.map +1 -1
- package/dist/billing/billing.operations.d.ts +42 -42
- package/dist/billing/billing.operations.js +5 -5
- package/dist/billing/billing.operations.js.map +1 -1
- package/dist/billing/billing.presentation.js +2 -2
- package/dist/billing/billing.presentation.js.map +1 -1
- package/dist/billing/billing.schema.d.ts +47 -47
- package/dist/billing/billing.schema.d.ts.map +1 -1
- package/dist/dashboard/dashboard.presentation.js +2 -2
- package/dist/dashboard/dashboard.presentation.js.map +1 -1
- package/dist/example.d.ts +3 -33
- package/dist/example.d.ts.map +1 -1
- package/dist/example.js +16 -11
- package/dist/example.js.map +1 -1
- package/dist/project/project.entity.d.ts +24 -24
- package/dist/project/project.enum.d.ts +3 -3
- package/dist/project/project.event.d.ts +21 -21
- package/dist/project/project.event.js +4 -4
- package/dist/project/project.event.js.map +1 -1
- package/dist/project/project.operations.d.ts +105 -105
- package/dist/project/project.operations.d.ts.map +1 -1
- package/dist/project/project.operations.js +8 -8
- package/dist/project/project.operations.js.map +1 -1
- package/dist/project/project.presentation.js +2 -2
- package/dist/project/project.presentation.js.map +1 -1
- package/dist/project/project.schema.d.ts +54 -54
- package/dist/saas-boilerplate.feature.js +38 -38
- package/dist/saas-boilerplate.feature.js.map +1 -1
- package/dist/settings/settings.entity.d.ts +24 -24
- package/dist/settings/settings.enum.d.ts +2 -2
- package/package.json +10 -10
- package/src/billing/billing.event.ts +3 -3
- package/src/billing/billing.operations.ts +5 -5
- package/src/billing/billing.presentation.ts +2 -2
- package/src/dashboard/dashboard.presentation.ts +2 -2
- package/src/example.ts +16 -9
- package/src/project/project.event.ts +4 -4
- package/src/project/project.operations.ts +8 -8
- package/src/project/project.presentation.ts +2 -2
- package/src/saas-boilerplate.feature.ts +42 -38
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -6,27 +6,27 @@ $ tsdown
|
|
|
6
6
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
7
7
|
[34mℹ[39m Build start
|
|
8
8
|
[34mℹ[39m Cleaning 111 files
|
|
9
|
-
[34mℹ[39m [2mdist/[22m[1mproject/project.operations.js[22m [2m 5.
|
|
9
|
+
[34mℹ[39m [2mdist/[22m[1mproject/project.operations.js[22m [2m 5.85 kB[22m [2m│ gzip: 1.46 kB[22m
|
|
10
10
|
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [2m 5.37 kB[22m [2m│ gzip: 1.17 kB[22m
|
|
11
11
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.schema.js[22m [2m 4.79 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
12
12
|
[34mℹ[39m [2mdist/[22m[1mproject/project.schema.js[22m [2m 4.60 kB[22m [2m│ gzip: 0.77 kB[22m
|
|
13
|
-
[34mℹ[39m [2mdist/[22m[1mbilling/billing.operations.js[22m [2m 4.
|
|
13
|
+
[34mℹ[39m [2mdist/[22m[1mbilling/billing.operations.js[22m [2m 4.28 kB[22m [2m│ gzip: 1.28 kB[22m
|
|
14
14
|
[34mℹ[39m [2mdist/[22m[1mdocs/saas-boilerplate.docblock.js[22m [2m 3.77 kB[22m [2m│ gzip: 1.47 kB[22m
|
|
15
|
-
[34mℹ[39m [2mdist/[22m[1mproject/project.event.js[22m [2m 3.
|
|
15
|
+
[34mℹ[39m [2mdist/[22m[1mproject/project.event.js[22m [2m 3.69 kB[22m [2m│ gzip: 0.66 kB[22m
|
|
16
16
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.entity.js[22m [2m 3.65 kB[22m [2m│ gzip: 1.12 kB[22m
|
|
17
|
-
[34mℹ[39m [2mdist/[22m[1mbilling/billing.event.js[22m [2m 3.
|
|
18
|
-
[34mℹ[39m [2mdist/[22m[1msaas-boilerplate.feature.js[22m [2m 3.
|
|
17
|
+
[34mℹ[39m [2mdist/[22m[1mbilling/billing.event.js[22m [2m 3.36 kB[22m [2m│ gzip: 0.71 kB[22m
|
|
18
|
+
[34mℹ[39m [2mdist/[22m[1msaas-boilerplate.feature.js[22m [2m 3.26 kB[22m [2m│ gzip: 0.69 kB[22m
|
|
19
19
|
[34mℹ[39m [2mdist/[22m[1mshared/mock-data.js[22m [2m 2.89 kB[22m [2m│ gzip: 0.98 kB[22m
|
|
20
20
|
[34mℹ[39m [2mdist/[22m[1mproject/project.handler.js[22m [2m 2.61 kB[22m [2m│ gzip: 0.89 kB[22m
|
|
21
21
|
[34mℹ[39m [2mdist/[22m[1mproject/project.entity.js[22m [2m 2.37 kB[22m [2m│ gzip: 0.84 kB[22m
|
|
22
22
|
[34mℹ[39m [2mdist/[22m[1msettings/settings.entity.js[22m [2m 2.14 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
23
23
|
[34mℹ[39m [2mdist/[22m[1mbilling/index.js[22m [2m 1.68 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
24
24
|
[34mℹ[39m [2mdist/[22m[1mproject/index.js[22m [2m 1.67 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
25
|
-
[34mℹ[39m [2mdist/[22m[1mproject/project.presentation.js[22m [2m 1.
|
|
26
|
-
[34mℹ[39m [2mdist/[22m[1mbilling/billing.presentation.js[22m [2m 1.
|
|
25
|
+
[34mℹ[39m [2mdist/[22m[1mproject/project.presentation.js[22m [2m 1.60 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
26
|
+
[34mℹ[39m [2mdist/[22m[1mbilling/billing.presentation.js[22m [2m 1.50 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
27
27
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.handler.js[22m [2m 1.45 kB[22m [2m│ gzip: 0.58 kB[22m
|
|
28
|
-
[34mℹ[39m [2mdist/[22m[1mdashboard/dashboard.presentation.js[22m [2m 1.
|
|
29
|
-
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m
|
|
28
|
+
[34mℹ[39m [2mdist/[22m[1mdashboard/dashboard.presentation.js[22m [2m 1.45 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
29
|
+
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m 1.04 kB[22m [2m│ gzip: 0.54 kB[22m
|
|
30
30
|
[34mℹ[39m [2mdist/[22m[1mpresentations/index.js[22m [2m 0.86 kB[22m [2m│ gzip: 0.28 kB[22m
|
|
31
31
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.enum.js[22m [2m 0.64 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
32
32
|
[34mℹ[39m [2mdist/[22m[1mproject/project.enum.js[22m [2m 0.61 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
@@ -35,26 +35,26 @@ $ tsdown
|
|
|
35
35
|
[34mℹ[39m [2mdist/[22m[1msettings/index.js[22m [2m 0.20 kB[22m [2m│ gzip: 0.11 kB[22m
|
|
36
36
|
[34mℹ[39m [2mdist/[22m[1mdashboard/index.js[22m [2m 0.17 kB[22m [2m│ gzip: 0.10 kB[22m
|
|
37
37
|
[34mℹ[39m [2mdist/[22m[1mdocs/index.js[22m [2m 0.04 kB[22m [2m│ gzip: 0.06 kB[22m
|
|
38
|
-
[34mℹ[39m [2mdist/[22mproject/project.operations.js.map [2m 9.
|
|
38
|
+
[34mℹ[39m [2mdist/[22mproject/project.operations.js.map [2m 9.59 kB[22m [2m│ gzip: 1.99 kB[22m
|
|
39
39
|
[34mℹ[39m [2mdist/[22mbilling/billing.schema.js.map [2m 6.87 kB[22m [2m│ gzip: 1.26 kB[22m
|
|
40
40
|
[34mℹ[39m [2mdist/[22mproject/project.schema.js.map [2m 6.85 kB[22m [2m│ gzip: 1.13 kB[22m
|
|
41
|
-
[34mℹ[39m [2mdist/[22mbilling/billing.operations.js.map [2m 6.
|
|
41
|
+
[34mℹ[39m [2mdist/[22mbilling/billing.operations.js.map [2m 6.82 kB[22m [2m│ gzip: 1.76 kB[22m
|
|
42
42
|
[34mℹ[39m [2mdist/[22mbilling/billing.entity.js.map [2m 6.25 kB[22m [2m│ gzip: 1.77 kB[22m
|
|
43
43
|
[34mℹ[39m [2mdist/[22mproject/project.handler.js.map [2m 5.62 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
44
|
-
[34mℹ[39m [2mdist/[22mproject/project.event.js.map [2m 5.
|
|
45
|
-
[34mℹ[39m [2mdist/[22msaas-boilerplate.feature.js.map [2m 5.
|
|
46
|
-
[34mℹ[39m [2mdist/[22mbilling/billing.event.js.map [2m 4.
|
|
44
|
+
[34mℹ[39m [2mdist/[22mproject/project.event.js.map [2m 5.53 kB[22m [2m│ gzip: 0.95 kB[22m
|
|
45
|
+
[34mℹ[39m [2mdist/[22msaas-boilerplate.feature.js.map [2m 5.52 kB[22m [2m│ gzip: 1.33 kB[22m
|
|
46
|
+
[34mℹ[39m [2mdist/[22mbilling/billing.event.js.map [2m 4.93 kB[22m [2m│ gzip: 1.05 kB[22m
|
|
47
47
|
[34mℹ[39m [2mdist/[22mdocs/saas-boilerplate.docblock.js.map [2m 4.63 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
48
48
|
[34mℹ[39m [2mdist/[22mshared/mock-data.js.map [2m 4.50 kB[22m [2m│ gzip: 1.31 kB[22m
|
|
49
49
|
[34mℹ[39m [2mdist/[22mproject/project.entity.js.map [2m 3.94 kB[22m [2m│ gzip: 1.30 kB[22m
|
|
50
50
|
[34mℹ[39m [2mdist/[22mbilling/billing.handler.js.map [2m 3.76 kB[22m [2m│ gzip: 1.29 kB[22m
|
|
51
51
|
[34mℹ[39m [2mdist/[22msettings/settings.entity.js.map [2m 3.62 kB[22m [2m│ gzip: 1.22 kB[22m
|
|
52
52
|
[34mℹ[39m [2mdist/[22mindex.js.map [2m 2.53 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
53
|
-
[34mℹ[39m [2mdist/[22mproject/project.presentation.js.map [2m 2.
|
|
54
|
-
[34mℹ[39m [2mdist/[22mbilling/billing.presentation.js.map [2m 2.
|
|
55
|
-
[34mℹ[39m [2mdist/[22mdashboard/dashboard.presentation.js.map [2m 2.
|
|
53
|
+
[34mℹ[39m [2mdist/[22mproject/project.presentation.js.map [2m 2.51 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
54
|
+
[34mℹ[39m [2mdist/[22mbilling/billing.presentation.js.map [2m 2.40 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
55
|
+
[34mℹ[39m [2mdist/[22mdashboard/dashboard.presentation.js.map [2m 2.35 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
56
|
+
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.63 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
56
57
|
[34mℹ[39m [2mdist/[22mproject/project.operations.d.ts.map [2m 1.37 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
57
|
-
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.35 kB[22m [2m│ gzip: 0.68 kB[22m
|
|
58
58
|
[34mℹ[39m [2mdist/[22mpresentations/index.js.map [2m 1.14 kB[22m [2m│ gzip: 0.45 kB[22m
|
|
59
59
|
[34mℹ[39m [2mdist/[22mbilling/billing.schema.d.ts.map [2m 1.07 kB[22m [2m│ gzip: 0.41 kB[22m
|
|
60
60
|
[34mℹ[39m [2mdist/[22mproject/project.schema.d.ts.map [2m 1.03 kB[22m [2m│ gzip: 0.38 kB[22m
|
|
@@ -78,11 +78,11 @@ $ tsdown
|
|
|
78
78
|
[34mℹ[39m [2mdist/[22msettings/settings.enum.d.ts.map [2m 0.18 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
79
79
|
[34mℹ[39m [2mdist/[22mindex.d.ts.map [2m 0.17 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
80
80
|
[34mℹ[39m [2mdist/[22msaas-boilerplate.feature.d.ts.map [2m 0.17 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
81
|
-
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
82
81
|
[34mℹ[39m [2mdist/[22mpresentations/index.d.ts.map [2m 0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
83
|
-
[34mℹ[39m [2mdist/[
|
|
82
|
+
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.12 kB[22m [2m│ gzip: 0.12 kB[22m
|
|
83
|
+
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.operations.d.ts[22m[39m [2m11.80 kB[22m [2m│ gzip: 0.87 kB[22m
|
|
84
84
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.schema.d.ts[22m[39m [2m 6.56 kB[22m [2m│ gzip: 0.76 kB[22m
|
|
85
|
-
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.schema.d.ts[22m[39m [2m 5.
|
|
85
|
+
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.schema.d.ts[22m[39m [2m 5.68 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
86
86
|
[34mℹ[39m [2mdist/[22m[32m[1mindex.d.ts[22m[39m [2m 5.02 kB[22m [2m│ gzip: 1.06 kB[22m
|
|
87
87
|
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.operations.d.ts[22m[39m [2m 4.98 kB[22m [2m│ gzip: 0.78 kB[22m
|
|
88
88
|
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.entity.d.ts[22m[39m [2m 2.91 kB[22m [2m│ gzip: 0.52 kB[22m
|
|
@@ -95,7 +95,6 @@ $ tsdown
|
|
|
95
95
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.entity.d.ts[22m[39m [2m 1.79 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
96
96
|
[34mℹ[39m [2mdist/[22m[32m[1msettings/settings.entity.d.ts[22m[39m [2m 1.71 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
97
97
|
[34mℹ[39m [2mdist/[22m[32m[1mshared/mock-data.d.ts[22m[39m [2m 1.68 kB[22m [2m│ gzip: 0.50 kB[22m
|
|
98
|
-
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 1.18 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
99
98
|
[34mℹ[39m [2mdist/[22m[32m[1mpresentations/index.d.ts[22m[39m [2m 0.90 kB[22m [2m│ gzip: 0.28 kB[22m
|
|
100
99
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.enum.d.ts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
101
100
|
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.enum.d.ts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
@@ -105,9 +104,10 @@ $ tsdown
|
|
|
105
104
|
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.presentation.d.ts[22m[39m [2m 0.46 kB[22m [2m│ gzip: 0.22 kB[22m
|
|
106
105
|
[34mℹ[39m [2mdist/[22m[32m[1msaas-boilerplate.feature.d.ts[22m[39m [2m 0.41 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
107
106
|
[34mℹ[39m [2mdist/[22m[32m[1msettings/settings.enum.d.ts[22m[39m [2m 0.31 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
107
|
+
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 0.20 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
108
108
|
[34mℹ[39m [2mdist/[22m[32m[1msettings/index.d.ts[22m[39m [2m 0.19 kB[22m [2m│ gzip: 0.11 kB[22m
|
|
109
109
|
[34mℹ[39m [2mdist/[22m[32m[1mdashboard/index.d.ts[22m[39m [2m 0.16 kB[22m [2m│ gzip: 0.10 kB[22m
|
|
110
110
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/index.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
111
111
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/saas-boilerplate.docblock.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
112
|
-
[34mℹ[39m 103 files, total: 230.
|
|
113
|
-
[32m✔[39m Build complete in [
|
|
112
|
+
[34mℹ[39m 103 files, total: 230.81 kB
|
|
113
|
+
[32m✔[39m Build complete in [32m27041ms[39m
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -3,31 +3,31 @@ $ tsc --noEmit
|
|
|
3
3
|
$ tsdown
|
|
4
4
|
[34mℹ[39m tsdown [2mv0.18.3[22m powered by rolldown [2mv1.0.0-beta.57[22m
|
|
5
5
|
[34mℹ[39m config file: [4m/home/runner/work/contractspec/contractspec/packages/examples/saas-boilerplate/tsdown.config.js[24m
|
|
6
|
-
[34mℹ[39m entry: [34msrc/example.ts, src/index.ts, src/saas-boilerplate.feature.ts, src/billing/billing.entity.ts, src/billing/billing.enum.ts, src/billing/billing.event.ts, src/billing/billing.handler.ts, src/billing/billing.operations.ts, src/billing/billing.presentation.ts, src/billing/billing.schema.ts, src/billing/index.ts, src/dashboard/dashboard.presentation.ts, src/dashboard/index.ts, src/docs/index.ts, src/docs/saas-boilerplate.docblock.ts, src/handlers/index.ts, src/presentations/index.ts, src/project/index.ts, src/project/project.entity.ts, src/project/project.enum.ts, src/project/project.event.ts, src/project/project.handler.ts, src/project/project.operations.ts, src/project/project.presentation.ts, src/project/project.schema.ts, src/
|
|
6
|
+
[34mℹ[39m entry: [34msrc/example.ts, src/index.ts, src/saas-boilerplate.feature.ts, src/billing/billing.entity.ts, src/billing/billing.enum.ts, src/billing/billing.event.ts, src/billing/billing.handler.ts, src/billing/billing.operations.ts, src/billing/billing.presentation.ts, src/billing/billing.schema.ts, src/billing/index.ts, src/dashboard/dashboard.presentation.ts, src/dashboard/index.ts, src/docs/index.ts, src/docs/saas-boilerplate.docblock.ts, src/handlers/index.ts, src/presentations/index.ts, src/project/index.ts, src/project/project.entity.ts, src/project/project.enum.ts, src/project/project.event.ts, src/project/project.handler.ts, src/project/project.operations.ts, src/project/project.presentation.ts, src/project/project.schema.ts, src/shared/mock-data.ts, src/settings/index.ts, src/settings/settings.entity.ts, src/settings/settings.enum.ts[39m
|
|
7
7
|
[34mℹ[39m target: [34mesnext[39m
|
|
8
8
|
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
9
9
|
[34mℹ[39m Build start
|
|
10
|
-
[34mℹ[39m [2mdist/[22m[1mproject/project.operations.js[22m [2m 5.
|
|
10
|
+
[34mℹ[39m [2mdist/[22m[1mproject/project.operations.js[22m [2m 5.85 kB[22m [2m│ gzip: 1.46 kB[22m
|
|
11
11
|
[34mℹ[39m [2mdist/[22m[1mindex.js[22m [2m 5.37 kB[22m [2m│ gzip: 1.17 kB[22m
|
|
12
12
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.schema.js[22m [2m 4.79 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
13
13
|
[34mℹ[39m [2mdist/[22m[1mproject/project.schema.js[22m [2m 4.60 kB[22m [2m│ gzip: 0.77 kB[22m
|
|
14
|
-
[34mℹ[39m [2mdist/[22m[1mbilling/billing.operations.js[22m [2m 4.
|
|
14
|
+
[34mℹ[39m [2mdist/[22m[1mbilling/billing.operations.js[22m [2m 4.28 kB[22m [2m│ gzip: 1.28 kB[22m
|
|
15
15
|
[34mℹ[39m [2mdist/[22m[1mdocs/saas-boilerplate.docblock.js[22m [2m 3.77 kB[22m [2m│ gzip: 1.47 kB[22m
|
|
16
|
-
[34mℹ[39m [2mdist/[22m[1mproject/project.event.js[22m [2m 3.
|
|
16
|
+
[34mℹ[39m [2mdist/[22m[1mproject/project.event.js[22m [2m 3.69 kB[22m [2m│ gzip: 0.66 kB[22m
|
|
17
17
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.entity.js[22m [2m 3.65 kB[22m [2m│ gzip: 1.12 kB[22m
|
|
18
|
-
[34mℹ[39m [2mdist/[22m[1mbilling/billing.event.js[22m [2m 3.
|
|
19
|
-
[34mℹ[39m [2mdist/[22m[1msaas-boilerplate.feature.js[22m [2m 3.
|
|
18
|
+
[34mℹ[39m [2mdist/[22m[1mbilling/billing.event.js[22m [2m 3.36 kB[22m [2m│ gzip: 0.71 kB[22m
|
|
19
|
+
[34mℹ[39m [2mdist/[22m[1msaas-boilerplate.feature.js[22m [2m 3.26 kB[22m [2m│ gzip: 0.69 kB[22m
|
|
20
20
|
[34mℹ[39m [2mdist/[22m[1mshared/mock-data.js[22m [2m 2.89 kB[22m [2m│ gzip: 0.98 kB[22m
|
|
21
21
|
[34mℹ[39m [2mdist/[22m[1mproject/project.handler.js[22m [2m 2.61 kB[22m [2m│ gzip: 0.89 kB[22m
|
|
22
22
|
[34mℹ[39m [2mdist/[22m[1mproject/project.entity.js[22m [2m 2.37 kB[22m [2m│ gzip: 0.84 kB[22m
|
|
23
23
|
[34mℹ[39m [2mdist/[22m[1msettings/settings.entity.js[22m [2m 2.14 kB[22m [2m│ gzip: 0.80 kB[22m
|
|
24
24
|
[34mℹ[39m [2mdist/[22m[1mbilling/index.js[22m [2m 1.68 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
25
25
|
[34mℹ[39m [2mdist/[22m[1mproject/index.js[22m [2m 1.67 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
26
|
-
[34mℹ[39m [2mdist/[22m[1mproject/project.presentation.js[22m [2m 1.
|
|
27
|
-
[34mℹ[39m [2mdist/[22m[1mbilling/billing.presentation.js[22m [2m 1.
|
|
26
|
+
[34mℹ[39m [2mdist/[22m[1mproject/project.presentation.js[22m [2m 1.60 kB[22m [2m│ gzip: 0.61 kB[22m
|
|
27
|
+
[34mℹ[39m [2mdist/[22m[1mbilling/billing.presentation.js[22m [2m 1.50 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
28
28
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.handler.js[22m [2m 1.45 kB[22m [2m│ gzip: 0.58 kB[22m
|
|
29
|
-
[34mℹ[39m [2mdist/[22m[1mdashboard/dashboard.presentation.js[22m [2m 1.
|
|
30
|
-
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m
|
|
29
|
+
[34mℹ[39m [2mdist/[22m[1mdashboard/dashboard.presentation.js[22m [2m 1.45 kB[22m [2m│ gzip: 0.56 kB[22m
|
|
30
|
+
[34mℹ[39m [2mdist/[22m[1mexample.js[22m [2m 1.04 kB[22m [2m│ gzip: 0.54 kB[22m
|
|
31
31
|
[34mℹ[39m [2mdist/[22m[1mpresentations/index.js[22m [2m 0.86 kB[22m [2m│ gzip: 0.28 kB[22m
|
|
32
32
|
[34mℹ[39m [2mdist/[22m[1mbilling/billing.enum.js[22m [2m 0.64 kB[22m [2m│ gzip: 0.36 kB[22m
|
|
33
33
|
[34mℹ[39m [2mdist/[22m[1mproject/project.enum.js[22m [2m 0.61 kB[22m [2m│ gzip: 0.32 kB[22m
|
|
@@ -36,26 +36,26 @@ $ tsdown
|
|
|
36
36
|
[34mℹ[39m [2mdist/[22m[1msettings/index.js[22m [2m 0.20 kB[22m [2m│ gzip: 0.11 kB[22m
|
|
37
37
|
[34mℹ[39m [2mdist/[22m[1mdashboard/index.js[22m [2m 0.17 kB[22m [2m│ gzip: 0.10 kB[22m
|
|
38
38
|
[34mℹ[39m [2mdist/[22m[1mdocs/index.js[22m [2m 0.04 kB[22m [2m│ gzip: 0.06 kB[22m
|
|
39
|
-
[34mℹ[39m [2mdist/[22mproject/project.operations.js.map [2m 9.
|
|
39
|
+
[34mℹ[39m [2mdist/[22mproject/project.operations.js.map [2m 9.59 kB[22m [2m│ gzip: 1.99 kB[22m
|
|
40
40
|
[34mℹ[39m [2mdist/[22mbilling/billing.schema.js.map [2m 6.87 kB[22m [2m│ gzip: 1.26 kB[22m
|
|
41
41
|
[34mℹ[39m [2mdist/[22mproject/project.schema.js.map [2m 6.85 kB[22m [2m│ gzip: 1.13 kB[22m
|
|
42
|
-
[34mℹ[39m [2mdist/[22mbilling/billing.operations.js.map [2m 6.
|
|
42
|
+
[34mℹ[39m [2mdist/[22mbilling/billing.operations.js.map [2m 6.82 kB[22m [2m│ gzip: 1.76 kB[22m
|
|
43
43
|
[34mℹ[39m [2mdist/[22mbilling/billing.entity.js.map [2m 6.25 kB[22m [2m│ gzip: 1.77 kB[22m
|
|
44
44
|
[34mℹ[39m [2mdist/[22mproject/project.handler.js.map [2m 5.62 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
45
|
-
[34mℹ[39m [2mdist/[22mproject/project.event.js.map [2m 5.
|
|
46
|
-
[34mℹ[39m [2mdist/[22msaas-boilerplate.feature.js.map [2m 5.
|
|
47
|
-
[34mℹ[39m [2mdist/[22mbilling/billing.event.js.map [2m 4.
|
|
45
|
+
[34mℹ[39m [2mdist/[22mproject/project.event.js.map [2m 5.53 kB[22m [2m│ gzip: 0.95 kB[22m
|
|
46
|
+
[34mℹ[39m [2mdist/[22msaas-boilerplate.feature.js.map [2m 5.52 kB[22m [2m│ gzip: 1.33 kB[22m
|
|
47
|
+
[34mℹ[39m [2mdist/[22mbilling/billing.event.js.map [2m 4.93 kB[22m [2m│ gzip: 1.05 kB[22m
|
|
48
48
|
[34mℹ[39m [2mdist/[22mdocs/saas-boilerplate.docblock.js.map [2m 4.63 kB[22m [2m│ gzip: 1.68 kB[22m
|
|
49
49
|
[34mℹ[39m [2mdist/[22mshared/mock-data.js.map [2m 4.50 kB[22m [2m│ gzip: 1.31 kB[22m
|
|
50
50
|
[34mℹ[39m [2mdist/[22mproject/project.entity.js.map [2m 3.94 kB[22m [2m│ gzip: 1.30 kB[22m
|
|
51
51
|
[34mℹ[39m [2mdist/[22mbilling/billing.handler.js.map [2m 3.76 kB[22m [2m│ gzip: 1.29 kB[22m
|
|
52
52
|
[34mℹ[39m [2mdist/[22msettings/settings.entity.js.map [2m 3.62 kB[22m [2m│ gzip: 1.22 kB[22m
|
|
53
53
|
[34mℹ[39m [2mdist/[22mindex.js.map [2m 2.53 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
54
|
-
[34mℹ[39m [2mdist/[22mproject/project.presentation.js.map [2m 2.
|
|
55
|
-
[34mℹ[39m [2mdist/[22mbilling/billing.presentation.js.map [2m 2.
|
|
56
|
-
[34mℹ[39m [2mdist/[22mdashboard/dashboard.presentation.js.map [2m 2.
|
|
54
|
+
[34mℹ[39m [2mdist/[22mproject/project.presentation.js.map [2m 2.51 kB[22m [2m│ gzip: 0.86 kB[22m
|
|
55
|
+
[34mℹ[39m [2mdist/[22mbilling/billing.presentation.js.map [2m 2.40 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
56
|
+
[34mℹ[39m [2mdist/[22mdashboard/dashboard.presentation.js.map [2m 2.35 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
57
|
+
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.63 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
57
58
|
[34mℹ[39m [2mdist/[22mproject/project.operations.d.ts.map [2m 1.37 kB[22m [2m│ gzip: 0.39 kB[22m
|
|
58
|
-
[34mℹ[39m [2mdist/[22mexample.js.map [2m 1.35 kB[22m [2m│ gzip: 0.68 kB[22m
|
|
59
59
|
[34mℹ[39m [2mdist/[22mpresentations/index.js.map [2m 1.14 kB[22m [2m│ gzip: 0.45 kB[22m
|
|
60
60
|
[34mℹ[39m [2mdist/[22mbilling/billing.schema.d.ts.map [2m 1.07 kB[22m [2m│ gzip: 0.41 kB[22m
|
|
61
61
|
[34mℹ[39m [2mdist/[22mproject/project.schema.d.ts.map [2m 1.03 kB[22m [2m│ gzip: 0.38 kB[22m
|
|
@@ -79,8 +79,8 @@ $ tsdown
|
|
|
79
79
|
[34mℹ[39m [2mdist/[22msettings/settings.enum.d.ts.map [2m 0.18 kB[22m [2m│ gzip: 0.15 kB[22m
|
|
80
80
|
[34mℹ[39m [2mdist/[22mindex.d.ts.map [2m 0.17 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
81
81
|
[34mℹ[39m [2mdist/[22msaas-boilerplate.feature.d.ts.map [2m 0.17 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
82
|
-
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
83
82
|
[34mℹ[39m [2mdist/[22mpresentations/index.d.ts.map [2m 0.14 kB[22m [2m│ gzip: 0.13 kB[22m
|
|
83
|
+
[34mℹ[39m [2mdist/[22mexample.d.ts.map [2m 0.12 kB[22m [2m│ gzip: 0.12 kB[22m
|
|
84
84
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.operations.d.ts[22m[39m [2m11.81 kB[22m [2m│ gzip: 0.87 kB[22m
|
|
85
85
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.schema.d.ts[22m[39m [2m 6.56 kB[22m [2m│ gzip: 0.76 kB[22m
|
|
86
86
|
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.schema.d.ts[22m[39m [2m 5.72 kB[22m [2m│ gzip: 0.79 kB[22m
|
|
@@ -96,19 +96,19 @@ $ tsdown
|
|
|
96
96
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.entity.d.ts[22m[39m [2m 1.79 kB[22m [2m│ gzip: 0.42 kB[22m
|
|
97
97
|
[34mℹ[39m [2mdist/[22m[32m[1msettings/settings.entity.d.ts[22m[39m [2m 1.71 kB[22m [2m│ gzip: 0.37 kB[22m
|
|
98
98
|
[34mℹ[39m [2mdist/[22m[32m[1mshared/mock-data.d.ts[22m[39m [2m 1.68 kB[22m [2m│ gzip: 0.50 kB[22m
|
|
99
|
-
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 1.18 kB[22m [2m│ gzip: 0.48 kB[22m
|
|
100
99
|
[34mℹ[39m [2mdist/[22m[32m[1mpresentations/index.d.ts[22m[39m [2m 0.90 kB[22m [2m│ gzip: 0.28 kB[22m
|
|
101
100
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.enum.d.ts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
102
|
-
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.enum.d.ts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.
|
|
101
|
+
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.enum.d.ts[22m[39m [2m 0.63 kB[22m [2m│ gzip: 0.30 kB[22m
|
|
103
102
|
[34mℹ[39m [2mdist/[22m[32m[1mhandlers/index.d.ts[22m[39m [2m 0.58 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
104
103
|
[34mℹ[39m [2mdist/[22m[32m[1mdashboard/dashboard.presentation.d.ts[22m[39m [2m 0.47 kB[22m [2m│ gzip: 0.23 kB[22m
|
|
105
104
|
[34mℹ[39m [2mdist/[22m[32m[1mproject/project.presentation.d.ts[22m[39m [2m 0.46 kB[22m [2m│ gzip: 0.22 kB[22m
|
|
106
105
|
[34mℹ[39m [2mdist/[22m[32m[1mbilling/billing.presentation.d.ts[22m[39m [2m 0.46 kB[22m [2m│ gzip: 0.22 kB[22m
|
|
107
106
|
[34mℹ[39m [2mdist/[22m[32m[1msaas-boilerplate.feature.d.ts[22m[39m [2m 0.41 kB[22m [2m│ gzip: 0.25 kB[22m
|
|
108
107
|
[34mℹ[39m [2mdist/[22m[32m[1msettings/settings.enum.d.ts[22m[39m [2m 0.31 kB[22m [2m│ gzip: 0.20 kB[22m
|
|
108
|
+
[34mℹ[39m [2mdist/[22m[32m[1mexample.d.ts[22m[39m [2m 0.20 kB[22m [2m│ gzip: 0.16 kB[22m
|
|
109
109
|
[34mℹ[39m [2mdist/[22m[32m[1msettings/index.d.ts[22m[39m [2m 0.19 kB[22m [2m│ gzip: 0.11 kB[22m
|
|
110
110
|
[34mℹ[39m [2mdist/[22m[32m[1mdashboard/index.d.ts[22m[39m [2m 0.16 kB[22m [2m│ gzip: 0.10 kB[22m
|
|
111
111
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/index.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
112
112
|
[34mℹ[39m [2mdist/[22m[32m[1mdocs/saas-boilerplate.docblock.d.ts[22m[39m [2m 0.01 kB[22m [2m│ gzip: 0.03 kB[22m
|
|
113
|
-
[34mℹ[39m 103 files, total: 230.
|
|
114
|
-
[32m✔[39m Build complete in [
|
|
113
|
+
[34mℹ[39m 103 files, total: 230.81 kB
|
|
114
|
+
[32m✔[39m Build complete in [32m27280ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# @contractspec/example.saas-boilerplate
|
|
2
2
|
|
|
3
|
+
## 1.45.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- feat: improve app config and examples contracts
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @contractspec/module.notifications@1.45.1
|
|
10
|
+
- @contractspec/module.audit-trail@1.45.1
|
|
11
|
+
- @contractspec/lib.identity-rbac@1.45.1
|
|
12
|
+
- @contractspec/lib.contracts@1.45.1
|
|
13
|
+
- @contractspec/lib.schema@1.45.1
|
|
14
|
+
- @contractspec/lib.jobs@1.45.1
|
|
15
|
+
- @contractspec/lib.bus@1.45.1
|
|
16
|
+
|
|
17
|
+
## 1.45.0
|
|
18
|
+
|
|
19
|
+
### Minor Changes
|
|
20
|
+
|
|
21
|
+
- e73ca1d: feat: improve app config and examples contracts
|
|
22
|
+
feat: Contract layers support (features, examples, app-configs)
|
|
23
|
+
|
|
24
|
+
### New CLI Commands
|
|
25
|
+
- `contractspec list layers` - List all contract layers with filtering
|
|
26
|
+
|
|
27
|
+
### Enhanced Commands
|
|
28
|
+
- `contractspec ci` - New `layers` check category validates features/examples/config
|
|
29
|
+
- `contractspec doctor` - New `layers` health checks
|
|
30
|
+
- `contractspec integrity` - Now shows layer statistics
|
|
31
|
+
|
|
32
|
+
### New APIs
|
|
33
|
+
- `discoverLayers()` - Scan workspace for all layer files
|
|
34
|
+
- `scanExampleSource()` - Parse ExampleSpec from source code
|
|
35
|
+
- `isExampleFile()` - Check if file is an example spec
|
|
36
|
+
|
|
37
|
+
### Patch Changes
|
|
38
|
+
|
|
39
|
+
- Updated dependencies [e73ca1d]
|
|
40
|
+
- @contractspec/module.notifications@1.45.0
|
|
41
|
+
- @contractspec/module.audit-trail@1.45.0
|
|
42
|
+
- @contractspec/lib.identity-rbac@1.45.0
|
|
43
|
+
- @contractspec/lib.contracts@1.45.0
|
|
44
|
+
- @contractspec/lib.schema@1.45.0
|
|
45
|
+
- @contractspec/lib.jobs@1.45.0
|
|
46
|
+
- @contractspec/lib.bus@1.45.0
|
|
47
|
+
|
|
3
48
|
## 1.44.1
|
|
4
49
|
|
|
5
50
|
### Patch Changes
|
|
@@ -99,7 +99,7 @@ const SubscriptionChangedPayload = defineSchemaModel({
|
|
|
99
99
|
const UsageRecordedEvent = defineEvent({
|
|
100
100
|
meta: {
|
|
101
101
|
key: "billing.usage.recorded",
|
|
102
|
-
version: 1,
|
|
102
|
+
version: "1.0.0",
|
|
103
103
|
description: "Feature usage has been recorded.",
|
|
104
104
|
stability: "stable",
|
|
105
105
|
owners: ["@saas-team"],
|
|
@@ -117,7 +117,7 @@ const UsageRecordedEvent = defineEvent({
|
|
|
117
117
|
const UsageLimitReachedEvent = defineEvent({
|
|
118
118
|
meta: {
|
|
119
119
|
key: "billing.limit.reached",
|
|
120
|
-
version: 1,
|
|
120
|
+
version: "1.0.0",
|
|
121
121
|
description: "Usage limit has been reached for a feature.",
|
|
122
122
|
stability: "stable",
|
|
123
123
|
owners: ["@saas-team"],
|
|
@@ -135,7 +135,7 @@ const UsageLimitReachedEvent = defineEvent({
|
|
|
135
135
|
const SubscriptionChangedEvent = defineEvent({
|
|
136
136
|
meta: {
|
|
137
137
|
key: "billing.subscription.changed",
|
|
138
|
-
version: 1,
|
|
138
|
+
version: "1.0.0",
|
|
139
139
|
description: "Subscription status has changed.",
|
|
140
140
|
stability: "stable",
|
|
141
141
|
owners: ["@saas-team"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.event.js","names":[],"sources":["../../src/billing/billing.event.ts"],"sourcesContent":["import { ScalarTypeEnum, defineSchemaModel } from '@contractspec/lib.schema';\nimport { defineEvent } from '@contractspec/lib.contracts';\n\n/**\n * Payload when feature usage is recorded.\n */\nconst UsageRecordedPayload = defineSchemaModel({\n name: 'UsageRecordedPayload',\n description: 'Payload when feature usage is recorded',\n fields: {\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n feature: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n quantity: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n billingPeriod: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n recordedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when usage limit is reached.\n */\nconst UsageLimitReachedPayload = defineSchemaModel({\n name: 'UsageLimitReachedPayload',\n description: 'Payload when usage limit is reached',\n fields: {\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n feature: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n limit: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n currentUsage: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n reachedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when subscription status changes.\n */\nconst SubscriptionChangedPayload = defineSchemaModel({\n name: 'SubscriptionChangedPayload',\n description: 'Payload when subscription status changes',\n fields: {\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n previousPlan: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n newPlan: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n previousStatus: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n newStatus: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n changedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Event: Feature usage has been recorded.\n */\nexport const UsageRecordedEvent = defineEvent({\n meta: {\n key: 'billing.usage.recorded',\n version: 1,\n description: 'Feature usage has been recorded.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['billing', 'usage', 'recorded'],\n },\n payload: UsageRecordedPayload,\n});\n\n/**\n * Event: Usage limit has been reached for a feature.\n */\nexport const UsageLimitReachedEvent = defineEvent({\n meta: {\n key: 'billing.limit.reached',\n version: 1,\n description: 'Usage limit has been reached for a feature.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['billing', 'limit', 'reached'],\n },\n payload: UsageLimitReachedPayload,\n});\n\n/**\n * Event: Subscription status has changed.\n */\nexport const SubscriptionChangedEvent = defineEvent({\n meta: {\n key: 'billing.subscription.changed',\n version: 1,\n description: 'Subscription status has changed.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['billing', 'subscription', 'changed'],\n },\n payload: SubscriptionChangedPayload,\n});\n"],"mappings":";;;;;;;AAMA,MAAM,uBAAuB,kBAAkB;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;EACN,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,UAAU;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACpE,eAAe;GACb,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,YAAY;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EACnE;CACF,CAAC;;;;AAKF,MAAM,2BAA2B,kBAAkB;CACjD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,OAAO;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACjE,cAAc;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAM,6BAA6B,kBAAkB;CACnD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,cAAc;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EAC1E,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAa,qBAAqB,YAAY;CAC5C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM;GAAC;GAAW;GAAS;GAAW;EACvC;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,yBAAyB,YAAY;CAChD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM;GAAC;GAAW;GAAS;GAAU;EACtC;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,2BAA2B,YAAY;CAClD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM;GAAC;GAAW;GAAgB;GAAU;EAC7C;CACD,SAAS;CACV,CAAC"}
|
|
1
|
+
{"version":3,"file":"billing.event.js","names":[],"sources":["../../src/billing/billing.event.ts"],"sourcesContent":["import { ScalarTypeEnum, defineSchemaModel } from '@contractspec/lib.schema';\nimport { defineEvent } from '@contractspec/lib.contracts';\n\n/**\n * Payload when feature usage is recorded.\n */\nconst UsageRecordedPayload = defineSchemaModel({\n name: 'UsageRecordedPayload',\n description: 'Payload when feature usage is recorded',\n fields: {\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n feature: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n quantity: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n billingPeriod: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n recordedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when usage limit is reached.\n */\nconst UsageLimitReachedPayload = defineSchemaModel({\n name: 'UsageLimitReachedPayload',\n description: 'Payload when usage limit is reached',\n fields: {\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n feature: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n limit: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n currentUsage: { type: ScalarTypeEnum.Int_unsecure(), isOptional: false },\n reachedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Payload when subscription status changes.\n */\nconst SubscriptionChangedPayload = defineSchemaModel({\n name: 'SubscriptionChangedPayload',\n description: 'Payload when subscription status changes',\n fields: {\n organizationId: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: false,\n },\n previousPlan: { type: ScalarTypeEnum.String_unsecure(), isOptional: true },\n newPlan: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n previousStatus: {\n type: ScalarTypeEnum.String_unsecure(),\n isOptional: true,\n },\n newStatus: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },\n changedAt: { type: ScalarTypeEnum.DateTime(), isOptional: false },\n },\n});\n\n/**\n * Event: Feature usage has been recorded.\n */\nexport const UsageRecordedEvent = defineEvent({\n meta: {\n key: 'billing.usage.recorded',\n version: '1.0.0',\n description: 'Feature usage has been recorded.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['billing', 'usage', 'recorded'],\n },\n payload: UsageRecordedPayload,\n});\n\n/**\n * Event: Usage limit has been reached for a feature.\n */\nexport const UsageLimitReachedEvent = defineEvent({\n meta: {\n key: 'billing.limit.reached',\n version: '1.0.0',\n description: 'Usage limit has been reached for a feature.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['billing', 'limit', 'reached'],\n },\n payload: UsageLimitReachedPayload,\n});\n\n/**\n * Event: Subscription status has changed.\n */\nexport const SubscriptionChangedEvent = defineEvent({\n meta: {\n key: 'billing.subscription.changed',\n version: '1.0.0',\n description: 'Subscription status has changed.',\n stability: 'stable',\n owners: ['@saas-team'],\n tags: ['billing', 'subscription', 'changed'],\n },\n payload: SubscriptionChangedPayload,\n});\n"],"mappings":";;;;;;;AAMA,MAAM,uBAAuB,kBAAkB;CAC7C,MAAM;CACN,aAAa;CACb,QAAQ;EACN,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,UAAU;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACpE,eAAe;GACb,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,YAAY;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EACnE;CACF,CAAC;;;;AAKF,MAAM,2BAA2B,kBAAkB;CACjD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,OAAO;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACjE,cAAc;GAAE,MAAM,eAAe,cAAc;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAM,6BAA6B,kBAAkB;CACnD,MAAM;CACN,aAAa;CACb,QAAQ;EACN,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,cAAc;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAM;EAC1E,SAAS;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACtE,gBAAgB;GACd,MAAM,eAAe,iBAAiB;GACtC,YAAY;GACb;EACD,WAAW;GAAE,MAAM,eAAe,iBAAiB;GAAE,YAAY;GAAO;EACxE,WAAW;GAAE,MAAM,eAAe,UAAU;GAAE,YAAY;GAAO;EAClE;CACF,CAAC;;;;AAKF,MAAa,qBAAqB,YAAY;CAC5C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM;GAAC;GAAW;GAAS;GAAW;EACvC;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,yBAAyB,YAAY;CAChD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM;GAAC;GAAW;GAAS;GAAU;EACtC;CACD,SAAS;CACV,CAAC;;;;AAKF,MAAa,2BAA2B,YAAY;CAClD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,aAAa;EACb,WAAW;EACX,QAAQ,CAAC,aAAa;EACtB,MAAM;GAAC;GAAW;GAAgB;GAAU;EAC7C;CACD,SAAS;CACV,CAAC"}
|
|
@@ -1,100 +1,100 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _contractspec_lib_schema306 from "@contractspec/lib.schema";
|
|
2
2
|
import * as _contractspec_lib_contracts11 from "@contractspec/lib.contracts";
|
|
3
3
|
|
|
4
4
|
//#region src/billing/billing.operations.d.ts
|
|
5
5
|
/**
|
|
6
6
|
* Get subscription status.
|
|
7
7
|
*/
|
|
8
|
-
declare const GetSubscriptionContract: _contractspec_lib_contracts11.OperationSpec<
|
|
8
|
+
declare const GetSubscriptionContract: _contractspec_lib_contracts11.OperationSpec<_contractspec_lib_schema306.AnySchemaModel, _contractspec_lib_schema306.SchemaModel<{
|
|
9
9
|
id: {
|
|
10
|
-
type:
|
|
10
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
11
11
|
isOptional: false;
|
|
12
12
|
};
|
|
13
13
|
organizationId: {
|
|
14
|
-
type:
|
|
14
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
15
15
|
isOptional: false;
|
|
16
16
|
};
|
|
17
17
|
planId: {
|
|
18
|
-
type:
|
|
18
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
19
19
|
isOptional: false;
|
|
20
20
|
};
|
|
21
21
|
planName: {
|
|
22
|
-
type:
|
|
22
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
23
23
|
isOptional: false;
|
|
24
24
|
};
|
|
25
25
|
status: {
|
|
26
|
-
type:
|
|
26
|
+
type: _contractspec_lib_schema306.EnumType<[string, string, string, string, string]>;
|
|
27
27
|
isOptional: false;
|
|
28
28
|
};
|
|
29
29
|
currentPeriodStart: {
|
|
30
|
-
type:
|
|
30
|
+
type: _contractspec_lib_schema306.FieldType<Date, string>;
|
|
31
31
|
isOptional: false;
|
|
32
32
|
};
|
|
33
33
|
currentPeriodEnd: {
|
|
34
|
-
type:
|
|
34
|
+
type: _contractspec_lib_schema306.FieldType<Date, string>;
|
|
35
35
|
isOptional: false;
|
|
36
36
|
};
|
|
37
37
|
trialEndsAt: {
|
|
38
|
-
type:
|
|
38
|
+
type: _contractspec_lib_schema306.FieldType<Date, string>;
|
|
39
39
|
isOptional: true;
|
|
40
40
|
};
|
|
41
41
|
cancelAtPeriodEnd: {
|
|
42
|
-
type:
|
|
42
|
+
type: _contractspec_lib_schema306.FieldType<boolean, boolean>;
|
|
43
43
|
isOptional: false;
|
|
44
44
|
};
|
|
45
45
|
}>, undefined>;
|
|
46
46
|
/**
|
|
47
47
|
* Record feature usage.
|
|
48
48
|
*/
|
|
49
|
-
declare const RecordUsageContract: _contractspec_lib_contracts11.OperationSpec<
|
|
49
|
+
declare const RecordUsageContract: _contractspec_lib_contracts11.OperationSpec<_contractspec_lib_schema306.SchemaModel<{
|
|
50
50
|
feature: {
|
|
51
|
-
type:
|
|
51
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
52
52
|
isOptional: false;
|
|
53
53
|
};
|
|
54
54
|
quantity: {
|
|
55
|
-
type:
|
|
55
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
56
56
|
isOptional: false;
|
|
57
57
|
};
|
|
58
58
|
sourceId: {
|
|
59
|
-
type:
|
|
59
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
60
60
|
isOptional: true;
|
|
61
61
|
};
|
|
62
62
|
sourceType: {
|
|
63
|
-
type:
|
|
63
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
64
64
|
isOptional: true;
|
|
65
65
|
};
|
|
66
66
|
metadata: {
|
|
67
|
-
type:
|
|
67
|
+
type: _contractspec_lib_schema306.FieldType<Record<string, unknown>, Record<string, unknown>>;
|
|
68
68
|
isOptional: true;
|
|
69
69
|
};
|
|
70
|
-
}>,
|
|
70
|
+
}>, _contractspec_lib_schema306.SchemaModel<{
|
|
71
71
|
recorded: {
|
|
72
|
-
type:
|
|
72
|
+
type: _contractspec_lib_schema306.FieldType<boolean, boolean>;
|
|
73
73
|
isOptional: false;
|
|
74
74
|
};
|
|
75
75
|
currentUsage: {
|
|
76
|
-
type:
|
|
76
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
77
77
|
isOptional: false;
|
|
78
78
|
};
|
|
79
79
|
limit: {
|
|
80
|
-
type:
|
|
80
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
81
81
|
isOptional: true;
|
|
82
82
|
};
|
|
83
83
|
limitReached: {
|
|
84
|
-
type:
|
|
84
|
+
type: _contractspec_lib_schema306.FieldType<boolean, boolean>;
|
|
85
85
|
isOptional: false;
|
|
86
86
|
};
|
|
87
87
|
}>, {
|
|
88
88
|
key: string;
|
|
89
|
-
version:
|
|
89
|
+
version: string;
|
|
90
90
|
when: string;
|
|
91
|
-
payload:
|
|
91
|
+
payload: _contractspec_lib_schema306.SchemaModel<{
|
|
92
92
|
feature: {
|
|
93
|
-
type:
|
|
93
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
94
94
|
isOptional: false;
|
|
95
95
|
};
|
|
96
96
|
quantity: {
|
|
97
|
-
type:
|
|
97
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
98
98
|
isOptional: false;
|
|
99
99
|
};
|
|
100
100
|
}>;
|
|
@@ -102,36 +102,36 @@ declare const RecordUsageContract: _contractspec_lib_contracts11.OperationSpec<_
|
|
|
102
102
|
/**
|
|
103
103
|
* Get usage summary.
|
|
104
104
|
*/
|
|
105
|
-
declare const GetUsageSummaryContract: _contractspec_lib_contracts11.OperationSpec<
|
|
105
|
+
declare const GetUsageSummaryContract: _contractspec_lib_contracts11.OperationSpec<_contractspec_lib_schema306.SchemaModel<{
|
|
106
106
|
billingPeriod: {
|
|
107
|
-
type:
|
|
107
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
108
108
|
isOptional: true;
|
|
109
109
|
};
|
|
110
|
-
}>,
|
|
110
|
+
}>, _contractspec_lib_schema306.SchemaModel<{
|
|
111
111
|
billingPeriod: {
|
|
112
|
-
type:
|
|
112
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
113
113
|
isOptional: false;
|
|
114
114
|
};
|
|
115
115
|
usage: {
|
|
116
|
-
type:
|
|
116
|
+
type: _contractspec_lib_schema306.SchemaModel<{
|
|
117
117
|
feature: {
|
|
118
|
-
type:
|
|
118
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
119
119
|
isOptional: false;
|
|
120
120
|
};
|
|
121
121
|
used: {
|
|
122
|
-
type:
|
|
122
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
123
123
|
isOptional: false;
|
|
124
124
|
};
|
|
125
125
|
limit: {
|
|
126
|
-
type:
|
|
126
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
127
127
|
isOptional: true;
|
|
128
128
|
};
|
|
129
129
|
unit: {
|
|
130
|
-
type:
|
|
130
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
131
131
|
isOptional: true;
|
|
132
132
|
};
|
|
133
133
|
percentage: {
|
|
134
|
-
type:
|
|
134
|
+
type: _contractspec_lib_schema306.FieldType<number, number>;
|
|
135
135
|
isOptional: true;
|
|
136
136
|
};
|
|
137
137
|
}>;
|
|
@@ -142,22 +142,22 @@ declare const GetUsageSummaryContract: _contractspec_lib_contracts11.OperationSp
|
|
|
142
142
|
/**
|
|
143
143
|
* Check feature access.
|
|
144
144
|
*/
|
|
145
|
-
declare const CheckFeatureAccessContract: _contractspec_lib_contracts11.OperationSpec<
|
|
145
|
+
declare const CheckFeatureAccessContract: _contractspec_lib_contracts11.OperationSpec<_contractspec_lib_schema306.SchemaModel<{
|
|
146
146
|
feature: {
|
|
147
|
-
type:
|
|
147
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
148
148
|
isOptional: false;
|
|
149
149
|
};
|
|
150
|
-
}>,
|
|
150
|
+
}>, _contractspec_lib_schema306.SchemaModel<{
|
|
151
151
|
hasAccess: {
|
|
152
|
-
type:
|
|
152
|
+
type: _contractspec_lib_schema306.FieldType<boolean, boolean>;
|
|
153
153
|
isOptional: false;
|
|
154
154
|
};
|
|
155
155
|
reason: {
|
|
156
|
-
type:
|
|
156
|
+
type: _contractspec_lib_schema306.EnumType<[string, string, string, string]>;
|
|
157
157
|
isOptional: true;
|
|
158
158
|
};
|
|
159
159
|
upgradeUrl: {
|
|
160
|
-
type:
|
|
160
|
+
type: _contractspec_lib_schema306.FieldType<string, string>;
|
|
161
161
|
isOptional: true;
|
|
162
162
|
};
|
|
163
163
|
}>, undefined>;
|
|
@@ -9,7 +9,7 @@ const OWNERS = ["@example.saas-boilerplate"];
|
|
|
9
9
|
const GetSubscriptionContract = defineQuery({
|
|
10
10
|
meta: {
|
|
11
11
|
key: "saas.billing.subscription.get",
|
|
12
|
-
version: 1,
|
|
12
|
+
version: "1.0.0",
|
|
13
13
|
stability: "stable",
|
|
14
14
|
owners: [...OWNERS],
|
|
15
15
|
tags: [
|
|
@@ -50,7 +50,7 @@ const GetSubscriptionContract = defineQuery({
|
|
|
50
50
|
const RecordUsageContract = defineCommand({
|
|
51
51
|
meta: {
|
|
52
52
|
key: "saas.billing.usage.record",
|
|
53
|
-
version: 1,
|
|
53
|
+
version: "1.0.0",
|
|
54
54
|
stability: "stable",
|
|
55
55
|
owners: [...OWNERS],
|
|
56
56
|
tags: [
|
|
@@ -69,7 +69,7 @@ const RecordUsageContract = defineCommand({
|
|
|
69
69
|
policy: { auth: "user" },
|
|
70
70
|
sideEffects: { emits: [{
|
|
71
71
|
key: "billing.usage.recorded",
|
|
72
|
-
version: 1,
|
|
72
|
+
version: "1.0.0",
|
|
73
73
|
when: "Usage is recorded",
|
|
74
74
|
payload: UsageRecordedPayloadModel
|
|
75
75
|
}] },
|
|
@@ -100,7 +100,7 @@ const RecordUsageContract = defineCommand({
|
|
|
100
100
|
const GetUsageSummaryContract = defineQuery({
|
|
101
101
|
meta: {
|
|
102
102
|
key: "saas.billing.usage.summary",
|
|
103
|
-
version: 1,
|
|
103
|
+
version: "1.0.0",
|
|
104
104
|
stability: "stable",
|
|
105
105
|
owners: [...OWNERS],
|
|
106
106
|
tags: [
|
|
@@ -141,7 +141,7 @@ const GetUsageSummaryContract = defineQuery({
|
|
|
141
141
|
const CheckFeatureAccessContract = defineQuery({
|
|
142
142
|
meta: {
|
|
143
143
|
key: "saas.billing.feature.check",
|
|
144
|
-
version: 1,
|
|
144
|
+
version: "1.0.0",
|
|
145
145
|
stability: "stable",
|
|
146
146
|
owners: [...OWNERS],
|
|
147
147
|
tags: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"billing.operations.js","names":[],"sources":["../../src/billing/billing.operations.ts"],"sourcesContent":["import { defineCommand, defineQuery } from '@contractspec/lib.contracts';\nimport {\n CheckFeatureAccessInputModel,\n CheckFeatureAccessOutputModel,\n GetUsageSummaryInputModel,\n GetUsageSummaryOutputModel,\n RecordUsageInputModel,\n RecordUsageOutputModel,\n SubscriptionModel,\n UsageRecordedPayloadModel,\n} from './billing.schema';\n\nconst OWNERS = ['@example.saas-boilerplate'] as const;\n\n/**\n * Get subscription status.\n */\nexport const GetSubscriptionContract = defineQuery({\n meta: {\n key: 'saas.billing.subscription.get',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'subscription'],\n description: 'Get organization subscription status.',\n goal: 'Show current plan and billing status.',\n context: 'Billing page, plan upgrade prompts.',\n },\n io: {\n input: null,\n output: SubscriptionModel,\n },\n policy: {\n auth: 'user',\n },\n acceptance: {\n scenarios: [\n {\n key: 'get-subscription-happy-path',\n given: ['Organization has active subscription'],\n when: ['User requests subscription status'],\n then: ['Subscription details are returned'],\n },\n ],\n examples: [\n {\n key: 'get-basic',\n input: null,\n output: {\n plan: 'pro',\n status: 'active',\n currentPeriodEnd: '2025-02-01T00:00:00Z',\n },\n },\n ],\n },\n});\n\n/**\n * Record feature usage.\n */\nexport const RecordUsageContract = defineCommand({\n meta: {\n key: 'saas.billing.usage.record',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'usage'],\n description: 'Record usage of a metered feature.',\n goal: 'Track feature usage for billing.',\n context: 'Called by services when metered features are used.',\n },\n io: {\n input: RecordUsageInputModel,\n output: RecordUsageOutputModel,\n },\n policy: {\n auth: 'user',\n },\n sideEffects: {\n emits: [\n {\n key: 'billing.usage.recorded',\n version: 1,\n when: 'Usage is recorded',\n payload: UsageRecordedPayloadModel,\n },\n ],\n },\n acceptance: {\n scenarios: [\n {\n key: 'record-usage-happy-path',\n given: ['Organization exists'],\n when: ['System records feature usage'],\n then: ['Usage is recorded'],\n },\n ],\n examples: [\n {\n key: 'record-api-call',\n input: { feature: 'api_calls', quantity: 1, idempotencyKey: 'abc-123' },\n output: { recorded: true, currentUsage: 100 },\n },\n ],\n },\n});\n\n/**\n * Get usage summary.\n */\nexport const GetUsageSummaryContract = defineQuery({\n meta: {\n key: 'saas.billing.usage.summary',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'usage'],\n description: 'Get usage summary for the current billing period.',\n goal: 'Show usage vs limits.',\n context: 'Billing page, usage dashboards.',\n },\n io: {\n input: GetUsageSummaryInputModel,\n output: GetUsageSummaryOutputModel,\n },\n policy: {\n auth: 'user',\n },\n acceptance: {\n scenarios: [\n {\n key: 'get-usage-happy-path',\n given: ['Organization has usage history'],\n when: ['User requests usage summary'],\n then: ['Usage metrics are returned'],\n },\n ],\n examples: [\n {\n key: 'get-current-usage',\n input: { period: 'current' },\n output: { features: [{ name: 'api_calls', used: 100, limit: 1000 }] },\n },\n ],\n },\n});\n\n/**\n * Check feature access.\n */\nexport const CheckFeatureAccessContract = defineQuery({\n meta: {\n key: 'saas.billing.feature.check',\n version: 1,\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'feature'],\n description: 'Check if organization has access to a feature.',\n goal: 'Gate features based on plan/usage.',\n context: 'Feature access checks, upgrade prompts.',\n },\n io: {\n input: CheckFeatureAccessInputModel,\n output: CheckFeatureAccessOutputModel,\n },\n policy: {\n auth: 'user',\n },\n acceptance: {\n scenarios: [\n {\n key: 'check-access-granted',\n given: ['Organization is on Pro plan'],\n when: ['User checks access to Pro feature'],\n then: ['Access is granted'],\n },\n ],\n examples: [\n {\n key: 'check-advanced-reports',\n input: { feature: 'advanced_reports' },\n output: { hasAccess: true, reason: 'Included in Pro plan' },\n },\n ],\n },\n});\n"],"mappings":";;;;AAYA,MAAM,SAAS,CAAC,4BAA4B;;;;AAK5C,MAAa,0BAA0B,YAAY;CACjD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAe;EACzC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,uCAAuC;GAC/C,MAAM,CAAC,oCAAoC;GAC3C,MAAM,CAAC,oCAAoC;GAC5C,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO;GACP,QAAQ;IACN,MAAM;IACN,QAAQ;IACR,kBAAkB;IACnB;GACF,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,sBAAsB,cAAc;CAC/C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAQ;EAClC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,aAAa,EACX,OAAO,CACL;EACE,KAAK;EACL,SAAS;EACT,MAAM;EACN,SAAS;EACV,CACF,EACF;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,sBAAsB;GAC9B,MAAM,CAAC,+BAA+B;GACtC,MAAM,CAAC,oBAAoB;GAC5B,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO;IAAE,SAAS;IAAa,UAAU;IAAG,gBAAgB;IAAW;GACvE,QAAQ;IAAE,UAAU;IAAM,cAAc;IAAK;GAC9C,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,0BAA0B,YAAY;CACjD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAQ;EAClC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,iCAAiC;GACzC,MAAM,CAAC,8BAA8B;GACrC,MAAM,CAAC,6BAA6B;GACrC,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO,EAAE,QAAQ,WAAW;GAC5B,QAAQ,EAAE,UAAU,CAAC;IAAE,MAAM;IAAa,MAAM;IAAK,OAAO;IAAM,CAAC,EAAE;GACtE,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,6BAA6B,YAAY;CACpD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAU;EACpC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,8BAA8B;GACtC,MAAM,CAAC,oCAAoC;GAC3C,MAAM,CAAC,oBAAoB;GAC5B,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO,EAAE,SAAS,oBAAoB;GACtC,QAAQ;IAAE,WAAW;IAAM,QAAQ;IAAwB;GAC5D,CACF;EACF;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"billing.operations.js","names":[],"sources":["../../src/billing/billing.operations.ts"],"sourcesContent":["import { defineCommand, defineQuery } from '@contractspec/lib.contracts';\nimport {\n CheckFeatureAccessInputModel,\n CheckFeatureAccessOutputModel,\n GetUsageSummaryInputModel,\n GetUsageSummaryOutputModel,\n RecordUsageInputModel,\n RecordUsageOutputModel,\n SubscriptionModel,\n UsageRecordedPayloadModel,\n} from './billing.schema';\n\nconst OWNERS = ['@example.saas-boilerplate'] as const;\n\n/**\n * Get subscription status.\n */\nexport const GetSubscriptionContract = defineQuery({\n meta: {\n key: 'saas.billing.subscription.get',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'subscription'],\n description: 'Get organization subscription status.',\n goal: 'Show current plan and billing status.',\n context: 'Billing page, plan upgrade prompts.',\n },\n io: {\n input: null,\n output: SubscriptionModel,\n },\n policy: {\n auth: 'user',\n },\n acceptance: {\n scenarios: [\n {\n key: 'get-subscription-happy-path',\n given: ['Organization has active subscription'],\n when: ['User requests subscription status'],\n then: ['Subscription details are returned'],\n },\n ],\n examples: [\n {\n key: 'get-basic',\n input: null,\n output: {\n plan: 'pro',\n status: 'active',\n currentPeriodEnd: '2025-02-01T00:00:00Z',\n },\n },\n ],\n },\n});\n\n/**\n * Record feature usage.\n */\nexport const RecordUsageContract = defineCommand({\n meta: {\n key: 'saas.billing.usage.record',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'usage'],\n description: 'Record usage of a metered feature.',\n goal: 'Track feature usage for billing.',\n context: 'Called by services when metered features are used.',\n },\n io: {\n input: RecordUsageInputModel,\n output: RecordUsageOutputModel,\n },\n policy: {\n auth: 'user',\n },\n sideEffects: {\n emits: [\n {\n key: 'billing.usage.recorded',\n version: '1.0.0',\n when: 'Usage is recorded',\n payload: UsageRecordedPayloadModel,\n },\n ],\n },\n acceptance: {\n scenarios: [\n {\n key: 'record-usage-happy-path',\n given: ['Organization exists'],\n when: ['System records feature usage'],\n then: ['Usage is recorded'],\n },\n ],\n examples: [\n {\n key: 'record-api-call',\n input: { feature: 'api_calls', quantity: 1, idempotencyKey: 'abc-123' },\n output: { recorded: true, currentUsage: 100 },\n },\n ],\n },\n});\n\n/**\n * Get usage summary.\n */\nexport const GetUsageSummaryContract = defineQuery({\n meta: {\n key: 'saas.billing.usage.summary',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'usage'],\n description: 'Get usage summary for the current billing period.',\n goal: 'Show usage vs limits.',\n context: 'Billing page, usage dashboards.',\n },\n io: {\n input: GetUsageSummaryInputModel,\n output: GetUsageSummaryOutputModel,\n },\n policy: {\n auth: 'user',\n },\n acceptance: {\n scenarios: [\n {\n key: 'get-usage-happy-path',\n given: ['Organization has usage history'],\n when: ['User requests usage summary'],\n then: ['Usage metrics are returned'],\n },\n ],\n examples: [\n {\n key: 'get-current-usage',\n input: { period: 'current' },\n output: { features: [{ name: 'api_calls', used: 100, limit: 1000 }] },\n },\n ],\n },\n});\n\n/**\n * Check feature access.\n */\nexport const CheckFeatureAccessContract = defineQuery({\n meta: {\n key: 'saas.billing.feature.check',\n version: '1.0.0',\n stability: 'stable',\n owners: [...OWNERS],\n tags: ['saas', 'billing', 'feature'],\n description: 'Check if organization has access to a feature.',\n goal: 'Gate features based on plan/usage.',\n context: 'Feature access checks, upgrade prompts.',\n },\n io: {\n input: CheckFeatureAccessInputModel,\n output: CheckFeatureAccessOutputModel,\n },\n policy: {\n auth: 'user',\n },\n acceptance: {\n scenarios: [\n {\n key: 'check-access-granted',\n given: ['Organization is on Pro plan'],\n when: ['User checks access to Pro feature'],\n then: ['Access is granted'],\n },\n ],\n examples: [\n {\n key: 'check-advanced-reports',\n input: { feature: 'advanced_reports' },\n output: { hasAccess: true, reason: 'Included in Pro plan' },\n },\n ],\n },\n});\n"],"mappings":";;;;AAYA,MAAM,SAAS,CAAC,4BAA4B;;;;AAK5C,MAAa,0BAA0B,YAAY;CACjD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAe;EACzC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,uCAAuC;GAC/C,MAAM,CAAC,oCAAoC;GAC3C,MAAM,CAAC,oCAAoC;GAC5C,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO;GACP,QAAQ;IACN,MAAM;IACN,QAAQ;IACR,kBAAkB;IACnB;GACF,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,sBAAsB,cAAc;CAC/C,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAQ;EAClC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,aAAa,EACX,OAAO,CACL;EACE,KAAK;EACL,SAAS;EACT,MAAM;EACN,SAAS;EACV,CACF,EACF;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,sBAAsB;GAC9B,MAAM,CAAC,+BAA+B;GACtC,MAAM,CAAC,oBAAoB;GAC5B,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO;IAAE,SAAS;IAAa,UAAU;IAAG,gBAAgB;IAAW;GACvE,QAAQ;IAAE,UAAU;IAAM,cAAc;IAAK;GAC9C,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,0BAA0B,YAAY;CACjD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAQ;EAClC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,iCAAiC;GACzC,MAAM,CAAC,8BAA8B;GACrC,MAAM,CAAC,6BAA6B;GACrC,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO,EAAE,QAAQ,WAAW;GAC5B,QAAQ,EAAE,UAAU,CAAC;IAAE,MAAM;IAAa,MAAM;IAAK,OAAO;IAAM,CAAC,EAAE;GACtE,CACF;EACF;CACF,CAAC;;;;AAKF,MAAa,6BAA6B,YAAY;CACpD,MAAM;EACJ,KAAK;EACL,SAAS;EACT,WAAW;EACX,QAAQ,CAAC,GAAG,OAAO;EACnB,MAAM;GAAC;GAAQ;GAAW;GAAU;EACpC,aAAa;EACb,MAAM;EACN,SAAS;EACV;CACD,IAAI;EACF,OAAO;EACP,QAAQ;EACT;CACD,QAAQ,EACN,MAAM,QACP;CACD,YAAY;EACV,WAAW,CACT;GACE,KAAK;GACL,OAAO,CAAC,8BAA8B;GACtC,MAAM,CAAC,oCAAoC;GAC3C,MAAM,CAAC,oBAAoB;GAC5B,CACF;EACD,UAAU,CACR;GACE,KAAK;GACL,OAAO,EAAE,SAAS,oBAAoB;GACtC,QAAQ;IAAE,WAAW;IAAM,QAAQ;IAAwB;GAC5D,CACF;EACF;CACF,CAAC"}
|