@zivue/zuuid 0.2.2 → 0.2.5

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 (57) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +123 -6
  3. package/dist/client.d.ts +36 -0
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +142 -0
  6. package/dist/providers/comicvine/client.d.ts +40 -0
  7. package/dist/providers/comicvine/client.d.ts.map +1 -0
  8. package/dist/providers/comicvine/client.js +190 -0
  9. package/dist/providers/comicvine/constants.d.ts +2 -0
  10. package/dist/providers/comicvine/constants.d.ts.map +1 -1
  11. package/dist/providers/comicvine/constants.js +2 -0
  12. package/dist/providers/comicvine/index.d.ts +2 -0
  13. package/dist/providers/comicvine/index.d.ts.map +1 -1
  14. package/dist/providers/comicvine/index.js +2 -0
  15. package/dist/providers/comicvine/types.d.ts +26 -0
  16. package/dist/providers/comicvine/types.d.ts.map +1 -0
  17. package/dist/providers/comicvine/types.js +1 -0
  18. package/dist/providers/imdb/client.d.ts +1 -0
  19. package/dist/providers/imdb/client.d.ts.map +1 -1
  20. package/dist/providers/imdb/client.js +4 -2
  21. package/dist/providers/imdb/constants.d.ts +1 -0
  22. package/dist/providers/imdb/constants.d.ts.map +1 -1
  23. package/dist/providers/imdb/constants.js +1 -0
  24. package/dist/providers/imdb/movie.js +51 -6
  25. package/dist/providers/imdb/types.d.ts +2 -0
  26. package/dist/providers/imdb/types.d.ts.map +1 -1
  27. package/dist/providers/musicbrainz/client.d.ts +41 -0
  28. package/dist/providers/musicbrainz/client.d.ts.map +1 -0
  29. package/dist/providers/musicbrainz/client.js +169 -0
  30. package/dist/providers/musicbrainz/constants.d.ts +2 -0
  31. package/dist/providers/musicbrainz/constants.d.ts.map +1 -1
  32. package/dist/providers/musicbrainz/constants.js +2 -0
  33. package/dist/providers/musicbrainz/index.d.ts +2 -0
  34. package/dist/providers/musicbrainz/index.d.ts.map +1 -1
  35. package/dist/providers/musicbrainz/index.js +2 -0
  36. package/dist/providers/musicbrainz/types.d.ts +21 -0
  37. package/dist/providers/musicbrainz/types.d.ts.map +1 -0
  38. package/dist/providers/musicbrainz/types.js +1 -0
  39. package/dist/providers/openstreetmap/city.d.ts +2 -0
  40. package/dist/providers/openstreetmap/city.d.ts.map +1 -0
  41. package/dist/providers/openstreetmap/city.js +1 -0
  42. package/dist/providers/openstreetmap/client.d.ts +31 -0
  43. package/dist/providers/openstreetmap/client.d.ts.map +1 -0
  44. package/dist/providers/openstreetmap/client.js +146 -0
  45. package/dist/providers/openstreetmap/constants.d.ts +2 -0
  46. package/dist/providers/openstreetmap/constants.d.ts.map +1 -1
  47. package/dist/providers/openstreetmap/constants.js +2 -0
  48. package/dist/providers/openstreetmap/country.d.ts +2 -0
  49. package/dist/providers/openstreetmap/country.d.ts.map +1 -0
  50. package/dist/providers/openstreetmap/country.js +1 -0
  51. package/dist/providers/openstreetmap/index.d.ts +4 -0
  52. package/dist/providers/openstreetmap/index.d.ts.map +1 -1
  53. package/dist/providers/openstreetmap/index.js +4 -0
  54. package/dist/providers/openstreetmap/types.d.ts +16 -0
  55. package/dist/providers/openstreetmap/types.d.ts.map +1 -0
  56. package/dist/providers/openstreetmap/types.js +1 -0
  57. package/package.json +21 -1
@@ -0,0 +1,169 @@
1
+ import { providerZuuid } from "../../identity.js";
2
+ import { createSourceRecord } from "../../source.js";
3
+ import { datePrefix, nestedString, objectPayload, stringField, valueAsString } from "../common.js";
4
+ import { MUSICBRAINZ_API_BASE, MUSICBRAINZ_ARTIST_CATEGORY, MUSICBRAINZ_COVER_ART_BASE_URL, MUSICBRAINZ_DEFAULT_USER_AGENT, MUSICBRAINZ_LABEL_CATEGORY, MUSICBRAINZ_PROVIDER, MUSICBRAINZ_RECORDING_CATEGORY, MUSICBRAINZ_RELEASE_CATEGORY, MUSICBRAINZ_RELEASE_GROUP_CATEGORY, MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL, MUSICBRAINZ_WORK_CATEGORY } from "./constants.js";
5
+ import { transformMusicBrainzArtist } from "./artist.js";
6
+ import { transformMusicBrainzLabel } from "./label.js";
7
+ import { transformMusicBrainzRecording } from "./recording.js";
8
+ import { transformMusicBrainzRelease } from "./release.js";
9
+ import { transformMusicBrainzReleaseGroup } from "./release-group.js";
10
+ import { transformMusicBrainzWork } from "./work.js";
11
+ export class MusicBrainzProvider {
12
+ apiBase;
13
+ coverArtBaseUrl;
14
+ releaseGroupCoverArtBaseUrl;
15
+ userAgent;
16
+ fetchImpl;
17
+ constructor(options = {}) {
18
+ this.apiBase = options.apiBase ?? MUSICBRAINZ_API_BASE;
19
+ this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
20
+ this.coverArtBaseUrl = options.coverArtBaseUrl === undefined ? MUSICBRAINZ_COVER_ART_BASE_URL : options.coverArtBaseUrl;
21
+ this.releaseGroupCoverArtBaseUrl = options.releaseGroupCoverArtBaseUrl === undefined ? MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL : options.releaseGroupCoverArtBaseUrl;
22
+ this.userAgent = options.userAgent ?? MUSICBRAINZ_DEFAULT_USER_AGENT;
23
+ }
24
+ async getJson(path, params) {
25
+ const url = new URL(`${this.apiBase.replace(/\/$/, "")}/${path.replace(/^\//, "")}`);
26
+ url.searchParams.set("fmt", "json");
27
+ for (const [key, value] of Object.entries(params))
28
+ url.searchParams.set(key, value);
29
+ const response = await this.fetchImpl(url, { headers: { accept: "application/json", "user-agent": this.userAgent } });
30
+ if (response.status === 404)
31
+ return undefined;
32
+ if (!response.ok) {
33
+ const body = await response.text().catch(() => "");
34
+ throw new Error(`MusicBrainz API returned ${response.status}: ${body}`);
35
+ }
36
+ return response.json();
37
+ }
38
+ transformOptions() {
39
+ return { coverArtBaseUrl: this.coverArtBaseUrl, releaseGroupCoverArtBaseUrl: this.releaseGroupCoverArtBaseUrl };
40
+ }
41
+ async fetchReleaseSourceRecord(input) { return fetchMusicBrainzSourceRecord(this, MUSICBRAINZ_RELEASE_CATEGORY, input); }
42
+ async fetchRelease(input) { const source = await this.fetchReleaseSourceRecord(input); return source ? transformMusicBrainzRelease(source, this.transformOptions()) : undefined; }
43
+ async searchReleaseSourceRecords(input) { return searchMusicBrainzSourceRecords(this, MUSICBRAINZ_RELEASE_CATEGORY, input); }
44
+ async searchReleases(input) { return searchMusicBrainz(this, MUSICBRAINZ_RELEASE_CATEGORY, input, this.transformOptions()); }
45
+ async fetchReleaseGroupSourceRecord(input) { return fetchMusicBrainzSourceRecord(this, MUSICBRAINZ_RELEASE_GROUP_CATEGORY, input); }
46
+ async fetchReleaseGroup(input) { const source = await this.fetchReleaseGroupSourceRecord(input); return source ? transformMusicBrainzReleaseGroup(source, { coverArtBaseUrl: this.releaseGroupCoverArtBaseUrl }) : undefined; }
47
+ async searchReleaseGroupSourceRecords(input) { return searchMusicBrainzSourceRecords(this, MUSICBRAINZ_RELEASE_GROUP_CATEGORY, input); }
48
+ async searchReleaseGroups(input) { return searchMusicBrainz(this, MUSICBRAINZ_RELEASE_GROUP_CATEGORY, input, this.transformOptions()); }
49
+ async fetchRecordingSourceRecord(input) { return fetchMusicBrainzSourceRecord(this, MUSICBRAINZ_RECORDING_CATEGORY, input); }
50
+ async fetchRecording(input) { const source = await this.fetchRecordingSourceRecord(input); return source ? transformMusicBrainzRecording(source) : undefined; }
51
+ async searchRecordingSourceRecords(input) { return searchMusicBrainzSourceRecords(this, MUSICBRAINZ_RECORDING_CATEGORY, input); }
52
+ async searchRecordings(input) { return searchMusicBrainz(this, MUSICBRAINZ_RECORDING_CATEGORY, input, this.transformOptions()); }
53
+ async fetchArtistSourceRecord(input) { return fetchMusicBrainzSourceRecord(this, MUSICBRAINZ_ARTIST_CATEGORY, input); }
54
+ async fetchArtist(input) { const source = await this.fetchArtistSourceRecord(input); return source ? transformMusicBrainzArtist(source) : undefined; }
55
+ async searchArtistSourceRecords(input) { return searchMusicBrainzSourceRecords(this, MUSICBRAINZ_ARTIST_CATEGORY, input); }
56
+ async searchArtists(input) { return searchMusicBrainz(this, MUSICBRAINZ_ARTIST_CATEGORY, input, this.transformOptions()); }
57
+ async fetchLabelSourceRecord(input) { return fetchMusicBrainzSourceRecord(this, MUSICBRAINZ_LABEL_CATEGORY, input); }
58
+ async fetchLabel(input) { const source = await this.fetchLabelSourceRecord(input); return source ? transformMusicBrainzLabel(source) : undefined; }
59
+ async searchLabelSourceRecords(input) { return searchMusicBrainzSourceRecords(this, MUSICBRAINZ_LABEL_CATEGORY, input); }
60
+ async searchLabels(input) { return searchMusicBrainz(this, MUSICBRAINZ_LABEL_CATEGORY, input, this.transformOptions()); }
61
+ async fetchWorkSourceRecord(input) { return fetchMusicBrainzSourceRecord(this, MUSICBRAINZ_WORK_CATEGORY, input); }
62
+ async fetchWork(input) { const source = await this.fetchWorkSourceRecord(input); return source ? transformMusicBrainzWork(source) : undefined; }
63
+ async searchWorkSourceRecords(input) { return searchMusicBrainzSourceRecords(this, MUSICBRAINZ_WORK_CATEGORY, input); }
64
+ async searchWorks(input) { return searchMusicBrainz(this, MUSICBRAINZ_WORK_CATEGORY, input, this.transformOptions()); }
65
+ }
66
+ export async function fetchMusicBrainzSourceRecord(provider, category, input) {
67
+ const id = musicBrainzId(input.id);
68
+ const payload = await provider.getJson(`/${entityPath(category)}/${id}`, { inc: lookupIncludes(category) });
69
+ if (!payload)
70
+ return undefined;
71
+ return createSourceRecord({ source: { provider: MUSICBRAINZ_PROVIDER, category, externalId: id }, payload });
72
+ }
73
+ export async function searchMusicBrainzSourceRecords(provider, category, input) {
74
+ const payload = await searchPayload(provider, category, input);
75
+ const results = searchItems(payload, category);
76
+ return {
77
+ results: await Promise.all(results.map((item) => createSourceRecord({ source: { provider: MUSICBRAINZ_PROVIDER, category, externalId: stringField(item, "id") ?? "" }, payload: item }))),
78
+ pagination: pagination(payload)
79
+ };
80
+ }
81
+ export async function searchMusicBrainz(provider, category, input, options = {}) {
82
+ const payload = await searchPayload(provider, category, input);
83
+ const results = [];
84
+ for (const item of searchItems(payload, category)) {
85
+ const externalId = stringField(item, "id");
86
+ const title = titleFor(item, category);
87
+ if (!externalId || !title)
88
+ continue;
89
+ const zuuid = await providerZuuid({ provider: MUSICBRAINZ_PROVIDER, category, externalId });
90
+ results.push({
91
+ id: zuuid,
92
+ zuuid,
93
+ category: publicCategory(category),
94
+ title,
95
+ date: dateFor(item, category),
96
+ cover: coverFor(item, category, options),
97
+ rating: null,
98
+ weight: numberValue(item.score),
99
+ relationType: null,
100
+ attribute: attributeFor(item, category),
101
+ order: null,
102
+ source: { source: MUSICBRAINZ_PROVIDER, category, value: externalId }
103
+ });
104
+ }
105
+ return { results, pagination: pagination(payload) };
106
+ }
107
+ async function searchPayload(provider, category, input) {
108
+ const query = input.query.trim();
109
+ if (!query)
110
+ throw new Error("MusicBrainz search query must not be empty");
111
+ return objectPayload(await provider.getJson(`/${entityPath(category)}`, {
112
+ query,
113
+ limit: String(input.limit ?? 25),
114
+ offset: String(input.offset ?? 0)
115
+ }) ?? {});
116
+ }
117
+ function searchItems(payload, category) {
118
+ const value = payload[searchKey(category)];
119
+ return Array.isArray(value) ? value.filter(isObject) : [];
120
+ }
121
+ function pagination(payload) {
122
+ const count = numberValue(payload.count) ?? 0;
123
+ const offset = numberValue(payload.offset) ?? 0;
124
+ const limit = Array.isArray(payload[searchKeyFromPayload(payload)]) ? payload[searchKeyFromPayload(payload)].length : 0;
125
+ return { page: limit > 0 ? Math.floor(offset / limit) + 1 : 1, totalPages: limit > 0 ? Math.ceil(count / limit) : 0, totalResults: count };
126
+ }
127
+ function searchKeyFromPayload(payload) {
128
+ return ["releases", "release-groups", "recordings", "artists", "labels", "works"].find((key) => Array.isArray(payload[key])) ?? "";
129
+ }
130
+ function lookupIncludes(category) {
131
+ switch (category) {
132
+ case MUSICBRAINZ_RELEASE_CATEGORY:
133
+ return "artists+labels+release-groups+media+recordings+genres+tags+url-rels";
134
+ case MUSICBRAINZ_RELEASE_GROUP_CATEGORY:
135
+ return "artists+releases+genres+tags+url-rels";
136
+ case MUSICBRAINZ_RECORDING_CATEGORY:
137
+ return "artists+releases+isrcs+genres+tags+work-rels+url-rels";
138
+ case MUSICBRAINZ_ARTIST_CATEGORY:
139
+ return "aliases+annotation+genres+tags+area-rels+url-rels";
140
+ case MUSICBRAINZ_LABEL_CATEGORY:
141
+ return "aliases+annotation+genres+tags+area-rels+url-rels";
142
+ case MUSICBRAINZ_WORK_CATEGORY:
143
+ return "aliases+annotation+artists+iswcs+genres+tags+artist-rels+url-rels";
144
+ default:
145
+ return "genres+tags";
146
+ }
147
+ }
148
+ function entityPath(category) { return category === MUSICBRAINZ_RELEASE_GROUP_CATEGORY ? "release-group" : category; }
149
+ function searchKey(category) { return category === MUSICBRAINZ_RELEASE_GROUP_CATEGORY ? "release-groups" : `${category}s`; }
150
+ function publicCategory(category) { return category === MUSICBRAINZ_RELEASE_GROUP_CATEGORY ? "release_group" : category === MUSICBRAINZ_WORK_CATEGORY ? "musical_work" : category; }
151
+ function titleFor(item, category) { return category === MUSICBRAINZ_ARTIST_CATEGORY || category === MUSICBRAINZ_LABEL_CATEGORY ? stringField(item, "name") : stringField(item, "title"); }
152
+ function dateFor(item, category) { return (category === MUSICBRAINZ_RELEASE_GROUP_CATEGORY ? stringField(item, "first-release-date") : category === MUSICBRAINZ_RECORDING_CATEGORY ? stringField(item, "first-release-date") : category === MUSICBRAINZ_ARTIST_CATEGORY || category === MUSICBRAINZ_LABEL_CATEGORY ? nestedString(item, ["life-span", "begin"]) : stringField(item, "date")) ?? null; }
153
+ function attributeFor(item, category) { return category === MUSICBRAINZ_ARTIST_CATEGORY || category === MUSICBRAINZ_LABEL_CATEGORY || category === MUSICBRAINZ_WORK_CATEGORY ? stringField(item, "type") ?? null : stringField(item, "primary-type") ?? stringField(item, "status") ?? null; }
154
+ function coverFor(item, category, options) { const id = stringField(item, "id"); if (!id)
155
+ return null; if (category === MUSICBRAINZ_RELEASE_GROUP_CATEGORY && options.releaseGroupCoverArtBaseUrl)
156
+ return `${options.releaseGroupCoverArtBaseUrl.replace(/\/$/, "")}/${id}/front`; if (category === MUSICBRAINZ_RELEASE_CATEGORY && options.coverArtBaseUrl && objectPayload(item["cover-art-archive"] ?? {}).front === true)
157
+ return `${options.coverArtBaseUrl.replace(/\/$/, "")}/${id}/front`; return null; }
158
+ function numberValue(value) { if (typeof value === "number" && Number.isFinite(value))
159
+ return value; if (typeof value === "string") {
160
+ const parsed = Number(value);
161
+ return Number.isFinite(parsed) ? parsed : null;
162
+ } return null; }
163
+ function isObject(value) { return !!value && typeof value === "object" && !Array.isArray(value); }
164
+ function musicBrainzId(value) {
165
+ const id = value.trim();
166
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id))
167
+ throw new Error(`Invalid MusicBrainz MBID: ${value}`);
168
+ return id.toLowerCase();
169
+ }
@@ -7,4 +7,6 @@ export declare const MUSICBRAINZ_LABEL_CATEGORY = "label";
7
7
  export declare const MUSICBRAINZ_WORK_CATEGORY = "work";
8
8
  export declare const MUSICBRAINZ_COVER_ART_BASE_URL = "https://coverartarchive.org/release";
9
9
  export declare const MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL = "https://coverartarchive.org/release-group";
10
+ export declare const MUSICBRAINZ_API_BASE = "https://musicbrainz.org/ws/2";
11
+ export declare const MUSICBRAINZ_DEFAULT_USER_AGENT = "@zivue/zuuid/0.2.5 (https://github.com/zivue/zuuid)";
10
12
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,4BAA4B,YAAY,CAAC;AACtD,eAAO,MAAM,kCAAkC,kBAAkB,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,2BAA2B,WAAW,CAAC;AACpD,eAAO,MAAM,0BAA0B,UAAU,CAAC;AAClD,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAChD,eAAO,MAAM,8BAA8B,wCAAwC,CAAC;AACpF,eAAO,MAAM,4CAA4C,8CAA8C,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,4BAA4B,YAAY,CAAC;AACtD,eAAO,MAAM,kCAAkC,kBAAkB,CAAC;AAClE,eAAO,MAAM,8BAA8B,cAAc,CAAC;AAC1D,eAAO,MAAM,2BAA2B,WAAW,CAAC;AACpD,eAAO,MAAM,0BAA0B,UAAU,CAAC;AAClD,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAChD,eAAO,MAAM,8BAA8B,wCAAwC,CAAC;AACpF,eAAO,MAAM,4CAA4C,8CAA8C,CAAC;AACxG,eAAO,MAAM,oBAAoB,iCAAiC,CAAC;AACnE,eAAO,MAAM,8BAA8B,wDAAwD,CAAC"}
@@ -7,3 +7,5 @@ export const MUSICBRAINZ_LABEL_CATEGORY = "label";
7
7
  export const MUSICBRAINZ_WORK_CATEGORY = "work";
8
8
  export const MUSICBRAINZ_COVER_ART_BASE_URL = "https://coverartarchive.org/release";
9
9
  export const MUSICBRAINZ_RELEASE_GROUP_COVER_ART_BASE_URL = "https://coverartarchive.org/release-group";
10
+ export const MUSICBRAINZ_API_BASE = "https://musicbrainz.org/ws/2";
11
+ export const MUSICBRAINZ_DEFAULT_USER_AGENT = "@zivue/zuuid/0.2.5 (https://github.com/zivue/zuuid)";
@@ -1,3 +1,4 @@
1
+ export * from "./client.js";
1
2
  export * from "./artist.js";
2
3
  export * from "./constants.js";
3
4
  export * from "./label.js";
@@ -5,4 +6,5 @@ export * from "./recording.js";
5
6
  export * from "./release.js";
6
7
  export * from "./release-group.js";
7
8
  export * from "./work.js";
9
+ export * from "./types.js";
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
+ export * from "./client.js";
1
2
  export * from "./artist.js";
2
3
  export * from "./constants.js";
3
4
  export * from "./label.js";
@@ -5,3 +6,4 @@ export * from "./recording.js";
5
6
  export * from "./release.js";
6
7
  export * from "./release-group.js";
7
8
  export * from "./work.js";
9
+ export * from "./types.js";
@@ -0,0 +1,21 @@
1
+ export type MusicBrainzFetchLike = (input: string | URL, init?: RequestInit) => Promise<Response>;
2
+ export type MusicBrainzProviderOptions = {
3
+ apiBase?: string;
4
+ fetch?: MusicBrainzFetchLike;
5
+ userAgent?: string;
6
+ coverArtBaseUrl?: string | null;
7
+ releaseGroupCoverArtBaseUrl?: string | null;
8
+ };
9
+ export type MusicBrainzProviderTransformOptions = {
10
+ coverArtBaseUrl?: string | null;
11
+ releaseGroupCoverArtBaseUrl?: string | null;
12
+ };
13
+ export type FetchMusicBrainzInput = {
14
+ id: string;
15
+ };
16
+ export type MusicBrainzSearchInput = {
17
+ query: string;
18
+ limit?: number;
19
+ offset?: number;
20
+ };
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/musicbrainz/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElG,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { transformOpenStreetMapPlace as transformOpenStreetMapCity } from "./place.js";
2
+ //# sourceMappingURL=city.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"city.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/city.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,IAAI,0BAA0B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformOpenStreetMapPlace as transformOpenStreetMapCity } from "./place.js";
@@ -0,0 +1,31 @@
1
+ import type { SearchResponse, ZuuidData, ZuuidSearchResult } from "../../entity.js";
2
+ import { type SourceRecord } from "../../source.js";
3
+ import type { FetchOpenStreetMapInput, OpenStreetMapProviderOptions, OpenStreetMapSearchInput } from "./types.js";
4
+ export declare class OpenStreetMapProvider {
5
+ readonly apiBase: string;
6
+ readonly userAgent: string;
7
+ readonly language: string;
8
+ private readonly fetchImpl;
9
+ constructor(options?: OpenStreetMapProviderOptions);
10
+ getJson<T>(path: string, params: Record<string, string>): Promise<T | undefined>;
11
+ fetchCitySourceRecord(input: FetchOpenStreetMapInput): Promise<SourceRecord | undefined>;
12
+ fetchCity(input: FetchOpenStreetMapInput): Promise<ZuuidData | undefined>;
13
+ searchCitySourceRecords(input: OpenStreetMapSearchInput): Promise<SearchResponse<SourceRecord>>;
14
+ searchCities(input: OpenStreetMapSearchInput): Promise<SearchResponse<ZuuidSearchResult>>;
15
+ fetchCountrySourceRecord(input: FetchOpenStreetMapInput): Promise<SourceRecord | undefined>;
16
+ fetchCountry(input: FetchOpenStreetMapInput): Promise<ZuuidData | undefined>;
17
+ searchCountrySourceRecords(input: OpenStreetMapSearchInput): Promise<SearchResponse<SourceRecord>>;
18
+ searchCountries(input: OpenStreetMapSearchInput): Promise<SearchResponse<ZuuidSearchResult>>;
19
+ fetchPlaceSourceRecord(input: FetchOpenStreetMapInput): Promise<SourceRecord | undefined>;
20
+ fetchPlace(input: FetchOpenStreetMapInput): Promise<ZuuidData | undefined>;
21
+ searchPlaceSourceRecords(input: OpenStreetMapSearchInput): Promise<SearchResponse<SourceRecord>>;
22
+ searchPlaces(input: OpenStreetMapSearchInput): Promise<SearchResponse<ZuuidSearchResult>>;
23
+ fetchVenueSourceRecord(input: FetchOpenStreetMapInput): Promise<SourceRecord | undefined>;
24
+ fetchVenue(input: FetchOpenStreetMapInput): Promise<ZuuidData | undefined>;
25
+ searchVenueSourceRecords(input: OpenStreetMapSearchInput): Promise<SearchResponse<SourceRecord>>;
26
+ searchVenues(input: OpenStreetMapSearchInput): Promise<SearchResponse<ZuuidSearchResult>>;
27
+ }
28
+ export declare function fetchOpenStreetMapSourceRecord(provider: OpenStreetMapProvider, category: string, input: FetchOpenStreetMapInput): Promise<SourceRecord | undefined>;
29
+ export declare function searchOpenStreetMapSourceRecords(provider: OpenStreetMapProvider, category: string, input: OpenStreetMapSearchInput): Promise<SearchResponse<SourceRecord>>;
30
+ export declare function searchOpenStreetMap(provider: OpenStreetMapProvider, category: string, input: OpenStreetMapSearchInput): Promise<SearchResponse<ZuuidSearchResult>>;
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAaxE,OAAO,KAAK,EAAE,uBAAuB,EAA0B,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAK1I,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBAEvC,OAAO,GAAE,4BAAiC;IAOhD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAYhF,qBAAqB,CAAC,KAAK,EAAE,uBAAuB;IACpD,SAAS,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IACzE,uBAAuB,CAAC,KAAK,EAAE,wBAAwB;IACvD,YAAY,CAAC,KAAK,EAAE,wBAAwB;IAE5C,wBAAwB,CAAC,KAAK,EAAE,uBAAuB;IACvD,YAAY,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC5E,0BAA0B,CAAC,KAAK,EAAE,wBAAwB;IAC1D,eAAe,CAAC,KAAK,EAAE,wBAAwB;IAE/C,sBAAsB,CAAC,KAAK,EAAE,uBAAuB;IACrD,UAAU,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1E,wBAAwB,CAAC,KAAK,EAAE,wBAAwB;IACxD,YAAY,CAAC,KAAK,EAAE,wBAAwB;IAE5C,sBAAsB,CAAC,KAAK,EAAE,uBAAuB;IACrD,UAAU,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1E,wBAAwB,CAAC,KAAK,EAAE,wBAAwB;IACxD,YAAY,CAAC,KAAK,EAAE,wBAAwB;CACnD;AAED,wBAAsB,8BAA8B,CAAC,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAYzK;AAED,wBAAsB,gCAAgC,CAAC,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAOhL;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAyBxK"}
@@ -0,0 +1,146 @@
1
+ import { providerZuuid } from "../../identity.js";
2
+ import { createSourceRecord } from "../../source.js";
3
+ import { nestedString, normalizeRating, objectPayload, stringField, valueAsString } from "../common.js";
4
+ import { OPENSTREETMAP_API_BASE, OPENSTREETMAP_CITY_CATEGORY, OPENSTREETMAP_COUNTRY_CATEGORY, OPENSTREETMAP_DEFAULT_USER_AGENT, OPENSTREETMAP_PLACE_CATEGORY, OPENSTREETMAP_PROVIDER, OPENSTREETMAP_VENUE_CATEGORY } from "./constants.js";
5
+ import { transformOpenStreetMapPlace } from "./place.js";
6
+ const CATEGORIES = [OPENSTREETMAP_CITY_CATEGORY, OPENSTREETMAP_COUNTRY_CATEGORY, OPENSTREETMAP_PLACE_CATEGORY, OPENSTREETMAP_VENUE_CATEGORY];
7
+ export class OpenStreetMapProvider {
8
+ apiBase;
9
+ userAgent;
10
+ language;
11
+ fetchImpl;
12
+ constructor(options = {}) {
13
+ this.apiBase = options.apiBase ?? OPENSTREETMAP_API_BASE;
14
+ this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
15
+ this.userAgent = options.userAgent ?? OPENSTREETMAP_DEFAULT_USER_AGENT;
16
+ this.language = options.language ?? "en-US,en;q=0.9";
17
+ }
18
+ async getJson(path, params) {
19
+ const url = new URL(`${this.apiBase.replace(/\/$/, "")}/${path.replace(/^\//, "")}`);
20
+ for (const [key, value] of Object.entries(params))
21
+ url.searchParams.set(key, value);
22
+ const response = await this.fetchImpl(url, { headers: { accept: "application/json", "accept-language": this.language, "user-agent": this.userAgent } });
23
+ if (response.status === 404)
24
+ return undefined;
25
+ if (!response.ok) {
26
+ const body = await response.text().catch(() => "");
27
+ throw new Error(`OpenStreetMap API returned ${response.status}: ${body}`);
28
+ }
29
+ return response.json();
30
+ }
31
+ async fetchCitySourceRecord(input) { return fetchOpenStreetMapSourceRecord(this, OPENSTREETMAP_CITY_CATEGORY, input); }
32
+ async fetchCity(input) { const source = await this.fetchCitySourceRecord(input); return source ? transformOpenStreetMapPlace(source) : undefined; }
33
+ async searchCitySourceRecords(input) { return searchOpenStreetMapSourceRecords(this, OPENSTREETMAP_CITY_CATEGORY, input); }
34
+ async searchCities(input) { return searchOpenStreetMap(this, OPENSTREETMAP_CITY_CATEGORY, input); }
35
+ async fetchCountrySourceRecord(input) { return fetchOpenStreetMapSourceRecord(this, OPENSTREETMAP_COUNTRY_CATEGORY, input); }
36
+ async fetchCountry(input) { const source = await this.fetchCountrySourceRecord(input); return source ? transformOpenStreetMapPlace(source) : undefined; }
37
+ async searchCountrySourceRecords(input) { return searchOpenStreetMapSourceRecords(this, OPENSTREETMAP_COUNTRY_CATEGORY, input); }
38
+ async searchCountries(input) { return searchOpenStreetMap(this, OPENSTREETMAP_COUNTRY_CATEGORY, input); }
39
+ async fetchPlaceSourceRecord(input) { return fetchOpenStreetMapSourceRecord(this, OPENSTREETMAP_PLACE_CATEGORY, input); }
40
+ async fetchPlace(input) { const source = await this.fetchPlaceSourceRecord(input); return source ? transformOpenStreetMapPlace(source) : undefined; }
41
+ async searchPlaceSourceRecords(input) { return searchOpenStreetMapSourceRecords(this, OPENSTREETMAP_PLACE_CATEGORY, input); }
42
+ async searchPlaces(input) { return searchOpenStreetMap(this, OPENSTREETMAP_PLACE_CATEGORY, input); }
43
+ async fetchVenueSourceRecord(input) { return fetchOpenStreetMapSourceRecord(this, OPENSTREETMAP_VENUE_CATEGORY, input); }
44
+ async fetchVenue(input) { const source = await this.fetchVenueSourceRecord(input); return source ? transformOpenStreetMapPlace(source) : undefined; }
45
+ async searchVenueSourceRecords(input) { return searchOpenStreetMapSourceRecords(this, OPENSTREETMAP_VENUE_CATEGORY, input); }
46
+ async searchVenues(input) { return searchOpenStreetMap(this, OPENSTREETMAP_VENUE_CATEGORY, input); }
47
+ }
48
+ export async function fetchOpenStreetMapSourceRecord(provider, category, input) {
49
+ const osmId = normalizeOsmId(input.id);
50
+ const payload = await provider.getJson("/lookup", {
51
+ osm_ids: osmId,
52
+ format: "jsonv2",
53
+ addressdetails: "1",
54
+ extratags: "1",
55
+ namedetails: "1"
56
+ });
57
+ const item = Array.isArray(payload) ? payload.find(isObject) : undefined;
58
+ if (!item)
59
+ return undefined;
60
+ return createSourceRecord({ source: { provider: OPENSTREETMAP_PROVIDER, category: requireCategory(category), externalId: osmId }, payload: item });
61
+ }
62
+ export async function searchOpenStreetMapSourceRecords(provider, category, input) {
63
+ const items = await searchPayload(provider, input);
64
+ const normalizedCategory = requireCategory(category);
65
+ return {
66
+ results: await Promise.all(items.map((item) => createSourceRecord({ source: { provider: OPENSTREETMAP_PROVIDER, category: normalizedCategory, externalId: osmExternalId(item) ?? valueAsString(item.place_id) ?? "" }, payload: item }))),
67
+ pagination: pagination(items, input.limit)
68
+ };
69
+ }
70
+ export async function searchOpenStreetMap(provider, category, input) {
71
+ const items = await searchPayload(provider, input);
72
+ const normalizedCategory = requireCategory(category);
73
+ const results = [];
74
+ for (const item of items) {
75
+ const externalId = osmExternalId(item) ?? valueAsString(item.place_id);
76
+ const title = stringField(item, "name") ?? stringField(item, "display_name");
77
+ if (!externalId || !title)
78
+ continue;
79
+ const zuuid = await providerZuuid({ provider: OPENSTREETMAP_PROVIDER, category: normalizedCategory, externalId });
80
+ results.push({
81
+ id: zuuid,
82
+ zuuid,
83
+ category: normalizedCategory,
84
+ title,
85
+ date: null,
86
+ cover: stringField(item, "icon") ?? null,
87
+ rating: normalizeRating(typeof item.importance === "number" ? item.importance : undefined, 0, 1) ?? null,
88
+ weight: typeof item.importance === "number" ? item.importance : null,
89
+ relationType: null,
90
+ attribute: [stringField(item, "class"), stringField(item, "type")].filter(Boolean).join(":") || null,
91
+ order: null,
92
+ source: { source: OPENSTREETMAP_PROVIDER, category: normalizedCategory, value: externalId }
93
+ });
94
+ }
95
+ return { results, pagination: pagination(items, input.limit) };
96
+ }
97
+ async function searchPayload(provider, input) {
98
+ const query = input.query.trim();
99
+ if (!query)
100
+ throw new Error("OpenStreetMap search query must not be empty");
101
+ const payload = await provider.getJson("/search", {
102
+ q: query,
103
+ format: "jsonv2",
104
+ addressdetails: "1",
105
+ extratags: "1",
106
+ namedetails: "1",
107
+ limit: String(input.limit ?? 10),
108
+ ...(input.language ? { "accept-language": input.language } : {})
109
+ });
110
+ return Array.isArray(payload) ? payload.filter(isObject) : [];
111
+ }
112
+ function pagination(items, limit) {
113
+ const pageSize = limit ?? items.length;
114
+ return { page: 1, totalPages: pageSize > 0 && items.length > 0 ? 1 : 0, totalResults: items.length };
115
+ }
116
+ function normalizeOsmId(value) {
117
+ const raw = String(value).trim();
118
+ const prefixed = raw.match(/^([NWR])\s*(\d+)$/i);
119
+ if (prefixed)
120
+ return `${prefixed[1].toUpperCase()}${prefixed[2]}`;
121
+ const typed = raw.match(/^(node|way|relation)[-:\s]*(\d+)$/i);
122
+ if (typed)
123
+ return `${typePrefix(typed[1])}${typed[2]}`;
124
+ if (/^\d+$/.test(raw))
125
+ throw new Error(`OpenStreetMap id must include an OSM type prefix N, W, or R: ${value}`);
126
+ throw new Error(`Invalid OpenStreetMap id: ${value}`);
127
+ }
128
+ function typePrefix(value) {
129
+ const normalized = value.toLowerCase();
130
+ return normalized === "node" ? "N" : normalized === "way" ? "W" : "R";
131
+ }
132
+ function osmExternalId(payload) {
133
+ const osmType = stringField(payload, "osm_type");
134
+ const id = valueAsString(payload.osm_id);
135
+ if (!osmType || !id)
136
+ return undefined;
137
+ return `${typePrefix(osmType)}${id}`;
138
+ }
139
+ function requireCategory(category) {
140
+ if (CATEGORIES.includes(category))
141
+ return category;
142
+ throw new Error(`unsupported OpenStreetMap category: ${category}`);
143
+ }
144
+ function isObject(value) {
145
+ return !!value && typeof value === "object" && !Array.isArray(value);
146
+ }
@@ -3,4 +3,6 @@ export declare const OPENSTREETMAP_CITY_CATEGORY = "city";
3
3
  export declare const OPENSTREETMAP_COUNTRY_CATEGORY = "country";
4
4
  export declare const OPENSTREETMAP_PLACE_CATEGORY = "place";
5
5
  export declare const OPENSTREETMAP_VENUE_CATEGORY = "venue";
6
+ export declare const OPENSTREETMAP_API_BASE = "https://nominatim.openstreetmap.org";
7
+ export declare const OPENSTREETMAP_DEFAULT_USER_AGENT = "@zivue/zuuid OpenStreetMap client (+https://github.com/zivue/zuuid)";
6
8
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AACtD,eAAO,MAAM,2BAA2B,SAAS,CAAC;AAClD,eAAO,MAAM,8BAA8B,YAAY,CAAC;AACxD,eAAO,MAAM,4BAA4B,UAAU,CAAC;AACpD,eAAO,MAAM,4BAA4B,UAAU,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,kBAAkB,CAAC;AACtD,eAAO,MAAM,2BAA2B,SAAS,CAAC;AAClD,eAAO,MAAM,8BAA8B,YAAY,CAAC;AACxD,eAAO,MAAM,4BAA4B,UAAU,CAAC;AACpD,eAAO,MAAM,4BAA4B,UAAU,CAAC;AACpD,eAAO,MAAM,sBAAsB,wCAAwC,CAAC;AAC5E,eAAO,MAAM,gCAAgC,wEAAwE,CAAC"}
@@ -3,3 +3,5 @@ export const OPENSTREETMAP_CITY_CATEGORY = "city";
3
3
  export const OPENSTREETMAP_COUNTRY_CATEGORY = "country";
4
4
  export const OPENSTREETMAP_PLACE_CATEGORY = "place";
5
5
  export const OPENSTREETMAP_VENUE_CATEGORY = "venue";
6
+ export const OPENSTREETMAP_API_BASE = "https://nominatim.openstreetmap.org";
7
+ export const OPENSTREETMAP_DEFAULT_USER_AGENT = "@zivue/zuuid OpenStreetMap client (+https://github.com/zivue/zuuid)";
@@ -0,0 +1,2 @@
1
+ export { transformOpenStreetMapPlace as transformOpenStreetMapCountry } from "./place.js";
2
+ //# sourceMappingURL=country.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"country.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/country.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,IAAI,6BAA6B,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export { transformOpenStreetMapPlace as transformOpenStreetMapCountry } from "./place.js";
@@ -1,3 +1,7 @@
1
+ export * from "./types.js";
2
+ export * from "./country.js";
3
+ export * from "./client.js";
4
+ export * from "./city.js";
1
5
  export * from "./constants.js";
2
6
  export * from "./place.js";
3
7
  export * from "./venue.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -1,3 +1,7 @@
1
+ export * from "./types.js";
2
+ export * from "./country.js";
3
+ export * from "./client.js";
4
+ export * from "./city.js";
1
5
  export * from "./constants.js";
2
6
  export * from "./place.js";
3
7
  export * from "./venue.js";
@@ -0,0 +1,16 @@
1
+ export type OpenStreetMapFetchLike = (input: string | URL, init?: RequestInit) => Promise<Response>;
2
+ export type OpenStreetMapProviderOptions = {
3
+ apiBase?: string;
4
+ fetch?: OpenStreetMapFetchLike;
5
+ userAgent?: string;
6
+ language?: string;
7
+ };
8
+ export type FetchOpenStreetMapInput = {
9
+ id: string | number;
10
+ };
11
+ export type OpenStreetMapSearchInput = {
12
+ query: string;
13
+ limit?: number;
14
+ language?: string;
15
+ };
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/providers/openstreetmap/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEpG,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zivue/zuuid",
3
- "version": "0.2.2",
3
+ "version": "0.2.5",
4
4
  "description": "TypeScript helpers for fetching, searching, and transforming Zuuid datasets.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -56,6 +56,10 @@
56
56
  "types": "./dist/providers/comicvine/transform.d.ts",
57
57
  "import": "./dist/providers/comicvine/transform.js"
58
58
  },
59
+ "./providers/comicvine/client": {
60
+ "types": "./dist/providers/comicvine/client.d.ts",
61
+ "import": "./dist/providers/comicvine/client.js"
62
+ },
59
63
  "./providers/comicvine/volume": {
60
64
  "types": "./dist/providers/comicvine/volume.d.ts",
61
65
  "import": "./dist/providers/comicvine/volume.js"
@@ -164,10 +168,22 @@
164
168
  "types": "./dist/providers/openstreetmap/index.d.ts",
165
169
  "import": "./dist/providers/openstreetmap/index.js"
166
170
  },
171
+ "./providers/openstreetmap/client": {
172
+ "types": "./dist/providers/openstreetmap/client.d.ts",
173
+ "import": "./dist/providers/openstreetmap/client.js"
174
+ },
167
175
  "./providers/openstreetmap/place": {
168
176
  "types": "./dist/providers/openstreetmap/place.d.ts",
169
177
  "import": "./dist/providers/openstreetmap/place.js"
170
178
  },
179
+ "./providers/openstreetmap/city": {
180
+ "types": "./dist/providers/openstreetmap/city.d.ts",
181
+ "import": "./dist/providers/openstreetmap/city.js"
182
+ },
183
+ "./providers/openstreetmap/country": {
184
+ "types": "./dist/providers/openstreetmap/country.d.ts",
185
+ "import": "./dist/providers/openstreetmap/country.js"
186
+ },
171
187
  "./providers/openstreetmap/venue": {
172
188
  "types": "./dist/providers/openstreetmap/venue.d.ts",
173
189
  "import": "./dist/providers/openstreetmap/venue.js"
@@ -255,6 +271,10 @@
255
271
  "./providers/gamesdb/client": {
256
272
  "types": "./dist/providers/gamesdb/client.d.ts",
257
273
  "import": "./dist/providers/gamesdb/client.js"
274
+ },
275
+ "./providers/musicbrainz/client": {
276
+ "types": "./dist/providers/musicbrainz/client.d.ts",
277
+ "import": "./dist/providers/musicbrainz/client.js"
258
278
  }
259
279
  },
260
280
  "types": "./dist/index.d.ts",