@shard-for-obsidian/lib 0.2.4 → 0.3.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 (46) hide show
  1. package/dist/adapters/index.d.ts +3 -0
  2. package/dist/adapters/index.d.ts.map +1 -0
  3. package/dist/adapters/index.js +2 -0
  4. package/dist/adapters/node.d.ts +9 -0
  5. package/dist/adapters/node.d.ts.map +1 -0
  6. package/dist/adapters/node.js +10 -0
  7. package/dist/adapters/obsidian.d.ts +13 -0
  8. package/dist/adapters/obsidian.d.ts.map +1 -0
  9. package/dist/adapters/obsidian.js +90 -0
  10. package/dist/client/OciRegistryClient.d.ts +23 -2
  11. package/dist/client/OciRegistryClient.d.ts.map +1 -1
  12. package/dist/client/OciRegistryClient.js +52 -3
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +8 -0
  16. package/dist/index.js.map +2 -2
  17. package/dist/marketplace/client.d.ts +48 -0
  18. package/dist/marketplace/client.d.ts.map +1 -0
  19. package/dist/marketplace/client.js +104 -0
  20. package/dist/marketplace/index.d.ts +2 -0
  21. package/dist/marketplace/index.d.ts.map +1 -0
  22. package/dist/marketplace/index.js +1 -0
  23. package/dist/oci/index.d.ts +2 -0
  24. package/dist/oci/index.d.ts.map +1 -0
  25. package/dist/oci/index.js +1 -0
  26. package/dist/oci/tags.d.ts +26 -0
  27. package/dist/oci/tags.d.ts.map +1 -0
  28. package/dist/oci/tags.js +134 -0
  29. package/dist/schemas/annotations.d.ts +78 -0
  30. package/dist/schemas/annotations.d.ts.map +1 -0
  31. package/dist/schemas/annotations.js +39 -0
  32. package/dist/schemas/index.d.ts +5 -0
  33. package/dist/schemas/index.d.ts.map +1 -0
  34. package/dist/schemas/index.js +6 -0
  35. package/dist/schemas/manifest.d.ts +50 -0
  36. package/dist/schemas/manifest.d.ts.map +1 -0
  37. package/dist/schemas/manifest.js +25 -0
  38. package/dist/schemas/marketplace.d.ts +379 -0
  39. package/dist/schemas/marketplace.d.ts.map +1 -0
  40. package/dist/schemas/marketplace.js +67 -0
  41. package/dist/schemas/transforms.d.ts +60 -0
  42. package/dist/schemas/transforms.d.ts.map +1 -0
  43. package/dist/schemas/transforms.js +148 -0
  44. package/dist/types/ManifestTypes.d.ts +2 -23
  45. package/dist/types/ManifestTypes.d.ts.map +1 -1
  46. package/package.json +6 -2
@@ -0,0 +1,3 @@
1
+ export { NodeFetchAdapter } from "./node.js";
2
+ export { ObsidianFetchAdapter } from "./obsidian.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { NodeFetchAdapter } from "./node.js";
2
+ export { ObsidianFetchAdapter } from "./obsidian.js";
@@ -0,0 +1,9 @@
1
+ import type { FetchAdapter } from "../client/FetchAdapter.js";
2
+ /**
3
+ * Adapter for Node.js native fetch API.
4
+ * Thin wrapper that passes through to native fetch.
5
+ */
6
+ export declare class NodeFetchAdapter implements FetchAdapter {
7
+ fetch(input: string | Request, init?: RequestInit): Promise<Response>;
8
+ }
9
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/adapters/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IAC7C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;CAI5E"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Adapter for Node.js native fetch API.
3
+ * Thin wrapper that passes through to native fetch.
4
+ */
5
+ export class NodeFetchAdapter {
6
+ async fetch(input, init) {
7
+ // Use native Node.js fetch
8
+ return fetch(input, init);
9
+ }
10
+ }
@@ -0,0 +1,13 @@
1
+ import type { FetchAdapter } from "../client/FetchAdapter.js";
2
+ import type { RequestUrlParam, RequestUrlResponse } from "../types/RequestTypes.js";
3
+ /**
4
+ * Adapter for Obsidian's requestUrl API.
5
+ * Converts between fetch API and Obsidian's request format.
6
+ */
7
+ export declare class ObsidianFetchAdapter implements FetchAdapter {
8
+ private requestUrl;
9
+ constructor(requestUrl: (request: RequestUrlParam | string) => Promise<RequestUrlResponse>);
10
+ fetch(input: string | Request, init?: RequestInit): Promise<Response>;
11
+ private convertToResponse;
12
+ }
13
+ //# sourceMappingURL=obsidian.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian.d.ts","sourceRoot":"","sources":["../../src/adapters/obsidian.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEpF;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IAErD,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,CAClB,OAAO,EAAE,eAAe,GAAG,MAAM,KAC9B,OAAO,CAAC,kBAAkB,CAAC;IAG5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmE3E,OAAO,CAAC,iBAAiB;CAc1B"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Adapter for Obsidian's requestUrl API.
3
+ * Converts between fetch API and Obsidian's request format.
4
+ */
5
+ export class ObsidianFetchAdapter {
6
+ requestUrl;
7
+ constructor(requestUrl) {
8
+ this.requestUrl = requestUrl;
9
+ }
10
+ async fetch(input, init) {
11
+ // Convert Request to string URL
12
+ const url = typeof input === "string" ? input : input.url;
13
+ // Merge headers from Request and init
14
+ const headers = {};
15
+ if (typeof input !== "string" && input.headers) {
16
+ input.headers.forEach((value, key) => {
17
+ headers[key] = value;
18
+ });
19
+ }
20
+ if (init?.headers) {
21
+ if (init.headers instanceof Headers) {
22
+ init.headers.forEach((value, key) => {
23
+ headers[key] = value;
24
+ });
25
+ }
26
+ else if (Array.isArray(init.headers)) {
27
+ for (const [key, value] of init.headers) {
28
+ headers[key] = value;
29
+ }
30
+ }
31
+ else {
32
+ Object.assign(headers, init.headers);
33
+ }
34
+ }
35
+ // Get method from init or Request
36
+ const method = init?.method || (typeof input !== "string" ? input.method : "GET");
37
+ // Get body from init or Request
38
+ let body;
39
+ if (init?.body) {
40
+ if (typeof init.body === "string") {
41
+ body = init.body;
42
+ }
43
+ else if (init.body instanceof ArrayBuffer) {
44
+ body = init.body;
45
+ }
46
+ else if (init.body instanceof Uint8Array) {
47
+ body = init.body.buffer.slice(0);
48
+ }
49
+ else {
50
+ // Convert other body types to ArrayBuffer
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ const blob = new Blob([init.body]);
53
+ body = await blob.arrayBuffer();
54
+ }
55
+ }
56
+ else if (typeof input !== "string" && input.body) {
57
+ if (input.body instanceof ArrayBuffer) {
58
+ body = input.body;
59
+ }
60
+ else {
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ const blob = new Blob([input.body]);
63
+ body = await blob.arrayBuffer();
64
+ }
65
+ }
66
+ // Make the request using Obsidian's requestUrl
67
+ const response = await this.requestUrl({
68
+ url,
69
+ method,
70
+ headers,
71
+ body,
72
+ throw: false, // Handle errors ourselves
73
+ });
74
+ // Convert RequestUrlResponse to Response
75
+ return this.convertToResponse(response);
76
+ }
77
+ convertToResponse(response) {
78
+ // Convert headers object to Headers
79
+ const headers = new Headers();
80
+ for (const [key, value] of Object.entries(response.headers)) {
81
+ headers.set(key, value);
82
+ }
83
+ // Create Response with arrayBuffer body
84
+ return new Response(response.arrayBuffer, {
85
+ status: response.status,
86
+ statusText: "", // requestUrl doesn't provide statusText
87
+ headers,
88
+ });
89
+ }
90
+ }
@@ -131,14 +131,16 @@ export declare class OciRegistryClient {
131
131
  * <https://github.com/opencontainers/distribution-spec/blob/main/spec.md#post-then-put>
132
132
  *
133
133
  * @param opts.data The blob data as ArrayBuffer or Uint8Array
134
- * @param opts.digest Optional digest. If not provided, it will be calculated.
135
- * @returns Object with digest and size of the uploaded blob
134
+ * @param opts.annotations Optional annotations for the blob
135
+ * @returns Object with digest, size, and annotations (with auto-added ORAS title if applicable)
136
136
  */
137
137
  pushBlob(opts: {
138
138
  data: ArrayBuffer | Uint8Array;
139
+ annotations?: Record<string, string>;
139
140
  }): Promise<{
140
141
  digest: string;
141
142
  size: number;
143
+ annotations?: Record<string, string>;
142
144
  }>;
143
145
  /**
144
146
  * Upload an image manifest.
@@ -157,6 +159,25 @@ export declare class OciRegistryClient {
157
159
  digest: string;
158
160
  size: number;
159
161
  }>;
162
+ /**
163
+ * Push a manifest with multiple tags atomically.
164
+ * Pushes the manifest once with the first tag, then tags the remaining tags
165
+ * by pushing the same manifest content.
166
+ *
167
+ * @param opts.tags Array of tags to apply (must not be empty)
168
+ * @param opts.manifest The manifest object to upload
169
+ * @param opts.annotations Optional annotations to merge with manifest annotations
170
+ * @returns Object with digest, tags array, and size
171
+ */
172
+ pushManifestWithTags(opts: {
173
+ tags: string[];
174
+ manifest: ManifestOCI;
175
+ annotations?: Record<string, string>;
176
+ }): Promise<{
177
+ digest: string;
178
+ tags: string[];
179
+ size: number;
180
+ }>;
160
181
  /**
161
182
  * Push a plugin manifest as a config blob and create an OCI manifest.
162
183
  * This follows the OCI spec where the Obsidian manifest is stored as the config.
@@ -1 +1 @@
1
- {"version":3,"file":"OciRegistryClient.d.ts","sourceRoot":"","sources":["../../src/client/OciRegistryClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OciRegistryClient.d.ts","sourceRoot":"","sources":["../../src/client/OciRegistryClient.ts"],"names":[],"mappings":"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"}
@@ -536,8 +536,8 @@ export class OciRegistryClient {
536
536
  * <https://github.com/opencontainers/distribution-spec/blob/main/spec.md#post-then-put>
537
537
  *
538
538
  * @param opts.data The blob data as ArrayBuffer or Uint8Array
539
- * @param opts.digest Optional digest. If not provided, it will be calculated.
540
- * @returns Object with digest and size of the uploaded blob
539
+ * @param opts.annotations Optional annotations for the blob
540
+ * @returns Object with digest, size, and annotations (with auto-added ORAS title if applicable)
541
541
  */
542
542
  async pushBlob(opts) {
543
543
  await this.login();
@@ -589,7 +589,14 @@ export class OciRegistryClient {
589
589
  if (returnedDigest && returnedDigest !== digest) {
590
590
  throw new e.BadDigestError(`Digest mismatch: expected ${digest}, got ${returnedDigest}`);
591
591
  }
592
- return { digest, size: buffer.byteLength };
592
+ // Handle annotations - automatically add ORAS-compatible title from filename
593
+ const annotations = opts.annotations && opts.annotations['vnd.obsidianmd.layer.filename']
594
+ ? {
595
+ ...opts.annotations,
596
+ 'org.opencontainers.image.title': opts.annotations['vnd.obsidianmd.layer.filename']
597
+ }
598
+ : opts.annotations ? { ...opts.annotations } : undefined;
599
+ return { digest, size: buffer.byteLength, annotations };
593
600
  }
594
601
  /**
595
602
  * Upload an image manifest.
@@ -628,6 +635,48 @@ export class OciRegistryClient {
628
635
  }
629
636
  return { digest, size: manifestBuffer.byteLength };
630
637
  }
638
+ /**
639
+ * Push a manifest with multiple tags atomically.
640
+ * Pushes the manifest once with the first tag, then tags the remaining tags
641
+ * by pushing the same manifest content.
642
+ *
643
+ * @param opts.tags Array of tags to apply (must not be empty)
644
+ * @param opts.manifest The manifest object to upload
645
+ * @param opts.annotations Optional annotations to merge with manifest annotations
646
+ * @returns Object with digest, tags array, and size
647
+ */
648
+ async pushManifestWithTags(opts) {
649
+ if (opts.tags.length === 0) {
650
+ throw new Error('tags array cannot be empty');
651
+ }
652
+ // Merge annotations: manifest.annotations + opts.annotations
653
+ const mergedManifest = {
654
+ ...opts.manifest,
655
+ annotations: {
656
+ ...(opts.manifest.annotations || {}),
657
+ ...(opts.annotations || {}),
658
+ },
659
+ };
660
+ // Push manifest with first tag
661
+ const result = await this.pushManifest({
662
+ ref: opts.tags[0],
663
+ manifest: mergedManifest,
664
+ mediaType: opts.manifest.mediaType || MEDIATYPE_OCI_MANIFEST_V1,
665
+ });
666
+ // Tag remaining tags by pushing the same manifest
667
+ for (let i = 1; i < opts.tags.length; i++) {
668
+ await this.pushManifest({
669
+ ref: opts.tags[i],
670
+ manifest: mergedManifest,
671
+ mediaType: opts.manifest.mediaType || MEDIATYPE_OCI_MANIFEST_V1,
672
+ });
673
+ }
674
+ return {
675
+ digest: result.digest,
676
+ tags: opts.tags,
677
+ size: result.size,
678
+ };
679
+ }
631
680
  /**
632
681
  * Push a plugin manifest as a config blob and create an OCI manifest.
633
682
  * This follows the OCI spec where the Obsidian manifest is stored as the config.
package/dist/index.d.ts CHANGED
@@ -12,4 +12,8 @@ export * from "./errors/RegistryErrors.js";
12
12
  export * from "./ghcr/GhcrConstants.js";
13
13
  export type { FetchAdapter } from "./client/FetchAdapter.js";
14
14
  export type { RegistryClientOptions } from "./client/RegistryClientOptions.js";
15
+ export * from "./schemas/index.js";
16
+ export * from "./oci/index.js";
17
+ export * from "./marketplace/index.js";
18
+ export * from "./adapters/index.js";
15
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG/E,cAAc,oBAAoB,CAAC;AAGnC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,wBAAwB,CAAC;AAGvC,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -11,3 +11,11 @@ export * from "./utils/ValidationUtils.js";
11
11
  export * from "./utils/DigestUtils.js";
12
12
  export * from "./errors/RegistryErrors.js";
13
13
  export * from "./ghcr/GhcrConstants.js";
14
+ // Schema exports
15
+ export * from "./schemas/index.js";
16
+ // OCI exports
17
+ export * from "./oci/index.js";
18
+ // Marketplace exports
19
+ export * from "./marketplace/index.js";
20
+ // Adapter exports
21
+ export * from "./adapters/index.js";
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["// Re-export everything from new structure\nexport * from \"./client/OciRegistryClient.js\";\nexport * from \"./types/ManifestTypes.js\";\nexport * from \"./types/RegistryTypes.js\";\nexport * from \"./types/AuthTypes.js\";\nexport * from \"./types/RequestTypes.js\";\nexport * from \"./parsing/RepoParser.js\";\nexport * from \"./parsing/IndexParser.js\";\nexport * from \"./parsing/LinkHeaderParser.js\";\nexport * from \"./utils/ValidationUtils.js\";\nexport * from \"./utils/DigestUtils.js\";\nexport * from \"./errors/RegistryErrors.js\";\nexport * from \"./ghcr/GhcrConstants.js\";\nexport type { FetchAdapter } from \"./client/FetchAdapter.js\";\nexport type { RegistryClientOptions } from \"./client/RegistryClientOptions.js\";\n"],
5
- "mappings": "AACA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
4
+ "sourcesContent": ["// Re-export everything from new structure\nexport * from \"./client/OciRegistryClient.js\";\nexport * from \"./types/ManifestTypes.js\";\nexport * from \"./types/RegistryTypes.js\";\nexport * from \"./types/AuthTypes.js\";\nexport * from \"./types/RequestTypes.js\";\nexport * from \"./parsing/RepoParser.js\";\nexport * from \"./parsing/IndexParser.js\";\nexport * from \"./parsing/LinkHeaderParser.js\";\nexport * from \"./utils/ValidationUtils.js\";\nexport * from \"./utils/DigestUtils.js\";\nexport * from \"./errors/RegistryErrors.js\";\nexport * from \"./ghcr/GhcrConstants.js\";\nexport type { FetchAdapter } from \"./client/FetchAdapter.js\";\nexport type { RegistryClientOptions } from \"./client/RegistryClientOptions.js\";\n\n// Schema exports\nexport * from \"./schemas/index.js\";\n\n// OCI exports\nexport * from \"./oci/index.js\";\n\n// Marketplace exports\nexport * from \"./marketplace/index.js\";\n\n// Adapter exports\nexport * from \"./adapters/index.js\";\n"],
5
+ "mappings": "AACA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAKd,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,48 @@
1
+ import type { FetchAdapter } from "../client/FetchAdapter.js";
2
+ import type { MarketplacePlugin } from "../schemas/marketplace.js";
3
+ export declare const DEFAULT_MARKETPLACE_URL = "https://shard-for-obsidian.github.io/shard/plugins.json";
4
+ export interface MarketplaceClientOptions {
5
+ marketplaceUrl?: string;
6
+ adapter: FetchAdapter;
7
+ cache?: {
8
+ enabled: boolean;
9
+ ttl: number;
10
+ };
11
+ }
12
+ /**
13
+ * Client for fetching marketplace data from the registry.
14
+ * Supports optional caching with configurable TTL.
15
+ */
16
+ export declare class MarketplaceClient {
17
+ private marketplaceUrl;
18
+ private adapter;
19
+ private cache?;
20
+ private cacheTTL?;
21
+ constructor(options: MarketplaceClientOptions);
22
+ /**
23
+ * Fetch all plugins from the marketplace.
24
+ * Uses cached data if available and not expired.
25
+ */
26
+ fetchPlugins(): Promise<MarketplacePlugin[]>;
27
+ /**
28
+ * Find a plugin by ID.
29
+ */
30
+ findPluginById(pluginId: string): Promise<MarketplacePlugin | null>;
31
+ /**
32
+ * Search plugins by keyword (searches in name, description, author, tags).
33
+ */
34
+ searchPlugins(keyword: string): Promise<MarketplacePlugin[]>;
35
+ /**
36
+ * Clear the cache and force a fresh fetch on next call.
37
+ */
38
+ clearCache(): void;
39
+ /**
40
+ * Update the marketplace URL.
41
+ */
42
+ setMarketplaceUrl(url: string): void;
43
+ /**
44
+ * Update the cache TTL.
45
+ */
46
+ setCacheTTL(ttl: number): void;
47
+ }
48
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/marketplace/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,2BAA2B,CAAC;AAEnC,eAAO,MAAM,uBAAuB,4DACuB,CAAC;AAE5D,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CACH;AAOD;;;GAGG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,KAAK,CAAC,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,CAAS;gBAEd,OAAO,EAAE,wBAAwB;IAU7C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAuDlD;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAKzE;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAclE;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKpC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAG/B"}
@@ -0,0 +1,104 @@
1
+ export const DEFAULT_MARKETPLACE_URL = "https://shard-for-obsidian.github.io/shard/plugins.json";
2
+ /**
3
+ * Client for fetching marketplace data from the registry.
4
+ * Supports optional caching with configurable TTL.
5
+ */
6
+ export class MarketplaceClient {
7
+ marketplaceUrl;
8
+ adapter;
9
+ cache;
10
+ cacheTTL;
11
+ constructor(options) {
12
+ this.marketplaceUrl = options.marketplaceUrl || DEFAULT_MARKETPLACE_URL;
13
+ this.adapter = options.adapter;
14
+ if (options.cache?.enabled) {
15
+ this.cache = new Map();
16
+ this.cacheTTL = options.cache.ttl;
17
+ }
18
+ }
19
+ /**
20
+ * Fetch all plugins from the marketplace.
21
+ * Uses cached data if available and not expired.
22
+ */
23
+ async fetchPlugins() {
24
+ // Check cache if enabled
25
+ if (this.cache && this.cacheTTL) {
26
+ const cached = this.cache.get(this.marketplaceUrl);
27
+ if (cached) {
28
+ const age = Date.now() - cached.fetchedAt;
29
+ if (age < this.cacheTTL) {
30
+ return cached.plugins;
31
+ }
32
+ }
33
+ }
34
+ // Fetch fresh data
35
+ try {
36
+ const response = await this.adapter.fetch(this.marketplaceUrl);
37
+ if (!response.ok) {
38
+ throw new Error(`Failed to fetch marketplace data: ${response.status} ${response.statusText}`);
39
+ }
40
+ const data = (await response.json());
41
+ if (!data.plugins || !Array.isArray(data.plugins)) {
42
+ throw new Error("Invalid marketplace data format");
43
+ }
44
+ // Update cache if enabled
45
+ if (this.cache) {
46
+ this.cache.set(this.marketplaceUrl, {
47
+ plugins: data.plugins,
48
+ fetchedAt: Date.now(),
49
+ });
50
+ }
51
+ return data.plugins;
52
+ }
53
+ catch (error) {
54
+ // If fetch fails but we have stale cache, use it
55
+ if (this.cache) {
56
+ const cached = this.cache.get(this.marketplaceUrl);
57
+ if (cached) {
58
+ console.warn("[MarketplaceClient] Using stale cache due to fetch error:", error);
59
+ return cached.plugins;
60
+ }
61
+ }
62
+ // Otherwise, rethrow the error
63
+ throw error;
64
+ }
65
+ }
66
+ /**
67
+ * Find a plugin by ID.
68
+ */
69
+ async findPluginById(pluginId) {
70
+ const plugins = await this.fetchPlugins();
71
+ return plugins.find((p) => p.id === pluginId) || null;
72
+ }
73
+ /**
74
+ * Search plugins by keyword (searches in name, description, author, tags).
75
+ */
76
+ async searchPlugins(keyword) {
77
+ const plugins = await this.fetchPlugins();
78
+ const lowerKeyword = keyword.toLowerCase();
79
+ return plugins.filter((p) => p.name.toLowerCase().includes(lowerKeyword) ||
80
+ p.description.toLowerCase().includes(lowerKeyword) ||
81
+ p.author.toLowerCase().includes(lowerKeyword) ||
82
+ p.id.toLowerCase().includes(lowerKeyword) ||
83
+ p.tags?.some((tag) => tag.toLowerCase().includes(lowerKeyword)));
84
+ }
85
+ /**
86
+ * Clear the cache and force a fresh fetch on next call.
87
+ */
88
+ clearCache() {
89
+ this.cache?.clear();
90
+ }
91
+ /**
92
+ * Update the marketplace URL.
93
+ */
94
+ setMarketplaceUrl(url) {
95
+ this.marketplaceUrl = url;
96
+ this.clearCache();
97
+ }
98
+ /**
99
+ * Update the cache TTL.
100
+ */
101
+ setCacheTTL(ttl) {
102
+ this.cacheTTL = ttl;
103
+ }
104
+ }
@@ -0,0 +1,2 @@
1
+ export { MarketplaceClient, DEFAULT_MARKETPLACE_URL, type MarketplaceClientOptions, } from "./client.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/marketplace/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { MarketplaceClient, DEFAULT_MARKETPLACE_URL, } from "./client.js";
@@ -0,0 +1,2 @@
1
+ export { queryOciTags, queryTagMetadata, type QueryOciTagsOptions, type QueryTagMetadataOptions, type TagMetadata, } from "./tags.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oci/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,GACjB,MAAM,WAAW,CAAC"}
@@ -0,0 +1 @@
1
+ export { queryOciTags, queryTagMetadata, } from "./tags.js";
@@ -0,0 +1,26 @@
1
+ import type { FetchAdapter } from "../client/FetchAdapter.js";
2
+ export interface QueryOciTagsOptions {
3
+ registryUrl: string;
4
+ adapter: FetchAdapter;
5
+ token?: string;
6
+ }
7
+ export interface QueryTagMetadataOptions {
8
+ registryUrl: string;
9
+ tag: string;
10
+ adapter: FetchAdapter;
11
+ token?: string;
12
+ }
13
+ export interface TagMetadata {
14
+ publishedAt: string;
15
+ size: number;
16
+ annotations: Record<string, string>;
17
+ }
18
+ /**
19
+ * Query all available tags from an OCI registry.
20
+ */
21
+ export declare function queryOciTags(opts: QueryOciTagsOptions): Promise<string[]>;
22
+ /**
23
+ * Query metadata for a specific tag.
24
+ */
25
+ export declare function queryTagMetadata(opts: QueryTagMetadataOptions): Promise<TagMetadata>;
26
+ //# sourceMappingURL=tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../../src/oci/tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAyED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsCnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,WAAW,CAAC,CAqDtB"}