@bgord/tools 0.12.14 → 0.12.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ import { z } from "zod/v4";
2
+ import { Filename } from "./filename.vo";
3
+ export declare const FilePathAbsoluteSchema: z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>, z.ZodTransform<{
4
+ directory: string & z.core.$brand<"absolute_directory_path">;
5
+ filename: Filename;
6
+ }, string>>;
@@ -0,0 +1,19 @@
1
+ import { z } from "zod/v4";
2
+ import { DirectoryPathAbsoluteSchema } from "./directory-path-absolute.vo";
3
+ import { Filename } from "./filename.vo";
4
+ export const FilePathAbsoluteSchema = z
5
+ .string()
6
+ .trim()
7
+ .refine((value) => value.startsWith("/"), "abs_file_path_must_start_with_slash")
8
+ .refine((value) => !value.includes("\\"), "abs_file_path_backslash_forbidden")
9
+ .transform((value) => value.replace(/\/{2,}/g, "/")) // collapse //
10
+ .transform((value) => (value !== "/" && value.endsWith("/") ? value.slice(0, -1) : value)) // keep "/" as-is
11
+ .refine((value) => value !== "/", "abs_file_path_missing_filename")
12
+ .transform((normalized) => {
13
+ const lastSlashIndex = normalized.lastIndexOf("/");
14
+ const directoryCandidate = lastSlashIndex === 0 ? "/" : normalized.slice(0, lastSlashIndex);
15
+ const filenameCandidate = normalized.slice(lastSlashIndex + 1);
16
+ const directory = DirectoryPathAbsoluteSchema.parse(directoryCandidate);
17
+ const filename = Filename.fromString(filenameCandidate);
18
+ return { directory, filename };
19
+ });
@@ -0,0 +1,6 @@
1
+ import { z } from "zod/v4";
2
+ import { Filename } from "./filename.vo";
3
+ export declare const FilePathRelativeSchema: z.ZodPipe<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>, z.ZodTransform<string, string>>, z.ZodTransform<{
4
+ directory: string & z.core.$brand<"relative_directory_path">;
5
+ filename: Filename;
6
+ }, string>>;
@@ -0,0 +1,19 @@
1
+ import { z } from "zod/v4";
2
+ import { DirectoryPathRelativeSchema } from "./directory-path-relative.vo";
3
+ import { Filename } from "./filename.vo";
4
+ export const FilePathRelativeSchema = z
5
+ .string()
6
+ .trim()
7
+ .refine((value) => !value.startsWith("/"), "rel_file_path_must_not_start_with_slash")
8
+ .refine((value) => !value.includes("\\"), "rel_file_path_backslash_forbidden")
9
+ .transform((value) => value.replace(/\/{2,}/g, "/")) // collapse //
10
+ .transform((value) => value.replace(/^\/+|\/+$/g, "")) // trim leading/trailing slashes
11
+ .refine((value) => value.includes("/"), "rel_file_path_requires_directory")
12
+ .transform((normalized) => {
13
+ const lastSlashIndex = normalized.lastIndexOf("/");
14
+ const directoryCandidate = normalized.slice(0, lastSlashIndex);
15
+ const filenameCandidate = normalized.slice(lastSlashIndex + 1);
16
+ const directory = DirectoryPathRelativeSchema.parse(directoryCandidate);
17
+ const filename = Filename.fromString(filenameCandidate);
18
+ return { directory, filename };
19
+ });
@@ -1,29 +1,31 @@
1
1
  import { type DirectoryPathAbsoluteType } from "./directory-path-absolute.vo";
2
2
  import { type DirectoryPathRelativeType } from "./directory-path-relative.vo";
3
3
  import type { Filename } from "./filename.vo";
4
- export declare class RelativeFilePath {
4
+ export declare class FilePathRelative {
5
5
  private readonly directory;
6
6
  private readonly filename;
7
7
  private constructor();
8
- static fromParts(directoryCandidate: string, filename: Filename): RelativeFilePath;
9
- static fromPartsSafe(directory: DirectoryPathRelativeType, filename: Filename): RelativeFilePath;
8
+ static fromParts(directoryCandidate: string, filename: Filename): FilePathRelative;
9
+ static fromPartsSafe(directory: DirectoryPathRelativeType, filename: Filename): FilePathRelative;
10
+ static fromString(pathCandidate: string): FilePathRelative;
10
11
  get(): string;
11
12
  getDirectory(): DirectoryPathRelativeType;
12
13
  getFilename(): Filename;
13
- withDirectoryRelative(newDirectory: DirectoryPathRelativeType): RelativeFilePath;
14
- withFilename(newFilename: Filename): RelativeFilePath;
15
- toAbsolute(newDirectory: DirectoryPathAbsoluteType): AbsoluteFilePath;
14
+ withDirectoryRelative(newDirectory: DirectoryPathRelativeType): FilePathRelative;
15
+ withFilename(newFilename: Filename): FilePathRelative;
16
+ toAbsolute(newDirectory: DirectoryPathAbsoluteType): FilePathAbsolute;
16
17
  }
17
- export declare class AbsoluteFilePath {
18
+ export declare class FilePathAbsolute {
18
19
  private readonly directory;
19
20
  private readonly filename;
20
21
  private constructor();
21
- static fromParts(directoryCandidate: string, filename: Filename): AbsoluteFilePath;
22
- static fromPartsSafe(directory: DirectoryPathAbsoluteType, filename: Filename): AbsoluteFilePath;
22
+ static fromParts(directoryCandidate: string, filename: Filename): FilePathAbsolute;
23
+ static fromPartsSafe(directory: DirectoryPathAbsoluteType, filename: Filename): FilePathAbsolute;
24
+ static fromString(pathCandidate: string): FilePathAbsolute;
23
25
  get(): string;
24
26
  getDirectory(): DirectoryPathAbsoluteType;
25
27
  getFilename(): Filename;
26
- withDirectoryAbsolute(newDirectory: DirectoryPathAbsoluteType): AbsoluteFilePath;
27
- withFilename(newFilename: Filename): AbsoluteFilePath;
28
- toRelative(newDirectory: DirectoryPathRelativeType): RelativeFilePath;
28
+ withDirectoryAbsolute(newDirectory: DirectoryPathAbsoluteType): FilePathAbsolute;
29
+ withFilename(newFilename: Filename): FilePathAbsolute;
30
+ toRelative(newDirectory: DirectoryPathRelativeType): FilePathRelative;
29
31
  }
@@ -1,6 +1,8 @@
1
1
  import { DirectoryPathAbsoluteSchema } from "./directory-path-absolute.vo";
2
2
  import { DirectoryPathRelativeSchema } from "./directory-path-relative.vo";
3
- export class RelativeFilePath {
3
+ import { FilePathAbsoluteSchema } from "./file-path-absolute-schema.vo";
4
+ import { FilePathRelativeSchema } from "./file-path-relative-schema.vo";
5
+ export class FilePathRelative {
4
6
  directory;
5
7
  filename;
6
8
  constructor(directory, filename) {
@@ -9,10 +11,14 @@ export class RelativeFilePath {
9
11
  }
10
12
  static fromParts(directoryCandidate, filename) {
11
13
  const directory = DirectoryPathRelativeSchema.parse(directoryCandidate);
12
- return new RelativeFilePath(directory, filename);
14
+ return new FilePathRelative(directory, filename);
13
15
  }
14
16
  static fromPartsSafe(directory, filename) {
15
- return new RelativeFilePath(directory, filename);
17
+ return new FilePathRelative(directory, filename);
18
+ }
19
+ static fromString(pathCandidate) {
20
+ const { directory, filename } = FilePathRelativeSchema.parse(pathCandidate);
21
+ return new FilePathRelative(directory, filename);
16
22
  }
17
23
  get() {
18
24
  return `${this.directory}/${this.filename.get()}`;
@@ -24,16 +30,16 @@ export class RelativeFilePath {
24
30
  return this.filename;
25
31
  }
26
32
  withDirectoryRelative(newDirectory) {
27
- return new RelativeFilePath(newDirectory, this.filename);
33
+ return new FilePathRelative(newDirectory, this.filename);
28
34
  }
29
35
  withFilename(newFilename) {
30
- return new RelativeFilePath(this.directory, newFilename);
36
+ return new FilePathRelative(this.directory, newFilename);
31
37
  }
32
38
  toAbsolute(newDirectory) {
33
- return AbsoluteFilePath.fromPartsSafe(newDirectory, this.filename);
39
+ return FilePathAbsolute.fromPartsSafe(newDirectory, this.filename);
34
40
  }
35
41
  }
36
- export class AbsoluteFilePath {
42
+ export class FilePathAbsolute {
37
43
  directory;
38
44
  filename;
39
45
  constructor(directory, filename) {
@@ -42,10 +48,14 @@ export class AbsoluteFilePath {
42
48
  }
43
49
  static fromParts(directoryCandidate, filename) {
44
50
  const directory = DirectoryPathAbsoluteSchema.parse(directoryCandidate);
45
- return new AbsoluteFilePath(directory, filename);
51
+ return new FilePathAbsolute(directory, filename);
46
52
  }
47
53
  static fromPartsSafe(directory, filename) {
48
- return new AbsoluteFilePath(directory, filename);
54
+ return new FilePathAbsolute(directory, filename);
55
+ }
56
+ static fromString(pathCandidate) {
57
+ const { directory, filename } = FilePathAbsoluteSchema.parse(pathCandidate);
58
+ return new FilePathAbsolute(directory, filename);
49
59
  }
50
60
  get() {
51
61
  if (this.directory === "/")
@@ -59,12 +69,12 @@ export class AbsoluteFilePath {
59
69
  return this.filename;
60
70
  }
61
71
  withDirectoryAbsolute(newDirectory) {
62
- return new AbsoluteFilePath(newDirectory, this.filename);
72
+ return new FilePathAbsolute(newDirectory, this.filename);
63
73
  }
64
74
  withFilename(newFilename) {
65
- return new AbsoluteFilePath(this.directory, newFilename);
75
+ return new FilePathAbsolute(this.directory, newFilename);
66
76
  }
67
77
  toRelative(newDirectory) {
68
- return RelativeFilePath.fromPartsSafe(newDirectory, this.filename);
78
+ return FilePathRelative.fromPartsSafe(newDirectory, this.filename);
69
79
  }
70
80
  }
package/dist/index.d.ts CHANGED
@@ -16,6 +16,8 @@ export * from "./etags.vo";
16
16
  export * from "./extension.vo";
17
17
  export * from "./feature-flag.vo";
18
18
  export * from "./file-path.vo";
19
+ export * from "./file-path-absolute-schema.vo";
20
+ export * from "./file-path-relative-schema.vo";
19
21
  export * from "./filename.vo";
20
22
  export * from "./filename-from-string.vo";
21
23
  export * from "./filename-suffix.vo";
package/dist/index.js CHANGED
@@ -16,6 +16,8 @@ export * from "./etags.vo";
16
16
  export * from "./extension.vo";
17
17
  export * from "./feature-flag.vo";
18
18
  export * from "./file-path.vo";
19
+ export * from "./file-path-absolute-schema.vo";
20
+ export * from "./file-path-relative-schema.vo";
19
21
  export * from "./filename.vo";
20
22
  export * from "./filename-from-string.vo";
21
23
  export * from "./filename-suffix.vo";
@@ -1 +1 @@
1
- {"root":["../src/api-key.vo.ts","../src/basename.vo.ts","../src/build-version.vo.ts","../src/clock.vo.ts","../src/date-calculator.service.ts","../src/date-formatter.service.ts","../src/date-range.vo.ts","../src/dates-of-the-week.vo.ts","../src/day-iso-id.vo.ts","../src/day.vo.ts","../src/directory-path-absolute.vo.ts","../src/directory-path-relative.vo.ts","../src/dll.service.ts","../src/email-mask.service.ts","../src/etags.vo.ts","../src/extension.vo.ts","../src/feature-flag.vo.ts","../src/file-path.vo.ts","../src/filename-from-string.vo.ts","../src/filename-suffix.vo.ts","../src/filename.vo.ts","../src/filter.vo.ts","../src/hour.vo.ts","../src/iban-mask.service.ts","../src/iban.vo.ts","../src/image.vo.ts","../src/index.ts","../src/language.vo.ts","../src/leap-year-checker.service.ts","../src/mean.service.ts","../src/mime-types.vo.ts","../src/mime.vo.ts","../src/min-max-scaler.service.ts","../src/minute.vo.ts","../src/money.vo.ts","../src/noop.service.ts","../src/notification-template.vo.ts","../src/outlier-detector.service.ts","../src/package-version.vo.ts","../src/pagination.service.ts","../src/percentage.service.ts","../src/population-standard-deviation.service.ts","../src/random.service.ts","../src/rate-limiter.service.ts","../src/relative-date.vo.ts","../src/reordering.service.ts","../src/revision.vo.ts","../src/rounding.service.ts","../src/simple-linear-regression.service.ts","../src/size.vo.ts","../src/stepper.service.ts","../src/stopwatch.service.ts","../src/streak-calculator.service.ts","../src/sum.service.ts","../src/thousands-separator.service.ts","../src/time-zone-offset-value.vo.ts","../src/time.service.ts","../src/timestamp.vo.ts","../src/timezone.vo.ts","../src/ts-utils.ts","../src/visually-unambiguous-characters-generator.service.ts","../src/week-iso-id.vo.ts","../src/week.vo.ts","../src/z-score.service.ts"],"version":"5.9.2"}
1
+ {"root":["../src/api-key.vo.ts","../src/basename.vo.ts","../src/build-version.vo.ts","../src/clock.vo.ts","../src/date-calculator.service.ts","../src/date-formatter.service.ts","../src/date-range.vo.ts","../src/dates-of-the-week.vo.ts","../src/day-iso-id.vo.ts","../src/day.vo.ts","../src/directory-path-absolute.vo.ts","../src/directory-path-relative.vo.ts","../src/dll.service.ts","../src/email-mask.service.ts","../src/etags.vo.ts","../src/extension.vo.ts","../src/feature-flag.vo.ts","../src/file-path-absolute-schema.vo.ts","../src/file-path-relative-schema.vo.ts","../src/file-path.vo.ts","../src/filename-from-string.vo.ts","../src/filename-suffix.vo.ts","../src/filename.vo.ts","../src/filter.vo.ts","../src/hour.vo.ts","../src/iban-mask.service.ts","../src/iban.vo.ts","../src/image.vo.ts","../src/index.ts","../src/language.vo.ts","../src/leap-year-checker.service.ts","../src/mean.service.ts","../src/mime-types.vo.ts","../src/mime.vo.ts","../src/min-max-scaler.service.ts","../src/minute.vo.ts","../src/money.vo.ts","../src/noop.service.ts","../src/notification-template.vo.ts","../src/outlier-detector.service.ts","../src/package-version.vo.ts","../src/pagination.service.ts","../src/percentage.service.ts","../src/population-standard-deviation.service.ts","../src/random.service.ts","../src/rate-limiter.service.ts","../src/relative-date.vo.ts","../src/reordering.service.ts","../src/revision.vo.ts","../src/rounding.service.ts","../src/simple-linear-regression.service.ts","../src/size.vo.ts","../src/stepper.service.ts","../src/stopwatch.service.ts","../src/streak-calculator.service.ts","../src/sum.service.ts","../src/thousands-separator.service.ts","../src/time-zone-offset-value.vo.ts","../src/time.service.ts","../src/timestamp.vo.ts","../src/timezone.vo.ts","../src/ts-utils.ts","../src/visually-unambiguous-characters-generator.service.ts","../src/week-iso-id.vo.ts","../src/week.vo.ts","../src/z-score.service.ts"],"version":"5.9.2"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bgord/tools",
3
- "version": "0.12.14",
3
+ "version": "0.12.16",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Bartosz Gordon",
package/readme.md CHANGED
@@ -41,6 +41,8 @@ src/
41
41
  ├── etags.vo.ts
42
42
  ├── extension.vo.ts
43
43
  ├── feature-flag.vo.ts
44
+ ├── file-path-absolute-schema.vo.ts
45
+ ├── file-path-relative-schema.vo.ts
44
46
  ├── file-path.vo.ts
45
47
  ├── filename-from-string.vo.ts
46
48
  ├── filename-suffix.vo.ts
@@ -0,0 +1,22 @@
1
+ import { z } from "zod/v4";
2
+ import { DirectoryPathAbsoluteSchema } from "./directory-path-absolute.vo";
3
+ import { Filename } from "./filename.vo";
4
+
5
+ export const FilePathAbsoluteSchema = z
6
+ .string()
7
+ .trim()
8
+ .refine((value) => value.startsWith("/"), "abs_file_path_must_start_with_slash")
9
+ .refine((value) => !value.includes("\\"), "abs_file_path_backslash_forbidden")
10
+ .transform((value) => value.replace(/\/{2,}/g, "/")) // collapse //
11
+ .transform((value) => (value !== "/" && value.endsWith("/") ? value.slice(0, -1) : value)) // keep "/" as-is
12
+ .refine((value) => value !== "/", "abs_file_path_missing_filename")
13
+ .transform((normalized) => {
14
+ const lastSlashIndex = normalized.lastIndexOf("/");
15
+ const directoryCandidate = lastSlashIndex === 0 ? "/" : normalized.slice(0, lastSlashIndex);
16
+ const filenameCandidate = normalized.slice(lastSlashIndex + 1);
17
+
18
+ const directory = DirectoryPathAbsoluteSchema.parse(directoryCandidate);
19
+ const filename = Filename.fromString(filenameCandidate);
20
+
21
+ return { directory, filename };
22
+ });
@@ -0,0 +1,22 @@
1
+ import { z } from "zod/v4";
2
+ import { DirectoryPathRelativeSchema } from "./directory-path-relative.vo";
3
+ import { Filename } from "./filename.vo";
4
+
5
+ export const FilePathRelativeSchema = z
6
+ .string()
7
+ .trim()
8
+ .refine((value) => !value.startsWith("/"), "rel_file_path_must_not_start_with_slash")
9
+ .refine((value) => !value.includes("\\"), "rel_file_path_backslash_forbidden")
10
+ .transform((value) => value.replace(/\/{2,}/g, "/")) // collapse //
11
+ .transform((value) => value.replace(/^\/+|\/+$/g, "")) // trim leading/trailing slashes
12
+ .refine((value) => value.includes("/"), "rel_file_path_requires_directory")
13
+ .transform((normalized) => {
14
+ const lastSlashIndex = normalized.lastIndexOf("/");
15
+ const directoryCandidate = normalized.slice(0, lastSlashIndex);
16
+ const filenameCandidate = normalized.slice(lastSlashIndex + 1);
17
+
18
+ const directory = DirectoryPathRelativeSchema.parse(directoryCandidate);
19
+ const filename = Filename.fromString(filenameCandidate);
20
+
21
+ return { directory, filename };
22
+ });
@@ -1,8 +1,10 @@
1
1
  import { DirectoryPathAbsoluteSchema, type DirectoryPathAbsoluteType } from "./directory-path-absolute.vo";
2
2
  import { DirectoryPathRelativeSchema, type DirectoryPathRelativeType } from "./directory-path-relative.vo";
3
+ import { FilePathAbsoluteSchema } from "./file-path-absolute-schema.vo";
4
+ import { FilePathRelativeSchema } from "./file-path-relative-schema.vo";
3
5
  import type { Filename } from "./filename.vo";
4
6
 
5
- export class RelativeFilePath {
7
+ export class FilePathRelative {
6
8
  private constructor(
7
9
  private readonly directory: DirectoryPathRelativeType,
8
10
  private readonly filename: Filename,
@@ -10,11 +12,16 @@ export class RelativeFilePath {
10
12
 
11
13
  static fromParts(directoryCandidate: string, filename: Filename) {
12
14
  const directory = DirectoryPathRelativeSchema.parse(directoryCandidate);
13
- return new RelativeFilePath(directory, filename);
15
+ return new FilePathRelative(directory, filename);
14
16
  }
15
17
 
16
18
  static fromPartsSafe(directory: DirectoryPathRelativeType, filename: Filename) {
17
- return new RelativeFilePath(directory, filename);
19
+ return new FilePathRelative(directory, filename);
20
+ }
21
+
22
+ static fromString(pathCandidate: string): FilePathRelative {
23
+ const { directory, filename } = FilePathRelativeSchema.parse(pathCandidate);
24
+ return new FilePathRelative(directory, filename);
18
25
  }
19
26
 
20
27
  get() {
@@ -29,20 +36,20 @@ export class RelativeFilePath {
29
36
  return this.filename;
30
37
  }
31
38
 
32
- withDirectoryRelative(newDirectory: DirectoryPathRelativeType): RelativeFilePath {
33
- return new RelativeFilePath(newDirectory, this.filename);
39
+ withDirectoryRelative(newDirectory: DirectoryPathRelativeType): FilePathRelative {
40
+ return new FilePathRelative(newDirectory, this.filename);
34
41
  }
35
42
 
36
- withFilename(newFilename: Filename): RelativeFilePath {
37
- return new RelativeFilePath(this.directory, newFilename);
43
+ withFilename(newFilename: Filename): FilePathRelative {
44
+ return new FilePathRelative(this.directory, newFilename);
38
45
  }
39
46
 
40
- toAbsolute(newDirectory: DirectoryPathAbsoluteType): AbsoluteFilePath {
41
- return AbsoluteFilePath.fromPartsSafe(newDirectory, this.filename);
47
+ toAbsolute(newDirectory: DirectoryPathAbsoluteType): FilePathAbsolute {
48
+ return FilePathAbsolute.fromPartsSafe(newDirectory, this.filename);
42
49
  }
43
50
  }
44
51
 
45
- export class AbsoluteFilePath {
52
+ export class FilePathAbsolute {
46
53
  private constructor(
47
54
  private readonly directory: DirectoryPathAbsoluteType,
48
55
  private readonly filename: Filename,
@@ -50,11 +57,16 @@ export class AbsoluteFilePath {
50
57
 
51
58
  static fromParts(directoryCandidate: string, filename: Filename) {
52
59
  const directory = DirectoryPathAbsoluteSchema.parse(directoryCandidate);
53
- return new AbsoluteFilePath(directory, filename);
60
+ return new FilePathAbsolute(directory, filename);
54
61
  }
55
62
 
56
63
  static fromPartsSafe(directory: DirectoryPathAbsoluteType, filename: Filename) {
57
- return new AbsoluteFilePath(directory, filename);
64
+ return new FilePathAbsolute(directory, filename);
65
+ }
66
+
67
+ static fromString(pathCandidate: string): FilePathAbsolute {
68
+ const { directory, filename } = FilePathAbsoluteSchema.parse(pathCandidate);
69
+ return new FilePathAbsolute(directory, filename);
58
70
  }
59
71
 
60
72
  get() {
@@ -70,15 +82,15 @@ export class AbsoluteFilePath {
70
82
  return this.filename;
71
83
  }
72
84
 
73
- withDirectoryAbsolute(newDirectory: DirectoryPathAbsoluteType): AbsoluteFilePath {
74
- return new AbsoluteFilePath(newDirectory, this.filename);
85
+ withDirectoryAbsolute(newDirectory: DirectoryPathAbsoluteType): FilePathAbsolute {
86
+ return new FilePathAbsolute(newDirectory, this.filename);
75
87
  }
76
88
 
77
- withFilename(newFilename: Filename): AbsoluteFilePath {
78
- return new AbsoluteFilePath(this.directory, newFilename);
89
+ withFilename(newFilename: Filename): FilePathAbsolute {
90
+ return new FilePathAbsolute(this.directory, newFilename);
79
91
  }
80
92
 
81
- toRelative(newDirectory: DirectoryPathRelativeType): RelativeFilePath {
82
- return RelativeFilePath.fromPartsSafe(newDirectory, this.filename);
93
+ toRelative(newDirectory: DirectoryPathRelativeType): FilePathRelative {
94
+ return FilePathRelative.fromPartsSafe(newDirectory, this.filename);
83
95
  }
84
96
  }
package/src/index.ts CHANGED
@@ -16,6 +16,8 @@ export * from "./etags.vo";
16
16
  export * from "./extension.vo";
17
17
  export * from "./feature-flag.vo";
18
18
  export * from "./file-path.vo";
19
+ export * from "./file-path-absolute-schema.vo";
20
+ export * from "./file-path-relative-schema.vo";
19
21
  export * from "./filename.vo";
20
22
  export * from "./filename-from-string.vo";
21
23
  export * from "./filename-suffix.vo";