@tlog/shared 0.1.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 (50) hide show
  1. package/README.md +141 -0
  2. package/dist/builders.d.ts +27 -0
  3. package/dist/builders.d.ts.map +1 -0
  4. package/dist/builders.js +53 -0
  5. package/dist/builders.js.map +1 -0
  6. package/dist/domain.d.ts +64 -0
  7. package/dist/domain.d.ts.map +1 -0
  8. package/dist/domain.js +40 -0
  9. package/dist/domain.js.map +1 -0
  10. package/dist/filter.d.ts +27 -0
  11. package/dist/filter.d.ts.map +1 -0
  12. package/dist/filter.js +90 -0
  13. package/dist/filter.js.map +1 -0
  14. package/dist/id-index.d.ts +26 -0
  15. package/dist/id-index.d.ts.map +1 -0
  16. package/dist/id-index.js +99 -0
  17. package/dist/id-index.js.map +1 -0
  18. package/dist/index.d.ts +131 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +19 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/naming.d.ts +6 -0
  23. package/dist/naming.d.ts.map +1 -0
  24. package/dist/naming.js +32 -0
  25. package/dist/naming.js.map +1 -0
  26. package/dist/result.d.ts +25 -0
  27. package/dist/result.d.ts.map +1 -0
  28. package/dist/result.js +10 -0
  29. package/dist/result.js.map +1 -0
  30. package/dist/schemas.d.ts +299 -0
  31. package/dist/schemas.d.ts.map +1 -0
  32. package/dist/schemas.js +88 -0
  33. package/dist/schemas.js.map +1 -0
  34. package/dist/statistics.d.ts +20 -0
  35. package/dist/statistics.d.ts.map +1 -0
  36. package/dist/statistics.js +59 -0
  37. package/dist/statistics.js.map +1 -0
  38. package/dist/template.d.ts +23 -0
  39. package/dist/template.d.ts.map +1 -0
  40. package/dist/template.js +51 -0
  41. package/dist/template.js.map +1 -0
  42. package/dist/validation.d.ts +14 -0
  43. package/dist/validation.d.ts.map +1 -0
  44. package/dist/validation.js +77 -0
  45. package/dist/validation.js.map +1 -0
  46. package/dist/yaml-io.d.ts +10 -0
  47. package/dist/yaml-io.d.ts.map +1 -0
  48. package/dist/yaml-io.js +43 -0
  49. package/dist/yaml-io.js.map +1 -0
  50. package/package.json +28 -0
@@ -0,0 +1,131 @@
1
+ import { z } from "zod";
2
+ import { testcaseStatusSchema, suiteSchema } from "./schemas.js";
3
+ export * from "./domain.js";
4
+ export * from "./schemas.js";
5
+ export * from "./validation.js";
6
+ export * from "./yaml-io.js";
7
+ export * from "./id-index.js";
8
+ export * from "./naming.js";
9
+ export * from "./builders.js";
10
+ export * from "./filter.js";
11
+ export * from "./statistics.js";
12
+ export * from "./template.js";
13
+ export * from "./result.js";
14
+ export declare const tlogSuiteSchema: z.ZodObject<{
15
+ id: z.ZodString;
16
+ title: z.ZodString;
17
+ tags: z.ZodArray<z.ZodString, "many">;
18
+ description: z.ZodString;
19
+ scoped: z.ZodBoolean;
20
+ owners: z.ZodArray<z.ZodString, "many">;
21
+ duration: z.ZodObject<{
22
+ scheduled: z.ZodObject<{
23
+ start: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
24
+ end: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ start: string & {
27
+ readonly __tlogDateBrand: "TlogDateString";
28
+ };
29
+ end: string & {
30
+ readonly __tlogDateBrand: "TlogDateString";
31
+ };
32
+ }, {
33
+ start: string;
34
+ end: string;
35
+ }>;
36
+ actual: z.ZodObject<{
37
+ start: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
38
+ end: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
39
+ }, "strip", z.ZodTypeAny, {
40
+ start: string & {
41
+ readonly __tlogDateBrand: "TlogDateString";
42
+ };
43
+ end: string & {
44
+ readonly __tlogDateBrand: "TlogDateString";
45
+ };
46
+ }, {
47
+ start: string;
48
+ end: string;
49
+ }>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ scheduled: {
52
+ start: string & {
53
+ readonly __tlogDateBrand: "TlogDateString";
54
+ };
55
+ end: string & {
56
+ readonly __tlogDateBrand: "TlogDateString";
57
+ };
58
+ };
59
+ actual: {
60
+ start: string & {
61
+ readonly __tlogDateBrand: "TlogDateString";
62
+ };
63
+ end: string & {
64
+ readonly __tlogDateBrand: "TlogDateString";
65
+ };
66
+ };
67
+ }, {
68
+ scheduled: {
69
+ start: string;
70
+ end: string;
71
+ };
72
+ actual: {
73
+ start: string;
74
+ end: string;
75
+ };
76
+ }>;
77
+ related: z.ZodArray<z.ZodString, "many">;
78
+ remarks: z.ZodArray<z.ZodString, "many">;
79
+ }, "strict", z.ZodTypeAny, {
80
+ id: string;
81
+ title: string;
82
+ tags: string[];
83
+ description: string;
84
+ scoped: boolean;
85
+ owners: string[];
86
+ duration: {
87
+ scheduled: {
88
+ start: string & {
89
+ readonly __tlogDateBrand: "TlogDateString";
90
+ };
91
+ end: string & {
92
+ readonly __tlogDateBrand: "TlogDateString";
93
+ };
94
+ };
95
+ actual: {
96
+ start: string & {
97
+ readonly __tlogDateBrand: "TlogDateString";
98
+ };
99
+ end: string & {
100
+ readonly __tlogDateBrand: "TlogDateString";
101
+ };
102
+ };
103
+ };
104
+ related: string[];
105
+ remarks: string[];
106
+ }, {
107
+ id: string;
108
+ title: string;
109
+ tags: string[];
110
+ description: string;
111
+ scoped: boolean;
112
+ owners: string[];
113
+ duration: {
114
+ scheduled: {
115
+ start: string;
116
+ end: string;
117
+ };
118
+ actual: {
119
+ start: string;
120
+ end: string;
121
+ };
122
+ };
123
+ related: string[];
124
+ remarks: string[];
125
+ }>;
126
+ export declare const tlogStatusSchema: z.ZodEnum<["todo", "doing", "done"]>;
127
+ export type TlogStatus = z.infer<typeof testcaseStatusSchema>;
128
+ export type TlogSuite = z.infer<typeof suiteSchema>;
129
+ export { defaultSuite as defaultTlogSuite } from "./domain.js";
130
+ export declare function isTlogStatus(value: string): value is TlogStatus;
131
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjE,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAE5B,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAc,CAAC;AAC3C,eAAO,MAAM,gBAAgB,sCAAuB,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEpD,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ import { testcaseStatusSchema, suiteSchema } from "./schemas.js";
2
+ export * from "./domain.js";
3
+ export * from "./schemas.js";
4
+ export * from "./validation.js";
5
+ export * from "./yaml-io.js";
6
+ export * from "./id-index.js";
7
+ export * from "./naming.js";
8
+ export * from "./builders.js";
9
+ export * from "./filter.js";
10
+ export * from "./statistics.js";
11
+ export * from "./template.js";
12
+ export * from "./result.js";
13
+ export const tlogSuiteSchema = suiteSchema;
14
+ export const tlogStatusSchema = testcaseStatusSchema;
15
+ export { defaultSuite as defaultTlogSuite } from "./domain.js";
16
+ export function isTlogStatus(value) {
17
+ return testcaseStatusSchema.safeParse(value).success;
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjE,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAE5B,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAKrD,OAAO,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function slugifyTitle(title: string): string;
2
+ export declare function ensureUniqueSlug(baseSlug: string, usedSlugs: Set<string>): string;
3
+ export declare function buildSuiteFileName(id: string, title: string): string;
4
+ export declare function buildCaseFileName(id: string, title: string): string;
5
+ export declare function normalizeTlogPath(input: string): string;
6
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEvD"}
package/dist/naming.js ADDED
@@ -0,0 +1,32 @@
1
+ import { normalize, sep } from "node:path";
2
+ export function slugifyTitle(title) {
3
+ const normalized = title
4
+ .trim()
5
+ .toLowerCase()
6
+ .replace(/[^a-z0-9]+/g, "-")
7
+ .replace(/^-+|-+$/g, "");
8
+ return normalized.length > 0 ? normalized : "untitled";
9
+ }
10
+ export function ensureUniqueSlug(baseSlug, usedSlugs) {
11
+ if (!usedSlugs.has(baseSlug)) {
12
+ usedSlugs.add(baseSlug);
13
+ return baseSlug;
14
+ }
15
+ let suffix = 2;
16
+ while (usedSlugs.has(`${baseSlug}-${suffix}`)) {
17
+ suffix += 1;
18
+ }
19
+ const slug = `${baseSlug}-${suffix}`;
20
+ usedSlugs.add(slug);
21
+ return slug;
22
+ }
23
+ export function buildSuiteFileName(id, title) {
24
+ return `${id}-${slugifyTitle(title)}.suite.yaml`;
25
+ }
26
+ export function buildCaseFileName(id, title) {
27
+ return `${id}-${slugifyTitle(title)}.testcase.yaml`;
28
+ }
29
+ export function normalizeTlogPath(input) {
30
+ return normalize(input).split(sep).join("/");
31
+ }
32
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK;SACrB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE3B,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAsB;IACvE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;IACrC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAU,EAAE,KAAa;IAC1D,OAAO,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAE,KAAa;IACzD,OAAO,GAAG,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,gBAAgB,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,25 @@
1
+ export type TlogErrorCode = "validation" | "conflict" | "io" | "security";
2
+ export interface TlogWarning {
3
+ code: string;
4
+ message: string;
5
+ path?: string;
6
+ }
7
+ export interface TlogError {
8
+ code: TlogErrorCode;
9
+ message: string;
10
+ path?: string;
11
+ cause?: unknown;
12
+ }
13
+ export type Result<T, E = TlogError> = {
14
+ ok: true;
15
+ data: T;
16
+ warnings: TlogWarning[];
17
+ } | {
18
+ ok: false;
19
+ error: E;
20
+ warnings: TlogWarning[];
21
+ };
22
+ export declare function ok<T>(data: T, warnings?: TlogWarning[]): Result<T>;
23
+ export declare function err<E = TlogError>(error: E, warnings?: TlogWarning[]): Result<never, E>;
24
+ export declare function serializeResult<T, E>(result: Result<T, E>): string;
25
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,IAAI,GAAG,UAAU,CAAC;AAE1E,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,IAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC;AAErD,wBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,GAAE,WAAW,EAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAEtE;AAED,wBAAgB,GAAG,CAAC,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,GAAE,WAAW,EAAO,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAE3F;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAElE"}
package/dist/result.js ADDED
@@ -0,0 +1,10 @@
1
+ export function ok(data, warnings = []) {
2
+ return { ok: true, data, warnings };
3
+ }
4
+ export function err(error, warnings = []) {
5
+ return { ok: false, error, warnings };
6
+ }
7
+ export function serializeResult(result) {
8
+ return JSON.stringify(result, null, 2);
9
+ }
10
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,EAAE,CAAI,IAAO,EAAE,WAA0B,EAAE;IACzD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,GAAG,CAAgB,KAAQ,EAAE,WAA0B,EAAE;IACvE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,eAAe,CAAO,MAAoB;IACxD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,299 @@
1
+ import { z } from "zod";
2
+ export declare const testcaseStatusSchema: z.ZodEnum<["todo", "doing", "done"]>;
3
+ export declare const testResultStatusSchema: z.ZodEnum<["pass", "fail", "skip", "block"]>;
4
+ export declare const issueStatusSchema: z.ZodEnum<["open", "doing", "resolved", "pending"]>;
5
+ export declare const suiteSchema: z.ZodObject<{
6
+ id: z.ZodString;
7
+ title: z.ZodString;
8
+ tags: z.ZodArray<z.ZodString, "many">;
9
+ description: z.ZodString;
10
+ scoped: z.ZodBoolean;
11
+ owners: z.ZodArray<z.ZodString, "many">;
12
+ duration: z.ZodObject<{
13
+ scheduled: z.ZodObject<{
14
+ start: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
15
+ end: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ start: string & {
18
+ readonly __tlogDateBrand: "TlogDateString";
19
+ };
20
+ end: string & {
21
+ readonly __tlogDateBrand: "TlogDateString";
22
+ };
23
+ }, {
24
+ start: string;
25
+ end: string;
26
+ }>;
27
+ actual: z.ZodObject<{
28
+ start: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
29
+ end: z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ start: string & {
32
+ readonly __tlogDateBrand: "TlogDateString";
33
+ };
34
+ end: string & {
35
+ readonly __tlogDateBrand: "TlogDateString";
36
+ };
37
+ }, {
38
+ start: string;
39
+ end: string;
40
+ }>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ scheduled: {
43
+ start: string & {
44
+ readonly __tlogDateBrand: "TlogDateString";
45
+ };
46
+ end: string & {
47
+ readonly __tlogDateBrand: "TlogDateString";
48
+ };
49
+ };
50
+ actual: {
51
+ start: string & {
52
+ readonly __tlogDateBrand: "TlogDateString";
53
+ };
54
+ end: string & {
55
+ readonly __tlogDateBrand: "TlogDateString";
56
+ };
57
+ };
58
+ }, {
59
+ scheduled: {
60
+ start: string;
61
+ end: string;
62
+ };
63
+ actual: {
64
+ start: string;
65
+ end: string;
66
+ };
67
+ }>;
68
+ related: z.ZodArray<z.ZodString, "many">;
69
+ remarks: z.ZodArray<z.ZodString, "many">;
70
+ }, "strict", z.ZodTypeAny, {
71
+ id: string;
72
+ title: string;
73
+ tags: string[];
74
+ description: string;
75
+ scoped: boolean;
76
+ owners: string[];
77
+ duration: {
78
+ scheduled: {
79
+ start: string & {
80
+ readonly __tlogDateBrand: "TlogDateString";
81
+ };
82
+ end: string & {
83
+ readonly __tlogDateBrand: "TlogDateString";
84
+ };
85
+ };
86
+ actual: {
87
+ start: string & {
88
+ readonly __tlogDateBrand: "TlogDateString";
89
+ };
90
+ end: string & {
91
+ readonly __tlogDateBrand: "TlogDateString";
92
+ };
93
+ };
94
+ };
95
+ related: string[];
96
+ remarks: string[];
97
+ }, {
98
+ id: string;
99
+ title: string;
100
+ tags: string[];
101
+ description: string;
102
+ scoped: boolean;
103
+ owners: string[];
104
+ duration: {
105
+ scheduled: {
106
+ start: string;
107
+ end: string;
108
+ };
109
+ actual: {
110
+ start: string;
111
+ end: string;
112
+ };
113
+ };
114
+ related: string[];
115
+ remarks: string[];
116
+ }>;
117
+ export declare const testItemSchema: z.ZodObject<{
118
+ name: z.ZodString;
119
+ expected: z.ZodString;
120
+ actual: z.ZodString;
121
+ trails: z.ZodArray<z.ZodString, "many">;
122
+ status: z.ZodNullable<z.ZodEnum<["pass", "fail", "skip", "block"]>>;
123
+ }, "strict", z.ZodTypeAny, {
124
+ expected: string;
125
+ status: "pass" | "fail" | "skip" | "block" | null;
126
+ actual: string;
127
+ name: string;
128
+ trails: string[];
129
+ }, {
130
+ expected: string;
131
+ status: "pass" | "fail" | "skip" | "block" | null;
132
+ actual: string;
133
+ name: string;
134
+ trails: string[];
135
+ }>;
136
+ export declare const issueSchema: z.ZodEffects<z.ZodObject<{
137
+ incident: z.ZodString;
138
+ owners: z.ZodArray<z.ZodString, "many">;
139
+ causes: z.ZodArray<z.ZodString, "many">;
140
+ solutions: z.ZodArray<z.ZodString, "many">;
141
+ status: z.ZodEnum<["open", "doing", "resolved", "pending"]>;
142
+ detectedDay: z.ZodNullable<z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>>;
143
+ completedDay: z.ZodNullable<z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>>;
144
+ related: z.ZodArray<z.ZodString, "many">;
145
+ remarks: z.ZodArray<z.ZodString, "many">;
146
+ }, "strict", z.ZodTypeAny, {
147
+ status: "doing" | "open" | "resolved" | "pending";
148
+ owners: string[];
149
+ related: string[];
150
+ remarks: string[];
151
+ incident: string;
152
+ causes: string[];
153
+ solutions: string[];
154
+ detectedDay: import("./domain.js").TlogDateString | null;
155
+ completedDay: import("./domain.js").TlogDateString | null;
156
+ }, {
157
+ status: "doing" | "open" | "resolved" | "pending";
158
+ owners: string[];
159
+ related: string[];
160
+ remarks: string[];
161
+ incident: string;
162
+ causes: string[];
163
+ solutions: string[];
164
+ detectedDay: string | null;
165
+ completedDay: string | null;
166
+ }>, {
167
+ status: "doing" | "open" | "resolved" | "pending";
168
+ owners: string[];
169
+ related: string[];
170
+ remarks: string[];
171
+ incident: string;
172
+ causes: string[];
173
+ solutions: string[];
174
+ detectedDay: import("./domain.js").TlogDateString | null;
175
+ completedDay: import("./domain.js").TlogDateString | null;
176
+ }, unknown>;
177
+ export declare const testCaseSchema: z.ZodObject<{
178
+ id: z.ZodString;
179
+ title: z.ZodString;
180
+ tags: z.ZodArray<z.ZodString, "many">;
181
+ description: z.ZodString;
182
+ scoped: z.ZodBoolean;
183
+ status: z.ZodNullable<z.ZodEnum<["todo", "doing", "done"]>>;
184
+ operations: z.ZodArray<z.ZodString, "many">;
185
+ related: z.ZodArray<z.ZodString, "many">;
186
+ remarks: z.ZodArray<z.ZodString, "many">;
187
+ completedDay: z.ZodNullable<z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>>;
188
+ tests: z.ZodArray<z.ZodObject<{
189
+ name: z.ZodString;
190
+ expected: z.ZodString;
191
+ actual: z.ZodString;
192
+ trails: z.ZodArray<z.ZodString, "many">;
193
+ status: z.ZodNullable<z.ZodEnum<["pass", "fail", "skip", "block"]>>;
194
+ }, "strict", z.ZodTypeAny, {
195
+ expected: string;
196
+ status: "pass" | "fail" | "skip" | "block" | null;
197
+ actual: string;
198
+ name: string;
199
+ trails: string[];
200
+ }, {
201
+ expected: string;
202
+ status: "pass" | "fail" | "skip" | "block" | null;
203
+ actual: string;
204
+ name: string;
205
+ trails: string[];
206
+ }>, "many">;
207
+ issues: z.ZodArray<z.ZodEffects<z.ZodObject<{
208
+ incident: z.ZodString;
209
+ owners: z.ZodArray<z.ZodString, "many">;
210
+ causes: z.ZodArray<z.ZodString, "many">;
211
+ solutions: z.ZodArray<z.ZodString, "many">;
212
+ status: z.ZodEnum<["open", "doing", "resolved", "pending"]>;
213
+ detectedDay: z.ZodNullable<z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>>;
214
+ completedDay: z.ZodNullable<z.ZodEffects<z.ZodString, import("./domain.js").TlogDateString, string>>;
215
+ related: z.ZodArray<z.ZodString, "many">;
216
+ remarks: z.ZodArray<z.ZodString, "many">;
217
+ }, "strict", z.ZodTypeAny, {
218
+ status: "doing" | "open" | "resolved" | "pending";
219
+ owners: string[];
220
+ related: string[];
221
+ remarks: string[];
222
+ incident: string;
223
+ causes: string[];
224
+ solutions: string[];
225
+ detectedDay: import("./domain.js").TlogDateString | null;
226
+ completedDay: import("./domain.js").TlogDateString | null;
227
+ }, {
228
+ status: "doing" | "open" | "resolved" | "pending";
229
+ owners: string[];
230
+ related: string[];
231
+ remarks: string[];
232
+ incident: string;
233
+ causes: string[];
234
+ solutions: string[];
235
+ detectedDay: string | null;
236
+ completedDay: string | null;
237
+ }>, {
238
+ status: "doing" | "open" | "resolved" | "pending";
239
+ owners: string[];
240
+ related: string[];
241
+ remarks: string[];
242
+ incident: string;
243
+ causes: string[];
244
+ solutions: string[];
245
+ detectedDay: import("./domain.js").TlogDateString | null;
246
+ completedDay: import("./domain.js").TlogDateString | null;
247
+ }, unknown>, "many">;
248
+ }, "strict", z.ZodTypeAny, {
249
+ issues: {
250
+ status: "doing" | "open" | "resolved" | "pending";
251
+ owners: string[];
252
+ related: string[];
253
+ remarks: string[];
254
+ incident: string;
255
+ causes: string[];
256
+ solutions: string[];
257
+ detectedDay: import("./domain.js").TlogDateString | null;
258
+ completedDay: import("./domain.js").TlogDateString | null;
259
+ }[];
260
+ status: "todo" | "doing" | "done" | null;
261
+ id: string;
262
+ title: string;
263
+ tags: string[];
264
+ description: string;
265
+ scoped: boolean;
266
+ related: string[];
267
+ remarks: string[];
268
+ completedDay: import("./domain.js").TlogDateString | null;
269
+ operations: string[];
270
+ tests: {
271
+ expected: string;
272
+ status: "pass" | "fail" | "skip" | "block" | null;
273
+ actual: string;
274
+ name: string;
275
+ trails: string[];
276
+ }[];
277
+ }, {
278
+ issues: unknown[];
279
+ status: "todo" | "doing" | "done" | null;
280
+ id: string;
281
+ title: string;
282
+ tags: string[];
283
+ description: string;
284
+ scoped: boolean;
285
+ related: string[];
286
+ remarks: string[];
287
+ completedDay: string | null;
288
+ operations: string[];
289
+ tests: {
290
+ expected: string;
291
+ status: "pass" | "fail" | "skip" | "block" | null;
292
+ actual: string;
293
+ name: string;
294
+ trails: string[];
295
+ }[];
296
+ }>;
297
+ export type SuiteInput = z.input<typeof suiteSchema>;
298
+ export type TestCaseInput = z.input<typeof testCaseSchema>;
299
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAqBxB,eAAO,MAAM,oBAAoB,sCAAoC,CAAC;AAEtE,eAAO,MAAM,sBAAsB,8CAA4C,CAAC;AAEhF,eAAO,MAAM,iBAAiB,qDAAmD,CAAC;AAElF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYb,CAAC;AAEZ,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;EAQhB,CAAC;AAEZ,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BV,CAAC;AAEf,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAehB,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACrD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { z } from "zod";
2
+ import { isTlogDateString } from "./domain.js";
3
+ const dateStringSchema = z
4
+ .string()
5
+ .refine((value) => isTlogDateString(value), "Expected date format YYYY-MM-DD");
6
+ const nullableDateStringSchema = dateStringSchema.nullable();
7
+ const nonEmptyStringSchema = z.string().min(1);
8
+ const stringArraySchema = z.array(z.string());
9
+ const durationRangeSchema = z.object({
10
+ start: dateStringSchema,
11
+ end: dateStringSchema
12
+ });
13
+ const durationSchema = z.object({
14
+ scheduled: durationRangeSchema,
15
+ actual: durationRangeSchema
16
+ });
17
+ export const testcaseStatusSchema = z.enum(["todo", "doing", "done"]);
18
+ export const testResultStatusSchema = z.enum(["pass", "fail", "skip", "block"]);
19
+ export const issueStatusSchema = z.enum(["open", "doing", "resolved", "pending"]);
20
+ export const suiteSchema = z
21
+ .object({
22
+ id: nonEmptyStringSchema,
23
+ title: nonEmptyStringSchema,
24
+ tags: stringArraySchema,
25
+ description: z.string(),
26
+ scoped: z.boolean(),
27
+ owners: stringArraySchema,
28
+ duration: durationSchema,
29
+ related: stringArraySchema,
30
+ remarks: stringArraySchema
31
+ })
32
+ .strict();
33
+ export const testItemSchema = z
34
+ .object({
35
+ name: nonEmptyStringSchema,
36
+ expected: z.string(),
37
+ actual: z.string(),
38
+ trails: stringArraySchema,
39
+ status: testResultStatusSchema.nullable()
40
+ })
41
+ .strict();
42
+ export const issueSchema = z
43
+ .preprocess((raw) => {
44
+ if (!raw || typeof raw !== "object") {
45
+ return raw;
46
+ }
47
+ const data = raw;
48
+ const next = { ...data };
49
+ if (!Array.isArray(next.causes) && Array.isArray(data.cause)) {
50
+ next.causes = data.cause;
51
+ }
52
+ if (!Array.isArray(next.solutions) && Array.isArray(data.solution)) {
53
+ next.solutions = data.solution;
54
+ }
55
+ if (!Array.isArray(next.solutions) && Array.isArray(data.solutinos)) {
56
+ next.solutions = data.solutinos;
57
+ }
58
+ return next;
59
+ }, z
60
+ .object({
61
+ incident: nonEmptyStringSchema,
62
+ owners: stringArraySchema,
63
+ causes: stringArraySchema,
64
+ solutions: stringArraySchema,
65
+ status: issueStatusSchema,
66
+ detectedDay: nullableDateStringSchema,
67
+ completedDay: nullableDateStringSchema,
68
+ related: stringArraySchema,
69
+ remarks: stringArraySchema
70
+ })
71
+ .strict());
72
+ export const testCaseSchema = z
73
+ .object({
74
+ id: nonEmptyStringSchema,
75
+ title: nonEmptyStringSchema,
76
+ tags: stringArraySchema,
77
+ description: z.string(),
78
+ scoped: z.boolean(),
79
+ status: testcaseStatusSchema.nullable(),
80
+ operations: stringArraySchema,
81
+ related: stringArraySchema,
82
+ remarks: stringArraySchema,
83
+ completedDay: nullableDateStringSchema,
84
+ tests: z.array(testItemSchema),
85
+ issues: z.array(issueSchema)
86
+ })
87
+ .strict();
88
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { TestCase } from "./domain.js";
2
+ export interface StatusSummary {
3
+ todo: number;
4
+ doing: number;
5
+ done: number;
6
+ total: number;
7
+ }
8
+ export interface BurndownBucket {
9
+ date: string;
10
+ plannedCompleted: number;
11
+ actualCompleted: number;
12
+ }
13
+ export interface BurndownResult {
14
+ summary: StatusSummary;
15
+ buckets: BurndownBucket[];
16
+ anomalies: string[];
17
+ }
18
+ export declare function summarizeStatus(cases: TestCase[]): StatusSummary;
19
+ export declare function calculateBurndown(cases: TestCase[], start: string, end: string): BurndownResult;
20
+ //# sourceMappingURL=statistics.d.ts.map