kustodian 1.0.0

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 (351) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +346 -0
  3. package/dist/cli/bin.d.ts +3 -0
  4. package/dist/cli/bin.d.ts.map +1 -0
  5. package/dist/cli/bin.js +67 -0
  6. package/dist/cli/bin.js.map +1 -0
  7. package/dist/cli/command.d.ts +57 -0
  8. package/dist/cli/command.d.ts.map +1 -0
  9. package/dist/cli/command.js +26 -0
  10. package/dist/cli/command.js.map +1 -0
  11. package/dist/cli/commands/apply.d.ts +8 -0
  12. package/dist/cli/commands/apply.d.ts.map +1 -0
  13. package/dist/cli/commands/apply.js +802 -0
  14. package/dist/cli/commands/apply.js.map +1 -0
  15. package/dist/cli/commands/init.d.ts +5 -0
  16. package/dist/cli/commands/init.d.ts.map +1 -0
  17. package/dist/cli/commands/init.js +403 -0
  18. package/dist/cli/commands/init.js.map +1 -0
  19. package/dist/cli/commands/sources.d.ts +5 -0
  20. package/dist/cli/commands/sources.d.ts.map +1 -0
  21. package/dist/cli/commands/sources.js +377 -0
  22. package/dist/cli/commands/sources.js.map +1 -0
  23. package/dist/cli/commands/update.d.ts +5 -0
  24. package/dist/cli/commands/update.d.ts.map +1 -0
  25. package/dist/cli/commands/update.js +314 -0
  26. package/dist/cli/commands/update.js.map +1 -0
  27. package/dist/cli/commands/validate.d.ts +5 -0
  28. package/dist/cli/commands/validate.d.ts.map +1 -0
  29. package/dist/cli/commands/validate.js +126 -0
  30. package/dist/cli/commands/validate.js.map +1 -0
  31. package/dist/cli/container.d.ts +48 -0
  32. package/dist/cli/container.d.ts.map +1 -0
  33. package/dist/cli/container.js +49 -0
  34. package/dist/cli/container.js.map +1 -0
  35. package/dist/cli/index.d.ts +8 -0
  36. package/dist/cli/index.d.ts.map +1 -0
  37. package/dist/cli/index.js +9 -0
  38. package/dist/cli/index.js.map +1 -0
  39. package/dist/cli/middleware.d.ts +118 -0
  40. package/dist/cli/middleware.d.ts.map +1 -0
  41. package/dist/cli/middleware.js +280 -0
  42. package/dist/cli/middleware.js.map +1 -0
  43. package/dist/cli/runner.d.ts +34 -0
  44. package/dist/cli/runner.d.ts.map +1 -0
  45. package/dist/cli/runner.js +156 -0
  46. package/dist/cli/runner.js.map +1 -0
  47. package/dist/cli/utils/defaults.d.ts +23 -0
  48. package/dist/cli/utils/defaults.d.ts.map +1 -0
  49. package/dist/cli/utils/defaults.js +43 -0
  50. package/dist/cli/utils/defaults.js.map +1 -0
  51. package/dist/core/error.d.ts +117 -0
  52. package/dist/core/error.d.ts.map +1 -0
  53. package/dist/core/error.js +210 -0
  54. package/dist/core/error.js.map +1 -0
  55. package/dist/core/index.d.ts +6 -0
  56. package/dist/core/index.d.ts.map +1 -0
  57. package/dist/core/index.js +6 -0
  58. package/dist/core/index.js.map +1 -0
  59. package/dist/core/logger.d.ts +31 -0
  60. package/dist/core/logger.d.ts.map +1 -0
  61. package/dist/core/logger.js +78 -0
  62. package/dist/core/logger.js.map +1 -0
  63. package/dist/core/path.d.ts +57 -0
  64. package/dist/core/path.d.ts.map +1 -0
  65. package/dist/core/path.js +154 -0
  66. package/dist/core/path.js.map +1 -0
  67. package/dist/core/result.d.ts +80 -0
  68. package/dist/core/result.d.ts.map +1 -0
  69. package/dist/core/result.js +150 -0
  70. package/dist/core/result.js.map +1 -0
  71. package/dist/core/types.d.ts +80 -0
  72. package/dist/core/types.d.ts.map +1 -0
  73. package/dist/core/types.js +5 -0
  74. package/dist/core/types.js.map +1 -0
  75. package/dist/generator/external-substitutions.d.ts +21 -0
  76. package/dist/generator/external-substitutions.d.ts.map +1 -0
  77. package/dist/generator/external-substitutions.js +49 -0
  78. package/dist/generator/external-substitutions.js.map +1 -0
  79. package/dist/generator/flux.d.ts +61 -0
  80. package/dist/generator/flux.d.ts.map +1 -0
  81. package/dist/generator/flux.js +294 -0
  82. package/dist/generator/flux.js.map +1 -0
  83. package/dist/generator/generator.d.ts +77 -0
  84. package/dist/generator/generator.d.ts.map +1 -0
  85. package/dist/generator/generator.js +183 -0
  86. package/dist/generator/generator.js.map +1 -0
  87. package/dist/generator/index.d.ts +9 -0
  88. package/dist/generator/index.d.ts.map +1 -0
  89. package/dist/generator/index.js +9 -0
  90. package/dist/generator/index.js.map +1 -0
  91. package/dist/generator/kustomization-resolution.d.ts +40 -0
  92. package/dist/generator/kustomization-resolution.d.ts.map +1 -0
  93. package/dist/generator/kustomization-resolution.js +59 -0
  94. package/dist/generator/kustomization-resolution.js.map +1 -0
  95. package/dist/generator/namespace.d.ts +74 -0
  96. package/dist/generator/namespace.d.ts.map +1 -0
  97. package/dist/generator/namespace.js +109 -0
  98. package/dist/generator/namespace.js.map +1 -0
  99. package/dist/generator/output.d.ts +56 -0
  100. package/dist/generator/output.d.ts.map +1 -0
  101. package/dist/generator/output.js +171 -0
  102. package/dist/generator/output.js.map +1 -0
  103. package/dist/generator/preservation.d.ts +45 -0
  104. package/dist/generator/preservation.d.ts.map +1 -0
  105. package/dist/generator/preservation.js +71 -0
  106. package/dist/generator/preservation.js.map +1 -0
  107. package/dist/generator/substitution.d.ts +79 -0
  108. package/dist/generator/substitution.d.ts.map +1 -0
  109. package/dist/generator/substitution.js +210 -0
  110. package/dist/generator/substitution.js.map +1 -0
  111. package/dist/generator/types.d.ts +162 -0
  112. package/dist/generator/types.d.ts.map +1 -0
  113. package/dist/generator/types.js +2 -0
  114. package/dist/generator/types.js.map +1 -0
  115. package/dist/generator/validation/cycle-detection.d.ts +25 -0
  116. package/dist/generator/validation/cycle-detection.d.ts.map +1 -0
  117. package/dist/generator/validation/cycle-detection.js +101 -0
  118. package/dist/generator/validation/cycle-detection.js.map +1 -0
  119. package/dist/generator/validation/enablement.d.ts +24 -0
  120. package/dist/generator/validation/enablement.d.ts.map +1 -0
  121. package/dist/generator/validation/enablement.js +69 -0
  122. package/dist/generator/validation/enablement.js.map +1 -0
  123. package/dist/generator/validation/graph.d.ts +29 -0
  124. package/dist/generator/validation/graph.d.ts.map +1 -0
  125. package/dist/generator/validation/graph.js +106 -0
  126. package/dist/generator/validation/graph.js.map +1 -0
  127. package/dist/generator/validation/index.d.ts +38 -0
  128. package/dist/generator/validation/index.d.ts.map +1 -0
  129. package/dist/generator/validation/index.js +64 -0
  130. package/dist/generator/validation/index.js.map +1 -0
  131. package/dist/generator/validation/reference.d.ts +45 -0
  132. package/dist/generator/validation/reference.d.ts.map +1 -0
  133. package/dist/generator/validation/reference.js +143 -0
  134. package/dist/generator/validation/reference.js.map +1 -0
  135. package/dist/generator/validation/requirements.d.ts +25 -0
  136. package/dist/generator/validation/requirements.d.ts.map +1 -0
  137. package/dist/generator/validation/requirements.js +64 -0
  138. package/dist/generator/validation/requirements.js.map +1 -0
  139. package/dist/generator/validation/types.d.ts +116 -0
  140. package/dist/generator/validation/types.d.ts.map +1 -0
  141. package/dist/generator/validation/types.js +13 -0
  142. package/dist/generator/validation/types.js.map +1 -0
  143. package/dist/k8s/exec.d.ts +20 -0
  144. package/dist/k8s/exec.d.ts.map +1 -0
  145. package/dist/k8s/exec.js +47 -0
  146. package/dist/k8s/exec.js.map +1 -0
  147. package/dist/k8s/flux.d.ts +57 -0
  148. package/dist/k8s/flux.d.ts.map +1 -0
  149. package/dist/k8s/flux.js +202 -0
  150. package/dist/k8s/flux.js.map +1 -0
  151. package/dist/k8s/index.d.ts +6 -0
  152. package/dist/k8s/index.d.ts.map +1 -0
  153. package/dist/k8s/index.js +6 -0
  154. package/dist/k8s/index.js.map +1 -0
  155. package/dist/k8s/kubeconfig.d.ts +45 -0
  156. package/dist/k8s/kubeconfig.d.ts.map +1 -0
  157. package/dist/k8s/kubeconfig.js +152 -0
  158. package/dist/k8s/kubeconfig.js.map +1 -0
  159. package/dist/k8s/kubectl.d.ts +68 -0
  160. package/dist/k8s/kubectl.d.ts.map +1 -0
  161. package/dist/k8s/kubectl.js +187 -0
  162. package/dist/k8s/kubectl.js.map +1 -0
  163. package/dist/k8s/types.d.ts +65 -0
  164. package/dist/k8s/types.d.ts.map +1 -0
  165. package/dist/k8s/types.js +2 -0
  166. package/dist/k8s/types.js.map +1 -0
  167. package/dist/loader/file.d.ts +39 -0
  168. package/dist/loader/file.d.ts.map +1 -0
  169. package/dist/loader/file.js +121 -0
  170. package/dist/loader/file.js.map +1 -0
  171. package/dist/loader/index.d.ts +5 -0
  172. package/dist/loader/index.d.ts.map +1 -0
  173. package/dist/loader/index.js +5 -0
  174. package/dist/loader/index.js.map +1 -0
  175. package/dist/loader/profile.d.ts +23 -0
  176. package/dist/loader/profile.d.ts.map +1 -0
  177. package/dist/loader/profile.js +84 -0
  178. package/dist/loader/profile.js.map +1 -0
  179. package/dist/loader/project.d.ts +76 -0
  180. package/dist/loader/project.d.ts.map +1 -0
  181. package/dist/loader/project.js +279 -0
  182. package/dist/loader/project.js.map +1 -0
  183. package/dist/loader/yaml.d.ts +15 -0
  184. package/dist/loader/yaml.d.ts.map +1 -0
  185. package/dist/loader/yaml.js +44 -0
  186. package/dist/loader/yaml.js.map +1 -0
  187. package/dist/nodes/index.d.ts +5 -0
  188. package/dist/nodes/index.d.ts.map +1 -0
  189. package/dist/nodes/index.js +5 -0
  190. package/dist/nodes/index.js.map +1 -0
  191. package/dist/nodes/kubectl-labeler.d.ts +7 -0
  192. package/dist/nodes/kubectl-labeler.d.ts.map +1 -0
  193. package/dist/nodes/kubectl-labeler.js +89 -0
  194. package/dist/nodes/kubectl-labeler.js.map +1 -0
  195. package/dist/nodes/labeler.d.ts +74 -0
  196. package/dist/nodes/labeler.d.ts.map +1 -0
  197. package/dist/nodes/labeler.js +118 -0
  198. package/dist/nodes/labeler.js.map +1 -0
  199. package/dist/nodes/profile.d.ts +58 -0
  200. package/dist/nodes/profile.d.ts.map +1 -0
  201. package/dist/nodes/profile.js +128 -0
  202. package/dist/nodes/profile.js.map +1 -0
  203. package/dist/nodes/types.d.ts +84 -0
  204. package/dist/nodes/types.d.ts.map +1 -0
  205. package/dist/nodes/types.js +77 -0
  206. package/dist/nodes/types.js.map +1 -0
  207. package/dist/plugins/generators.d.ts +49 -0
  208. package/dist/plugins/generators.d.ts.map +1 -0
  209. package/dist/plugins/generators.js +7 -0
  210. package/dist/plugins/generators.js.map +1 -0
  211. package/dist/plugins/hooks.d.ts +120 -0
  212. package/dist/plugins/hooks.d.ts.map +1 -0
  213. package/dist/plugins/hooks.js +41 -0
  214. package/dist/plugins/hooks.js.map +1 -0
  215. package/dist/plugins/index.d.ts +8 -0
  216. package/dist/plugins/index.d.ts.map +1 -0
  217. package/dist/plugins/index.js +15 -0
  218. package/dist/plugins/index.js.map +1 -0
  219. package/dist/plugins/loader.d.ts +40 -0
  220. package/dist/plugins/loader.d.ts.map +1 -0
  221. package/dist/plugins/loader.js +236 -0
  222. package/dist/plugins/loader.js.map +1 -0
  223. package/dist/plugins/object-types.d.ts +71 -0
  224. package/dist/plugins/object-types.d.ts.map +1 -0
  225. package/dist/plugins/object-types.js +65 -0
  226. package/dist/plugins/object-types.js.map +1 -0
  227. package/dist/plugins/registry.d.ts +87 -0
  228. package/dist/plugins/registry.d.ts.map +1 -0
  229. package/dist/plugins/registry.js +158 -0
  230. package/dist/plugins/registry.js.map +1 -0
  231. package/dist/plugins/substitution-providers.d.ts +48 -0
  232. package/dist/plugins/substitution-providers.d.ts.map +1 -0
  233. package/dist/plugins/substitution-providers.js +2 -0
  234. package/dist/plugins/substitution-providers.js.map +1 -0
  235. package/dist/plugins/types.d.ts +288 -0
  236. package/dist/plugins/types.d.ts.map +1 -0
  237. package/dist/plugins/types.js +25 -0
  238. package/dist/plugins/types.js.map +1 -0
  239. package/dist/registry/auth.d.ts +14 -0
  240. package/dist/registry/auth.d.ts.map +1 -0
  241. package/dist/registry/auth.js +40 -0
  242. package/dist/registry/auth.js.map +1 -0
  243. package/dist/registry/client.d.ts +24 -0
  244. package/dist/registry/client.d.ts.map +1 -0
  245. package/dist/registry/client.js +85 -0
  246. package/dist/registry/client.js.map +1 -0
  247. package/dist/registry/dockerhub.d.ts +6 -0
  248. package/dist/registry/dockerhub.d.ts.map +1 -0
  249. package/dist/registry/dockerhub.js +91 -0
  250. package/dist/registry/dockerhub.js.map +1 -0
  251. package/dist/registry/ghcr.d.ts +6 -0
  252. package/dist/registry/ghcr.d.ts.map +1 -0
  253. package/dist/registry/ghcr.js +95 -0
  254. package/dist/registry/ghcr.js.map +1 -0
  255. package/dist/registry/helm.d.ts +11 -0
  256. package/dist/registry/helm.d.ts.map +1 -0
  257. package/dist/registry/helm.js +124 -0
  258. package/dist/registry/helm.js.map +1 -0
  259. package/dist/registry/index.d.ts +8 -0
  260. package/dist/registry/index.d.ts.map +1 -0
  261. package/dist/registry/index.js +12 -0
  262. package/dist/registry/index.js.map +1 -0
  263. package/dist/registry/types.d.ts +55 -0
  264. package/dist/registry/types.d.ts.map +1 -0
  265. package/dist/registry/types.js +2 -0
  266. package/dist/registry/types.js.map +1 -0
  267. package/dist/registry/version.d.ts +22 -0
  268. package/dist/registry/version.d.ts.map +1 -0
  269. package/dist/registry/version.js +62 -0
  270. package/dist/registry/version.js.map +1 -0
  271. package/dist/schema/cluster.d.ts +2890 -0
  272. package/dist/schema/cluster.d.ts.map +1 -0
  273. package/dist/schema/cluster.js +231 -0
  274. package/dist/schema/cluster.js.map +1 -0
  275. package/dist/schema/common.d.ts +1059 -0
  276. package/dist/schema/common.d.ts.map +1 -0
  277. package/dist/schema/common.js +340 -0
  278. package/dist/schema/common.js.map +1 -0
  279. package/dist/schema/index.d.ts +8 -0
  280. package/dist/schema/index.d.ts.map +1 -0
  281. package/dist/schema/index.js +8 -0
  282. package/dist/schema/index.js.map +1 -0
  283. package/dist/schema/node-list.d.ts +361 -0
  284. package/dist/schema/node-list.d.ts.map +1 -0
  285. package/dist/schema/node-list.js +104 -0
  286. package/dist/schema/node-list.js.map +1 -0
  287. package/dist/schema/profile.d.ts +166 -0
  288. package/dist/schema/profile.d.ts.map +1 -0
  289. package/dist/schema/profile.js +61 -0
  290. package/dist/schema/profile.js.map +1 -0
  291. package/dist/schema/project.d.ts +168 -0
  292. package/dist/schema/project.d.ts.map +1 -0
  293. package/dist/schema/project.js +40 -0
  294. package/dist/schema/project.js.map +1 -0
  295. package/dist/schema/sources.d.ts +338 -0
  296. package/dist/schema/sources.d.ts.map +1 -0
  297. package/dist/schema/sources.js +111 -0
  298. package/dist/schema/sources.js.map +1 -0
  299. package/dist/schema/template.d.ts +2711 -0
  300. package/dist/schema/template.d.ts.map +1 -0
  301. package/dist/schema/template.js +97 -0
  302. package/dist/schema/template.js.map +1 -0
  303. package/dist/sources/cache/index.d.ts +9 -0
  304. package/dist/sources/cache/index.d.ts.map +1 -0
  305. package/dist/sources/cache/index.js +278 -0
  306. package/dist/sources/cache/index.js.map +1 -0
  307. package/dist/sources/cache/metadata.d.ts +36 -0
  308. package/dist/sources/cache/metadata.d.ts.map +1 -0
  309. package/dist/sources/cache/metadata.js +21 -0
  310. package/dist/sources/cache/metadata.js.map +1 -0
  311. package/dist/sources/cache/ttl.d.ts +20 -0
  312. package/dist/sources/cache/ttl.d.ts.map +1 -0
  313. package/dist/sources/cache/ttl.js +53 -0
  314. package/dist/sources/cache/ttl.js.map +1 -0
  315. package/dist/sources/fetchers/git.d.ts +6 -0
  316. package/dist/sources/fetchers/git.d.ts.map +1 -0
  317. package/dist/sources/fetchers/git.js +165 -0
  318. package/dist/sources/fetchers/git.js.map +1 -0
  319. package/dist/sources/fetchers/http.d.ts +6 -0
  320. package/dist/sources/fetchers/http.d.ts.map +1 -0
  321. package/dist/sources/fetchers/http.js +159 -0
  322. package/dist/sources/fetchers/http.js.map +1 -0
  323. package/dist/sources/fetchers/index.d.ts +11 -0
  324. package/dist/sources/fetchers/index.d.ts.map +1 -0
  325. package/dist/sources/fetchers/index.js +24 -0
  326. package/dist/sources/fetchers/index.js.map +1 -0
  327. package/dist/sources/fetchers/oci.d.ts +6 -0
  328. package/dist/sources/fetchers/oci.d.ts.map +1 -0
  329. package/dist/sources/fetchers/oci.js +156 -0
  330. package/dist/sources/fetchers/oci.js.map +1 -0
  331. package/dist/sources/fetchers/types.d.ts +25 -0
  332. package/dist/sources/fetchers/types.d.ts.map +1 -0
  333. package/dist/sources/fetchers/types.js +2 -0
  334. package/dist/sources/fetchers/types.js.map +1 -0
  335. package/dist/sources/index.d.ts +6 -0
  336. package/dist/sources/index.d.ts.map +1 -0
  337. package/dist/sources/index.js +10 -0
  338. package/dist/sources/index.js.map +1 -0
  339. package/dist/sources/loader.d.ts +34 -0
  340. package/dist/sources/loader.d.ts.map +1 -0
  341. package/dist/sources/loader.js +89 -0
  342. package/dist/sources/loader.js.map +1 -0
  343. package/dist/sources/resolver.d.ts +17 -0
  344. package/dist/sources/resolver.d.ts.map +1 -0
  345. package/dist/sources/resolver.js +125 -0
  346. package/dist/sources/resolver.js.map +1 -0
  347. package/dist/sources/types.d.ts +151 -0
  348. package/dist/sources/types.d.ts.map +1 -0
  349. package/dist/sources/types.js +2 -0
  350. package/dist/sources/types.js.map +1 -0
  351. package/package.json +101 -0
@@ -0,0 +1,165 @@
1
+ import { exec } from 'node:child_process';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as os from 'node:os';
4
+ import * as path from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { Errors, failure, success, } from '../../core/index.js';
7
+ import { is_git_source } from '../../schema/index.js';
8
+ const exec_async = promisify(exec);
9
+ const DEFAULT_TIMEOUT = 120_000; // 2 minutes
10
+ /**
11
+ * Creates a Git source fetcher.
12
+ */
13
+ export function create_git_fetcher() {
14
+ return new GitFetcher();
15
+ }
16
+ class GitFetcher {
17
+ type = 'git';
18
+ is_mutable(source) {
19
+ if (!is_git_source(source))
20
+ return true;
21
+ // Branches are mutable, tags and commits are immutable
22
+ return source.git.ref.branch !== undefined;
23
+ }
24
+ async fetch(source, options) {
25
+ if (!is_git_source(source)) {
26
+ return failure(Errors.invalid_argument('source', 'Expected a git source'));
27
+ }
28
+ const { url, ref, path: subpath } = source.git;
29
+ const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
30
+ // Determine the ref to fetch
31
+ const git_ref = ref.branch ?? ref.tag ?? ref.commit;
32
+ if (!git_ref) {
33
+ return failure(Errors.invalid_argument('source', 'No git ref specified'));
34
+ }
35
+ // Create temp directory for clone
36
+ const temp_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-git-'));
37
+ try {
38
+ // Clone with depth=1 for efficiency (shallow clone)
39
+ // For commits, we need a full clone to checkout specific commits
40
+ const is_commit = ref.commit !== undefined;
41
+ const depth_flag = is_commit ? '' : '--depth=1';
42
+ const branch_flag = ref.branch || ref.tag ? `--branch=${git_ref}` : '';
43
+ const clone_cmd = `git clone ${depth_flag} ${branch_flag} --single-branch "${url}" "${temp_dir}"`.trim();
44
+ await this.exec_git(clone_cmd, timeout, source.name);
45
+ // If fetching a specific commit, checkout that commit
46
+ if (is_commit) {
47
+ await this.exec_git(`git -C "${temp_dir}" checkout ${git_ref}`, timeout, source.name);
48
+ }
49
+ // Get the actual commit SHA for versioning
50
+ const version = await this.get_commit_sha(temp_dir, timeout, source.name);
51
+ if (!version.success) {
52
+ return failure(version.error);
53
+ }
54
+ // Determine final content path
55
+ let content_path = temp_dir;
56
+ if (subpath) {
57
+ content_path = path.join(temp_dir, subpath);
58
+ // Verify subpath exists
59
+ try {
60
+ await fs.access(content_path);
61
+ }
62
+ catch {
63
+ return failure(Errors.not_found('path', `${url}:${subpath}`));
64
+ }
65
+ }
66
+ // Create a clean output directory with just the templates
67
+ const output_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-templates-'));
68
+ // Copy content (excluding .git directory)
69
+ await this.copy_excluding_git(content_path, output_dir);
70
+ // Cleanup original clone
71
+ await fs.rm(temp_dir, { recursive: true, force: true });
72
+ return success({
73
+ path: output_dir,
74
+ version: version.value,
75
+ from_cache: false,
76
+ fetched_at: new Date(),
77
+ });
78
+ }
79
+ catch (error) {
80
+ // Cleanup on error
81
+ await fs.rm(temp_dir, { recursive: true, force: true }).catch(() => { });
82
+ if (error instanceof Error && error.message.includes('Authentication')) {
83
+ return failure(Errors.source_auth_error(source.name, error));
84
+ }
85
+ return failure(Errors.source_fetch_error(source.name, error));
86
+ }
87
+ }
88
+ async list_versions(source) {
89
+ if (!is_git_source(source)) {
90
+ return failure(Errors.invalid_argument('source', 'Expected a git source'));
91
+ }
92
+ const { url } = source.git;
93
+ try {
94
+ // Use ls-remote to list refs without cloning
95
+ const { stdout } = await exec_async(`git ls-remote --tags --heads "${url}"`, {
96
+ timeout: DEFAULT_TIMEOUT,
97
+ });
98
+ const versions = [];
99
+ for (const line of stdout.split('\n')) {
100
+ if (!line.trim())
101
+ continue;
102
+ const [sha, ref] = line.split('\t');
103
+ if (!sha || !ref)
104
+ continue;
105
+ // Parse ref name
106
+ let version;
107
+ if (ref.startsWith('refs/tags/')) {
108
+ version = ref.replace('refs/tags/', '').replace(/\^{}$/, '');
109
+ }
110
+ else if (ref.startsWith('refs/heads/')) {
111
+ version = ref.replace('refs/heads/', '');
112
+ }
113
+ else {
114
+ continue;
115
+ }
116
+ // Deduplicate (annotated tags appear twice)
117
+ if (!versions.some((v) => v.version === version)) {
118
+ versions.push({
119
+ version,
120
+ digest: sha,
121
+ });
122
+ }
123
+ }
124
+ return success(versions);
125
+ }
126
+ catch (error) {
127
+ return failure(Errors.source_fetch_error(source.name, error));
128
+ }
129
+ }
130
+ async exec_git(command, timeout, source_name) {
131
+ try {
132
+ const { stdout } = await exec_async(command, { timeout });
133
+ return success(stdout);
134
+ }
135
+ catch (error) {
136
+ if (error instanceof Error && 'killed' in error && error.killed) {
137
+ return failure(Errors.source_timeout(source_name, timeout));
138
+ }
139
+ throw error;
140
+ }
141
+ }
142
+ async get_commit_sha(repo_path, timeout, source_name) {
143
+ const result = await this.exec_git(`git -C "${repo_path}" rev-parse HEAD`, timeout, source_name);
144
+ if (!result.success)
145
+ return result;
146
+ return success(result.value.trim());
147
+ }
148
+ async copy_excluding_git(src, dest) {
149
+ const entries = await fs.readdir(src, { withFileTypes: true });
150
+ for (const entry of entries) {
151
+ if (entry.name === '.git')
152
+ continue;
153
+ const src_path = path.join(src, entry.name);
154
+ const dest_path = path.join(dest, entry.name);
155
+ if (entry.isDirectory()) {
156
+ await fs.mkdir(dest_path, { recursive: true });
157
+ await this.copy_excluding_git(src_path, dest_path);
158
+ }
159
+ else {
160
+ await fs.copyFile(src_path, dest_path);
161
+ }
162
+ }
163
+ }
164
+ }
165
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../src/sources/fetchers/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SourceFetcherType } from './types.js';
2
+ /**
3
+ * Creates an HTTP source fetcher.
4
+ */
5
+ export declare function create_http_fetcher(): SourceFetcherType;
6
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/http.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,iBAAiB,CAEvD"}
@@ -0,0 +1,159 @@
1
+ import { exec } from 'node:child_process';
2
+ import * as crypto from 'node:crypto';
3
+ import * as fs from 'node:fs/promises';
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ import { promisify } from 'node:util';
7
+ import { Errors, failure, success, } from '../../core/index.js';
8
+ import { is_http_source } from '../../schema/index.js';
9
+ const exec_async = promisify(exec);
10
+ const DEFAULT_TIMEOUT = 120_000; // 2 minutes
11
+ /**
12
+ * Creates an HTTP source fetcher.
13
+ */
14
+ export function create_http_fetcher() {
15
+ return new HttpFetcher();
16
+ }
17
+ class HttpFetcher {
18
+ type = 'http';
19
+ is_mutable(source) {
20
+ if (!is_http_source(source))
21
+ return true;
22
+ // HTTP sources with checksums are immutable (content is verified)
23
+ // Without checksum, we assume mutable
24
+ return source.http.checksum === undefined;
25
+ }
26
+ async fetch(source, options) {
27
+ if (!is_http_source(source)) {
28
+ return failure(Errors.invalid_argument('source', 'Expected an http source'));
29
+ }
30
+ const { url, checksum, headers } = source.http;
31
+ const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
32
+ // Create temp directory for download
33
+ const temp_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-http-'));
34
+ const archive_path = path.join(temp_dir, 'archive');
35
+ try {
36
+ // Download the archive
37
+ const controller = new AbortController();
38
+ const timeout_id = setTimeout(() => controller.abort(), timeout);
39
+ const fetch_options = {
40
+ signal: controller.signal,
41
+ };
42
+ if (headers) {
43
+ fetch_options.headers = headers;
44
+ }
45
+ const response = await fetch(url, fetch_options);
46
+ clearTimeout(timeout_id);
47
+ if (!response.ok) {
48
+ if (response.status === 401 || response.status === 403) {
49
+ return failure(Errors.source_auth_error(source.name));
50
+ }
51
+ return failure(Errors.source_fetch_error(source.name, new Error(`HTTP ${response.status}: ${response.statusText}`)));
52
+ }
53
+ // Write to file
54
+ const buffer = await response.arrayBuffer();
55
+ await fs.writeFile(archive_path, new Uint8Array(buffer));
56
+ // Verify checksum if provided
57
+ if (checksum) {
58
+ const verify_result = await this.verify_checksum(archive_path, checksum, source.name);
59
+ if (!verify_result.success) {
60
+ return verify_result;
61
+ }
62
+ }
63
+ // Compute checksum for version identifier
64
+ const actual_checksum = await this.compute_checksum(archive_path);
65
+ // Extract archive
66
+ const extract_dir = path.join(temp_dir, 'extracted');
67
+ await fs.mkdir(extract_dir, { recursive: true });
68
+ const extract_result = await this.extract_archive(archive_path, extract_dir, url, source.name);
69
+ if (!extract_result.success) {
70
+ return extract_result;
71
+ }
72
+ // Find the actual content directory (archives often have a root folder)
73
+ const content_dir = await this.find_content_dir(extract_dir);
74
+ // Create clean output directory
75
+ const output_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-templates-'));
76
+ await fs.cp(content_dir, output_dir, { recursive: true });
77
+ // Cleanup
78
+ await fs.rm(temp_dir, { recursive: true, force: true });
79
+ return success({
80
+ path: output_dir,
81
+ version: checksum ?? `sha256:${actual_checksum.slice(0, 16)}`,
82
+ from_cache: false,
83
+ fetched_at: new Date(),
84
+ });
85
+ }
86
+ catch (error) {
87
+ // Cleanup on error
88
+ await fs.rm(temp_dir, { recursive: true, force: true }).catch(() => { });
89
+ if (error instanceof Error && error.name === 'AbortError') {
90
+ return failure(Errors.source_timeout(source.name, timeout));
91
+ }
92
+ return failure(Errors.source_fetch_error(source.name, error));
93
+ }
94
+ }
95
+ async list_versions(_source) {
96
+ // HTTP sources don't have version listing capability
97
+ return success([]);
98
+ }
99
+ async verify_checksum(file_path, expected, source_name) {
100
+ // Parse expected checksum (format: algorithm:hash or just hash for sha256)
101
+ const [algorithm, hash] = expected.includes(':')
102
+ ? expected.split(':')
103
+ : ['sha256', expected];
104
+ const actual = await this.compute_checksum(file_path, algorithm);
105
+ if (actual.toLowerCase() !== hash.toLowerCase()) {
106
+ return failure(Errors.source_checksum_mismatch(source_name, expected, `${algorithm}:${actual}`));
107
+ }
108
+ return success(undefined);
109
+ }
110
+ async compute_checksum(file_path, algorithm = 'sha256') {
111
+ const content = await fs.readFile(file_path);
112
+ return crypto.createHash(algorithm).update(new Uint8Array(content)).digest('hex');
113
+ }
114
+ async extract_archive(archive_path, dest_dir, url, source_name) {
115
+ const lower_url = url.toLowerCase();
116
+ try {
117
+ if (lower_url.endsWith('.tar.gz') || lower_url.endsWith('.tgz')) {
118
+ await exec_async(`tar -xzf "${archive_path}" -C "${dest_dir}"`);
119
+ }
120
+ else if (lower_url.endsWith('.tar')) {
121
+ await exec_async(`tar -xf "${archive_path}" -C "${dest_dir}"`);
122
+ }
123
+ else if (lower_url.endsWith('.zip')) {
124
+ await exec_async(`unzip -q "${archive_path}" -d "${dest_dir}"`);
125
+ }
126
+ else {
127
+ // Try to detect format from content
128
+ const { stdout } = await exec_async(`file "${archive_path}"`);
129
+ if (stdout.includes('gzip')) {
130
+ await exec_async(`tar -xzf "${archive_path}" -C "${dest_dir}"`);
131
+ }
132
+ else if (stdout.includes('Zip')) {
133
+ await exec_async(`unzip -q "${archive_path}" -d "${dest_dir}"`);
134
+ }
135
+ else if (stdout.includes('tar')) {
136
+ await exec_async(`tar -xf "${archive_path}" -C "${dest_dir}"`);
137
+ }
138
+ else {
139
+ return failure(Errors.invalid_argument('source', `Unknown archive format for ${url}`));
140
+ }
141
+ }
142
+ return success(undefined);
143
+ }
144
+ catch (error) {
145
+ return failure(Errors.source_fetch_error(source_name, error));
146
+ }
147
+ }
148
+ async find_content_dir(extract_dir) {
149
+ const entries = await fs.readdir(extract_dir, { withFileTypes: true });
150
+ const dirs = entries.filter((e) => e.isDirectory());
151
+ // If there's exactly one directory, assume it's the content root
152
+ if (dirs.length === 1 && entries.length === 1 && dirs[0]) {
153
+ return path.join(extract_dir, dirs[0].name);
154
+ }
155
+ // Otherwise, use the extract directory itself
156
+ return extract_dir;
157
+ }
158
+ }
159
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/sources/fetchers/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { create_git_fetcher } from './git.js';
2
+ export { create_http_fetcher } from './http.js';
3
+ export { create_oci_fetcher } from './oci.js';
4
+ export type { SourceFetcherType } from './types.js';
5
+ import { type TemplateSourceType } from '../../schema/index.js';
6
+ import type { SourceFetcherType } from './types.js';
7
+ /**
8
+ * Gets the appropriate fetcher for a source type.
9
+ */
10
+ export declare function get_fetcher_for_source(source: TemplateSourceType): SourceFetcherType;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAYpF"}
@@ -0,0 +1,24 @@
1
+ export { create_git_fetcher } from './git.js';
2
+ export { create_http_fetcher } from './http.js';
3
+ export { create_oci_fetcher } from './oci.js';
4
+ import { is_git_source, is_http_source, is_oci_source, } from '../../schema/index.js';
5
+ import { create_git_fetcher } from './git.js';
6
+ import { create_http_fetcher } from './http.js';
7
+ import { create_oci_fetcher } from './oci.js';
8
+ /**
9
+ * Gets the appropriate fetcher for a source type.
10
+ */
11
+ export function get_fetcher_for_source(source) {
12
+ if (is_git_source(source)) {
13
+ return create_git_fetcher();
14
+ }
15
+ if (is_http_source(source)) {
16
+ return create_http_fetcher();
17
+ }
18
+ if (is_oci_source(source)) {
19
+ return create_oci_fetcher();
20
+ }
21
+ // This should never happen due to schema validation
22
+ throw new Error(`Unknown source type for source: ${source.name}`);
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sources/fetchers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EAEL,aAAa,EACb,cAAc,EACd,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG9C;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAA0B;IAC/D,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,mBAAmB,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IACD,oDAAoD;IACpD,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SourceFetcherType } from './types.js';
2
+ /**
3
+ * Creates an OCI source fetcher.
4
+ */
5
+ export declare function create_oci_fetcher(): SourceFetcherType;
6
+ //# sourceMappingURL=oci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oci.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/oci.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,iBAAiB,CAEtD"}
@@ -0,0 +1,156 @@
1
+ import { exec } from 'node:child_process';
2
+ import * as fs from 'node:fs/promises';
3
+ import * as os from 'node:os';
4
+ import * as path from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import { Errors, failure, success, } from '../../core/index.js';
7
+ import { is_oci_source } from '../../schema/index.js';
8
+ const exec_async = promisify(exec);
9
+ const DEFAULT_TIMEOUT = 120_000; // 2 minutes
10
+ /**
11
+ * Creates an OCI source fetcher.
12
+ */
13
+ export function create_oci_fetcher() {
14
+ return new OciFetcher();
15
+ }
16
+ class OciFetcher {
17
+ type = 'oci';
18
+ is_mutable(source) {
19
+ if (!is_oci_source(source))
20
+ return true;
21
+ // Digests are immutable, 'latest' tag is mutable, other tags are treated as immutable
22
+ if (source.oci.digest)
23
+ return false;
24
+ return source.oci.tag === 'latest';
25
+ }
26
+ async fetch(source, options) {
27
+ if (!is_oci_source(source)) {
28
+ return failure(Errors.invalid_argument('source', 'Expected an oci source'));
29
+ }
30
+ const { registry, repository, tag, digest } = source.oci;
31
+ const timeout = options?.timeout ?? DEFAULT_TIMEOUT;
32
+ // Build OCI reference
33
+ const ref = digest ?? tag;
34
+ if (!ref) {
35
+ return failure(Errors.invalid_argument('source', 'No OCI tag or digest specified'));
36
+ }
37
+ const oci_ref = `${registry}/${repository}:${ref}`;
38
+ // Create temp directory for pull
39
+ const output_dir = await fs.mkdtemp(path.join(os.tmpdir(), 'kustodian-oci-'));
40
+ try {
41
+ // Try flux first, then oras
42
+ let pull_result = await this.try_flux_pull(oci_ref, output_dir, timeout, source.name);
43
+ if (!pull_result.success && pull_result.error.code === 'SOURCE_FETCH_ERROR') {
44
+ // Flux not available, try oras
45
+ pull_result = await this.try_oras_pull(oci_ref, output_dir, timeout, source.name);
46
+ }
47
+ if (!pull_result.success) {
48
+ return pull_result;
49
+ }
50
+ // Get the actual digest for version identifier
51
+ const version = digest ?? (await this.get_digest(registry, repository, ref, timeout, source.name));
52
+ return success({
53
+ path: output_dir,
54
+ version: version ?? ref,
55
+ from_cache: false,
56
+ fetched_at: new Date(),
57
+ });
58
+ }
59
+ catch (error) {
60
+ // Cleanup on error
61
+ await fs.rm(output_dir, { recursive: true, force: true }).catch(() => { });
62
+ return failure(Errors.source_fetch_error(source.name, error));
63
+ }
64
+ }
65
+ async list_versions(source) {
66
+ if (!is_oci_source(source)) {
67
+ return failure(Errors.invalid_argument('source', 'Expected an oci source'));
68
+ }
69
+ const { registry, repository } = source.oci;
70
+ try {
71
+ // Try using oras to list tags
72
+ const { stdout } = await exec_async(`oras repo tags ${registry}/${repository}`, {
73
+ timeout: DEFAULT_TIMEOUT,
74
+ });
75
+ const versions = stdout
76
+ .split('\n')
77
+ .map((line) => line.trim())
78
+ .filter((line) => line.length > 0)
79
+ .map((version) => ({ version }));
80
+ return success(versions);
81
+ }
82
+ catch {
83
+ // If oras fails, try crane
84
+ try {
85
+ const { stdout } = await exec_async(`crane ls ${registry}/${repository}`, {
86
+ timeout: DEFAULT_TIMEOUT,
87
+ });
88
+ const versions = stdout
89
+ .split('\n')
90
+ .map((line) => line.trim())
91
+ .filter((line) => line.length > 0)
92
+ .map((version) => ({ version }));
93
+ return success(versions);
94
+ }
95
+ catch (error) {
96
+ return failure(Errors.source_fetch_error(source.name, error));
97
+ }
98
+ }
99
+ }
100
+ async try_flux_pull(oci_ref, output_dir, timeout, source_name) {
101
+ try {
102
+ await exec_async(`flux pull artifact oci://${oci_ref} --output="${output_dir}"`, { timeout });
103
+ return success(undefined);
104
+ }
105
+ catch (error) {
106
+ if (error instanceof Error && error.message.includes('not found')) {
107
+ return failure(Errors.source_fetch_error(source_name, new Error('flux CLI not found')));
108
+ }
109
+ if (error instanceof Error && error.message.includes('unauthorized')) {
110
+ return failure(Errors.source_auth_error(source_name, error));
111
+ }
112
+ if (error instanceof Error && 'killed' in error && error.killed) {
113
+ return failure(Errors.source_timeout(source_name, timeout));
114
+ }
115
+ return failure(Errors.source_fetch_error(source_name, error));
116
+ }
117
+ }
118
+ async try_oras_pull(oci_ref, output_dir, timeout, source_name) {
119
+ try {
120
+ await exec_async(`oras pull ${oci_ref} --output="${output_dir}"`, { timeout });
121
+ return success(undefined);
122
+ }
123
+ catch (error) {
124
+ if (error instanceof Error && error.message.includes('not found')) {
125
+ return failure(Errors.source_fetch_error(source_name, new Error('Neither flux nor oras CLI found')));
126
+ }
127
+ if (error instanceof Error && error.message.includes('unauthorized')) {
128
+ return failure(Errors.source_auth_error(source_name, error));
129
+ }
130
+ if (error instanceof Error && 'killed' in error && error.killed) {
131
+ return failure(Errors.source_timeout(source_name, timeout));
132
+ }
133
+ return failure(Errors.source_fetch_error(source_name, error));
134
+ }
135
+ }
136
+ async get_digest(registry, repository, tag, timeout, _source_name) {
137
+ try {
138
+ // Try crane first
139
+ const { stdout } = await exec_async(`crane digest ${registry}/${repository}:${tag}`, {
140
+ timeout,
141
+ });
142
+ return stdout.trim();
143
+ }
144
+ catch {
145
+ // If crane fails, try oras
146
+ try {
147
+ const { stdout } = await exec_async(`oras manifest fetch ${registry}/${repository}:${tag} --descriptor | jq -r .digest`, { timeout });
148
+ return stdout.trim() || null;
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=oci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oci.js","sourceRoot":"","sources":["../../../src/sources/fetchers/oci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { KustodianErrorType, ResultType } from '../../core/index.js';
2
+ import type { TemplateSourceType } from '../../schema/index.js';
3
+ import type { FetchOptionsType, FetchResultType, RemoteVersionType } from '../types.js';
4
+ /**
5
+ * Base interface for source fetchers.
6
+ * Each source type (git, http, oci) implements this interface.
7
+ */
8
+ export interface SourceFetcherType {
9
+ /** Unique identifier for this fetcher type */
10
+ readonly type: 'git' | 'http' | 'oci';
11
+ /**
12
+ * Fetches templates from the source to a temporary directory.
13
+ * The caller is responsible for caching the result.
14
+ */
15
+ fetch(source: TemplateSourceType, options?: FetchOptionsType): Promise<ResultType<FetchResultType, KustodianErrorType>>;
16
+ /**
17
+ * Lists available versions from the remote.
18
+ */
19
+ list_versions(source: TemplateSourceType): Promise<ResultType<RemoteVersionType[], KustodianErrorType>>;
20
+ /**
21
+ * Determines if this source reference is mutable.
22
+ */
23
+ is_mutable(source: TemplateSourceType): boolean;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sources/fetchers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAExF;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IAEtC;;;OAGG;IACH,KAAK,CACH,MAAM,EAAE,kBAAkB,EAC1B,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAE5D;;OAEG;IACH,aAAa,CACX,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAEhE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/sources/fetchers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export { type CacheMetaType, cache_meta_schema, calculate_expiry, create_cache_manager, DEFAULT_TTL, is_expired, META_FILENAME, parse_ttl, TEMPLATES_DIRNAME, } from './cache/index.js';
2
+ export { create_git_fetcher, create_http_fetcher, create_oci_fetcher, get_fetcher_for_source, } from './fetchers/index.js';
3
+ export { type LoadedSourcesResultType, type LoadSourcesOptionsType, load_templates_from_sources, type SourcedTemplateType, } from './loader.js';
4
+ export { type CreateResolverOptionsType, create_source_resolver, DEFAULT_CACHE_DIR, } from './resolver.js';
5
+ export type { CacheEntryType, CacheManagerType, FetchOptionsType, FetchResultType, RemoteVersionType, ResolvedSourceType, ResolverOptionsType, SourceFetcherType, SourceResolverType, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sources/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,aAAa,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,aAAa,EACb,SAAS,EACT,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,2BAA2B,EAC3B,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,KAAK,yBAAyB,EAC9B,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}