apimo.js 1.0.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.
Files changed (73) hide show
  1. package/.github/workflows/ci.yml +37 -0
  2. package/.github/workflows/publish.yml +69 -0
  3. package/.idea/apimo.js.iml +13 -0
  4. package/.idea/copilotDiffState.xml +43 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  6. package/.idea/jsLinters/eslint.xml +6 -0
  7. package/.idea/modules.xml +8 -0
  8. package/.idea/prettier.xml +6 -0
  9. package/.idea/vcs.xml +6 -0
  10. package/README.md +91 -0
  11. package/dist/src/consts/catalogs.d.ts +2 -0
  12. package/dist/src/consts/catalogs.js +53 -0
  13. package/dist/src/consts/languages.d.ts +2 -0
  14. package/dist/src/consts/languages.js +20 -0
  15. package/dist/src/core/api.d.ts +389 -0
  16. package/dist/src/core/api.js +157 -0
  17. package/dist/src/core/api.test.d.ts +1 -0
  18. package/dist/src/core/api.test.js +246 -0
  19. package/dist/src/core/converters.d.ts +4 -0
  20. package/dist/src/core/converters.js +4 -0
  21. package/dist/src/schemas/agency.d.ts +416 -0
  22. package/dist/src/schemas/agency.js +61 -0
  23. package/dist/src/schemas/common.d.ts +153 -0
  24. package/dist/src/schemas/common.js +47 -0
  25. package/dist/src/schemas/internal.d.ts +3 -0
  26. package/dist/src/schemas/internal.js +11 -0
  27. package/dist/src/schemas/property.d.ts +1500 -0
  28. package/dist/src/schemas/property.js +238 -0
  29. package/dist/src/services/storage/dummy.cache.d.ts +10 -0
  30. package/dist/src/services/storage/dummy.cache.js +28 -0
  31. package/dist/src/services/storage/dummy.cache.test.d.ts +1 -0
  32. package/dist/src/services/storage/dummy.cache.test.js +96 -0
  33. package/dist/src/services/storage/filesystem.cache.d.ts +18 -0
  34. package/dist/src/services/storage/filesystem.cache.js +85 -0
  35. package/dist/src/services/storage/filesystem.cache.test.d.ts +1 -0
  36. package/dist/src/services/storage/filesystem.cache.test.js +197 -0
  37. package/dist/src/services/storage/memory.cache.d.ts +20 -0
  38. package/dist/src/services/storage/memory.cache.js +62 -0
  39. package/dist/src/services/storage/memory.cache.test.d.ts +1 -0
  40. package/dist/src/services/storage/memory.cache.test.js +80 -0
  41. package/dist/src/services/storage/types.d.ts +16 -0
  42. package/dist/src/services/storage/types.js +4 -0
  43. package/dist/src/types/index.d.ts +4 -0
  44. package/dist/src/types/index.js +1 -0
  45. package/dist/src/utils/url.d.ts +14 -0
  46. package/dist/src/utils/url.js +11 -0
  47. package/dist/src/utils/url.test.d.ts +1 -0
  48. package/dist/src/utils/url.test.js +18 -0
  49. package/dist/vitest.config.d.ts +2 -0
  50. package/dist/vitest.config.js +6 -0
  51. package/eslint.config.mjs +3 -0
  52. package/package.json +45 -0
  53. package/src/consts/catalogs.ts +55 -0
  54. package/src/consts/languages.ts +22 -0
  55. package/src/core/api.test.ts +308 -0
  56. package/src/core/api.ts +230 -0
  57. package/src/core/converters.ts +7 -0
  58. package/src/schemas/agency.ts +66 -0
  59. package/src/schemas/common.ts +67 -0
  60. package/src/schemas/internal.ts +13 -0
  61. package/src/schemas/property.ts +257 -0
  62. package/src/services/storage/dummy.cache.test.ts +110 -0
  63. package/src/services/storage/dummy.cache.ts +21 -0
  64. package/src/services/storage/filesystem.cache.test.ts +243 -0
  65. package/src/services/storage/filesystem.cache.ts +94 -0
  66. package/src/services/storage/memory.cache.test.ts +94 -0
  67. package/src/services/storage/memory.cache.ts +69 -0
  68. package/src/services/storage/types.ts +20 -0
  69. package/src/types/index.ts +5 -0
  70. package/src/utils/url.test.ts +21 -0
  71. package/src/utils/url.ts +27 -0
  72. package/tsconfig.json +13 -0
  73. package/vitest.config.ts +7 -0
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { Converters } from '../core/converters';
3
+ import { CitySchema, getUserSchema, NameIdPairSchema } from './common';
4
+ export function getRateSchema(transformer) {
5
+ return z.object({
6
+ id: z.coerce.number(),
7
+ category: z.coerce.number().transform(v => transformer('property_category', v)),
8
+ range_min: z.coerce.number().nullable(),
9
+ range_max: z.coerce.number().nullable(),
10
+ commission_price: z.coerce.number().nullable(),
11
+ commission_rate: z.coerce.number().nullable(),
12
+ comment: z.string(),
13
+ url: z.string().nullable(),
14
+ });
15
+ }
16
+ export const PartnerSchema = z.object({
17
+ type: z.coerce.number(),
18
+ partner: z.coerce.number().nullable(),
19
+ name: z.string().nullable(),
20
+ reference: z.string(),
21
+ amount: z.coerce.number(),
22
+ currency: z.string().toLowerCase(),
23
+ });
24
+ export function getAgencySchema(transformer, config) {
25
+ return z.object({
26
+ id: z.coerce.number(),
27
+ reference: z.coerce.number(),
28
+ active: z.boolean(),
29
+ name: z.string(),
30
+ company: NameIdPairSchema,
31
+ brand: z.unknown().nullable(),
32
+ networks: z.unknown().array(),
33
+ address: z.string(),
34
+ address_more: z.string().nullable(),
35
+ city: CitySchema,
36
+ district: z.unknown(),
37
+ country: z.string().toLowerCase(),
38
+ region: z.string().toLowerCase(),
39
+ latitude: z.coerce.number(),
40
+ longitude: z.coerce.number(),
41
+ email: z.string().email(),
42
+ phone: z.string(),
43
+ fax: z.string().nullable(),
44
+ url: z.string(),
45
+ logo: z.string().url(),
46
+ logo_svg: z.string().nullable(),
47
+ picture: z.string().url(),
48
+ currency: z.string().toLowerCase(),
49
+ timetable: z.string(),
50
+ created_at: z.coerce.string().transform(Converters.toDate),
51
+ updated_at: z.coerce.string().transform(Converters.toDate),
52
+ providers: z.string().transform(Converters.toUrl('agencies', config.baseUrl)),
53
+ rates: getRateSchema(transformer).array(),
54
+ partners: PartnerSchema.array(),
55
+ stories: z.unknown().array(),
56
+ users: getUserSchema(transformer).array(),
57
+ sectors: z.unknown().array(),
58
+ parameters: z.string().transform(Converters.toUrl('agencies', config.baseUrl)),
59
+ subscription: z.string(),
60
+ });
61
+ }
@@ -0,0 +1,153 @@
1
+ import type { CatalogName } from '../consts/catalogs';
2
+ import type { ApiCulture } from '../consts/languages';
3
+ import type { CatalogEntryName } from '../services/storage/types';
4
+ import { z } from 'zod';
5
+ export interface CatalogTransformer {
6
+ (catalogName: CatalogName, culture: ApiCulture, id: number): Promise<CatalogEntryName | string | null>;
7
+ }
8
+ export interface LocalizedCatalogTransformer {
9
+ (catalogName: CatalogName, id: number): Promise<CatalogEntryName | string | null>;
10
+ }
11
+ export declare const CatalogDefinitionSchema: z.ZodObject<{
12
+ name: z.ZodString;
13
+ path: z.ZodString;
14
+ private: z.ZodBoolean;
15
+ }, "strip", z.ZodTypeAny, {
16
+ name: string;
17
+ path: string;
18
+ private: boolean;
19
+ }, {
20
+ name: string;
21
+ path: string;
22
+ private: boolean;
23
+ }>;
24
+ export type CatalogDefinition = z.infer<typeof CatalogDefinitionSchema>;
25
+ export declare const CatalogEntrySchema: z.ZodObject<{
26
+ id: z.ZodNumber;
27
+ culture: z.ZodOptional<z.ZodString>;
28
+ name: z.ZodString;
29
+ name_plurial: z.ZodOptional<z.ZodString>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ id: number;
32
+ name: string;
33
+ culture?: string | undefined;
34
+ name_plurial?: string | undefined;
35
+ }, {
36
+ id: number;
37
+ name: string;
38
+ culture?: string | undefined;
39
+ name_plurial?: string | undefined;
40
+ }>;
41
+ export type CatalogEntry = z.infer<typeof CatalogEntrySchema>;
42
+ export declare const NameIdPairSchema: z.ZodObject<{
43
+ id: z.ZodNumber;
44
+ name: z.ZodString;
45
+ }, "strip", z.ZodTypeAny, {
46
+ id: number;
47
+ name: string;
48
+ }, {
49
+ id: number;
50
+ name: string;
51
+ }>;
52
+ export declare const CitySchema: z.ZodObject<{
53
+ id: z.ZodNumber;
54
+ name: z.ZodString;
55
+ } & {
56
+ zipcode: z.ZodString;
57
+ }, "strip", z.ZodTypeAny, {
58
+ id: number;
59
+ name: string;
60
+ zipcode: string;
61
+ }, {
62
+ id: number;
63
+ name: string;
64
+ zipcode: string;
65
+ }>;
66
+ export declare function getUserSchema(transformer: LocalizedCatalogTransformer): z.ZodObject<{
67
+ id: z.ZodNumber;
68
+ agency: z.ZodNumber;
69
+ active: z.ZodBoolean;
70
+ created_at: z.ZodEffects<z.ZodString, Date, string>;
71
+ updated_at: z.ZodEffects<z.ZodString, Date, string>;
72
+ firstname: z.ZodString;
73
+ lastname: z.ZodString;
74
+ username: z.ZodOptional<z.ZodString>;
75
+ password: z.ZodOptional<z.ZodString>;
76
+ language: z.ZodString;
77
+ spoken_languages: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
78
+ group: z.ZodEffects<z.ZodNumber, string | CatalogEntryName | null, number>;
79
+ email: z.ZodString;
80
+ phone: z.ZodNullable<z.ZodString>;
81
+ mobile: z.ZodString;
82
+ fax: z.ZodNullable<z.ZodString>;
83
+ city: z.ZodOptional<z.ZodNullable<z.ZodObject<{
84
+ id: z.ZodNumber;
85
+ name: z.ZodString;
86
+ }, "strip", z.ZodTypeAny, {
87
+ id: number;
88
+ name: string;
89
+ }, {
90
+ id: number;
91
+ name: string;
92
+ }>>>;
93
+ birthday_at: z.ZodEffects<z.ZodString, Date, string>;
94
+ timezone: z.ZodNullable<z.ZodString>;
95
+ picture: z.ZodNullable<z.ZodString>;
96
+ partners: z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>;
97
+ stories: z.ZodOptional<z.ZodArray<z.ZodUnknown, "many">>;
98
+ rates: z.ZodUnknown;
99
+ }, "strip", z.ZodTypeAny, {
100
+ id: number;
101
+ agency: number;
102
+ active: boolean;
103
+ created_at: Date;
104
+ updated_at: Date;
105
+ firstname: string;
106
+ lastname: string;
107
+ language: string;
108
+ group: string | CatalogEntryName | null;
109
+ email: string;
110
+ phone: string | null;
111
+ mobile: string;
112
+ fax: string | null;
113
+ birthday_at: Date;
114
+ timezone: string | null;
115
+ picture: string | null;
116
+ username?: string | undefined;
117
+ password?: string | undefined;
118
+ spoken_languages?: string[] | undefined;
119
+ city?: {
120
+ id: number;
121
+ name: string;
122
+ } | null | undefined;
123
+ partners?: unknown[] | undefined;
124
+ stories?: unknown[] | undefined;
125
+ rates?: unknown;
126
+ }, {
127
+ id: number;
128
+ agency: number;
129
+ active: boolean;
130
+ created_at: string;
131
+ updated_at: string;
132
+ firstname: string;
133
+ lastname: string;
134
+ language: string;
135
+ group: number;
136
+ email: string;
137
+ phone: string | null;
138
+ mobile: string;
139
+ fax: string | null;
140
+ birthday_at: string;
141
+ timezone: string | null;
142
+ picture: string | null;
143
+ username?: string | undefined;
144
+ password?: string | undefined;
145
+ spoken_languages?: string[] | undefined;
146
+ city?: {
147
+ id: number;
148
+ name: string;
149
+ } | null | undefined;
150
+ partners?: unknown[] | undefined;
151
+ stories?: unknown[] | undefined;
152
+ rates?: unknown;
153
+ }>;
@@ -0,0 +1,47 @@
1
+ import { unknown, z } from 'zod';
2
+ import { Converters } from '../core/converters';
3
+ export const CatalogDefinitionSchema = z.object({
4
+ name: z.string(),
5
+ path: z.string().url(),
6
+ private: z.boolean(),
7
+ });
8
+ export const CatalogEntrySchema = z.object({
9
+ id: z.number(),
10
+ culture: z.string().optional(),
11
+ name: z.string(),
12
+ name_plurial: z.string().optional(),
13
+ });
14
+ export const NameIdPairSchema = z.object({
15
+ id: z.coerce.number(),
16
+ name: z.string(),
17
+ });
18
+ export const CitySchema = NameIdPairSchema.extend({
19
+ zipcode: z.string(),
20
+ });
21
+ export function getUserSchema(transformer) {
22
+ return z.object({
23
+ id: z.coerce.number(),
24
+ agency: z.coerce.number(),
25
+ active: z.boolean(),
26
+ created_at: z.coerce.string().transform(Converters.toDate),
27
+ updated_at: z.coerce.string().transform(Converters.toDate),
28
+ firstname: z.string(),
29
+ lastname: z.string(),
30
+ username: z.string().optional(),
31
+ password: z.string().optional(),
32
+ language: z.string(),
33
+ spoken_languages: z.string().array().optional(),
34
+ group: z.coerce.number().transform(v => transformer('user_group', v)),
35
+ email: z.string().email(),
36
+ phone: z.string().nullable(),
37
+ mobile: z.string(),
38
+ fax: z.string().nullable(),
39
+ city: NameIdPairSchema.nullable().optional(),
40
+ birthday_at: z.coerce.string().transform(Converters.toDate),
41
+ timezone: z.string().nullable(),
42
+ picture: z.string().nullable(),
43
+ partners: unknown().array().optional(),
44
+ stories: unknown().array().optional(),
45
+ rates: unknown(),
46
+ });
47
+ }
@@ -0,0 +1,3 @@
1
+ import { z } from 'zod';
2
+ export declare const TYPE_UNDOCUMENTED: z.ZodEffects<z.ZodUnknown, unknown, unknown>;
3
+ export declare const TYPE_UNDOCUMENTED_NULLABLE: z.ZodEffects<z.ZodNullable<z.ZodUnknown>, unknown, unknown>;
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ export const TYPE_UNDOCUMENTED = z.unknown().transform((v, { path }) => {
3
+ console.warn(`Unhandled \`${path}\` with value \`${v}\``);
4
+ return v;
5
+ });
6
+ export const TYPE_UNDOCUMENTED_NULLABLE = z.unknown().nullable().transform((v, { path }) => {
7
+ if (v !== null) {
8
+ console.warn(`Unhandled \`${path}\` with value \`${v}\``);
9
+ }
10
+ return v;
11
+ });