@devp0nt/error0 1.0.0-next.49 → 1.0.0-next.50

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 (55) hide show
  1. package/dist/cjs/index.cjs +5 -17
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs/index.d.cts +64 -21
  4. package/dist/cjs/plugins/cause-serialize.cjs +1 -1
  5. package/dist/cjs/plugins/cause-serialize.cjs.map +1 -1
  6. package/dist/cjs/plugins/code.cjs +38 -0
  7. package/dist/cjs/plugins/code.cjs.map +1 -0
  8. package/dist/cjs/plugins/code.d.cts +7 -0
  9. package/dist/cjs/plugins/expected.cjs +2 -2
  10. package/dist/cjs/plugins/expected.cjs.map +1 -1
  11. package/dist/cjs/plugins/expected.d.cts +31 -2
  12. package/dist/cjs/plugins/meta.cjs +1 -1
  13. package/dist/cjs/plugins/meta.cjs.map +1 -1
  14. package/dist/cjs/plugins/stack-merge.cjs +1 -1
  15. package/dist/cjs/plugins/stack-merge.cjs.map +1 -1
  16. package/dist/cjs/plugins/status.cjs +54 -0
  17. package/dist/cjs/plugins/status.cjs.map +1 -0
  18. package/dist/cjs/plugins/status.d.cts +8 -0
  19. package/dist/cjs/plugins/tags.cjs +41 -21
  20. package/dist/cjs/plugins/tags.cjs.map +1 -1
  21. package/dist/cjs/plugins/tags.d.cts +7 -2
  22. package/dist/esm/index.d.ts +64 -21
  23. package/dist/esm/index.js +5 -17
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/plugins/cause-serialize.js +1 -1
  26. package/dist/esm/plugins/cause-serialize.js.map +1 -1
  27. package/dist/esm/plugins/code.d.ts +7 -0
  28. package/dist/esm/plugins/code.js +14 -0
  29. package/dist/esm/plugins/code.js.map +1 -0
  30. package/dist/esm/plugins/expected.d.ts +31 -2
  31. package/dist/esm/plugins/expected.js +2 -2
  32. package/dist/esm/plugins/expected.js.map +1 -1
  33. package/dist/esm/plugins/meta.js +1 -1
  34. package/dist/esm/plugins/meta.js.map +1 -1
  35. package/dist/esm/plugins/stack-merge.js +1 -1
  36. package/dist/esm/plugins/stack-merge.js.map +1 -1
  37. package/dist/esm/plugins/status.d.ts +8 -0
  38. package/dist/esm/plugins/status.js +30 -0
  39. package/dist/esm/plugins/status.js.map +1 -0
  40. package/dist/esm/plugins/tags.d.ts +7 -2
  41. package/dist/esm/plugins/tags.js +41 -21
  42. package/dist/esm/plugins/tags.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/index.test.ts +53 -7
  45. package/src/index.ts +107 -67
  46. package/src/plugins/cause-serialize.ts +1 -1
  47. package/src/plugins/code.test.ts +27 -0
  48. package/src/plugins/code.ts +12 -0
  49. package/src/plugins/expected.ts +2 -2
  50. package/src/plugins/meta.ts +1 -1
  51. package/src/plugins/stack-merge.ts +1 -1
  52. package/src/plugins/status.test.ts +54 -0
  53. package/src/plugins/status.ts +29 -0
  54. package/src/plugins/tags.test.ts +54 -2
  55. package/src/plugins/tags.ts +48 -24
@@ -1,27 +1,51 @@
1
1
  import { Error0 } from '../index.js'
2
2
 
3
- export const tagsPlugin = ({ hideWhenPublic = true }: { hideWhenPublic?: boolean } = {}) =>
4
- Error0.plugin().use('prop', 'tags', {
5
- init: (input: string[]) => input,
6
- resolve: ({ flow }) => {
7
- const merged: string[] = []
8
- for (const value of flow) {
9
- if (Array.isArray(value)) {
10
- merged.push(...value.filter((item): item is string => typeof item === 'string'))
11
- }
12
- }
13
- return merged.length > 0 ? Array.from(new Set(merged)) : undefined
14
- },
15
- serialize: ({ resolved, isPublic }) => {
16
- if (hideWhenPublic && isPublic) {
17
- return undefined
18
- }
19
- return resolved
20
- },
21
- deserialize: ({ value }) => {
22
- if (!Array.isArray(value)) {
23
- return undefined
3
+ export const tagsPlugin = <TTag extends string>({
4
+ hideWhenPublic = true,
5
+ tags,
6
+ strict = true,
7
+ }: { hideWhenPublic?: boolean; tags?: TTag[] | readonly TTag[]; strict?: boolean } = {}) => {
8
+ function hasTag(error: Error0, tag: TTag): boolean
9
+ function hasTag(error: Error0, tag: TTag[], policy: 'every' | 'some'): boolean
10
+ function hasTag(error: Error0, tag: TTag | TTag[], policy?: 'every' | 'some'): boolean {
11
+ const tags = (error as any).tags as string[] | undefined
12
+ if (!tags) {
13
+ return false
14
+ }
15
+ if (Array.isArray(tag)) {
16
+ if (policy === 'every') {
17
+ return tag.every((item) => tags.includes(item))
24
18
  }
25
- return value.filter((item): item is string => typeof item === 'string')
26
- },
27
- })
19
+ return tag.some((item) => tags.includes(item))
20
+ }
21
+ return tags.includes(tag)
22
+ }
23
+ const isTag = (value: unknown): value is TTag =>
24
+ typeof value === 'string' && (!tags || !strict || tags.includes(value as TTag))
25
+ return Error0.plugin()
26
+ .prop('tags', {
27
+ init: (input: string[]) => input,
28
+ resolve: ({ flow }) => {
29
+ const merged: string[] = []
30
+ for (const value of flow) {
31
+ if (Array.isArray(value)) {
32
+ merged.push(...value)
33
+ }
34
+ }
35
+ return merged.length > 0 ? Array.from(new Set(merged)) : undefined
36
+ },
37
+ serialize: ({ resolved, isPublic }) => {
38
+ if (hideWhenPublic && isPublic) {
39
+ return undefined
40
+ }
41
+ return resolved
42
+ },
43
+ deserialize: ({ value }) => {
44
+ if (!Array.isArray(value)) {
45
+ return undefined
46
+ }
47
+ return value.filter((item) => isTag(item))
48
+ },
49
+ })
50
+ .method('hasTag', hasTag)
51
+ }