@g3nomaly/core 0.3.0 → 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 (243) hide show
  1. package/LICENSE +95 -0
  2. package/dist/cli/commands/add.d.ts +17 -0
  3. package/dist/cli/commands/add.d.ts.map +1 -0
  4. package/dist/cli/commands/add.js +76 -0
  5. package/dist/cli/commands/add.js.map +1 -0
  6. package/dist/cli/commands/installFromSources.d.ts +49 -0
  7. package/dist/cli/commands/installFromSources.d.ts.map +1 -0
  8. package/dist/cli/commands/installFromSources.js +138 -0
  9. package/dist/cli/commands/installFromSources.js.map +1 -0
  10. package/dist/cli/commands/ls.d.ts +16 -0
  11. package/dist/cli/commands/ls.d.ts.map +1 -0
  12. package/dist/cli/commands/ls.js +65 -0
  13. package/dist/cli/commands/ls.js.map +1 -0
  14. package/dist/cli/commands/remove.d.ts +13 -0
  15. package/dist/cli/commands/remove.d.ts.map +1 -0
  16. package/dist/cli/commands/remove.js +109 -0
  17. package/dist/cli/commands/remove.js.map +1 -0
  18. package/dist/cli/commands/sources.d.ts +45 -0
  19. package/dist/cli/commands/sources.d.ts.map +1 -0
  20. package/dist/cli/commands/sources.js +89 -0
  21. package/dist/cli/commands/sources.js.map +1 -0
  22. package/dist/cli/commands/update.d.ts +10 -0
  23. package/dist/cli/commands/update.d.ts.map +1 -0
  24. package/dist/cli/commands/update.js +92 -0
  25. package/dist/cli/commands/update.js.map +1 -0
  26. package/dist/cli/dialogue.d.ts +74 -0
  27. package/dist/cli/dialogue.d.ts.map +1 -0
  28. package/dist/cli/dialogue.js +117 -0
  29. package/dist/cli/dialogue.js.map +1 -0
  30. package/dist/cli/index.d.ts +19 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +16 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/cli/installDialogues.d.ts +15 -0
  35. package/dist/cli/installDialogues.d.ts.map +1 -0
  36. package/dist/cli/installDialogues.js +72 -0
  37. package/dist/cli/installDialogues.js.map +1 -0
  38. package/dist/cli/pick.d.ts +14 -0
  39. package/dist/cli/pick.d.ts.map +1 -0
  40. package/dist/cli/pick.js +35 -0
  41. package/dist/cli/pick.js.map +1 -0
  42. package/dist/cli/report.d.ts +34 -0
  43. package/dist/cli/report.d.ts.map +1 -0
  44. package/dist/cli/report.js +71 -0
  45. package/dist/cli/report.js.map +1 -0
  46. package/dist/cli/theme.d.ts +23 -0
  47. package/dist/cli/theme.d.ts.map +1 -0
  48. package/dist/cli/theme.js +25 -0
  49. package/dist/cli/theme.js.map +1 -0
  50. package/dist/cli/types.d.ts +45 -0
  51. package/dist/cli/types.d.ts.map +1 -0
  52. package/dist/cli/types.js +2 -0
  53. package/dist/cli/types.js.map +1 -0
  54. package/dist/config/config.d.ts +30 -0
  55. package/dist/config/config.d.ts.map +1 -0
  56. package/dist/config/config.js +77 -0
  57. package/dist/config/config.js.map +1 -0
  58. package/dist/config/index.d.ts +4 -0
  59. package/dist/config/index.d.ts.map +1 -0
  60. package/dist/config/index.js +3 -0
  61. package/dist/config/index.js.map +1 -0
  62. package/dist/config/types.d.ts +124 -0
  63. package/dist/config/types.d.ts.map +1 -0
  64. package/dist/config/types.js +61 -0
  65. package/dist/config/types.js.map +1 -0
  66. package/dist/hash/hash.d.ts +25 -0
  67. package/dist/hash/hash.d.ts.map +1 -0
  68. package/dist/hash/hash.js +44 -0
  69. package/dist/hash/hash.js.map +1 -0
  70. package/dist/hash/index.d.ts +2 -0
  71. package/dist/hash/index.d.ts.map +1 -0
  72. package/dist/hash/index.js +2 -0
  73. package/dist/hash/index.js.map +1 -0
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +2 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/installer/classify.d.ts +7 -0
  79. package/dist/installer/classify.d.ts.map +1 -0
  80. package/dist/installer/classify.js +47 -0
  81. package/dist/installer/classify.js.map +1 -0
  82. package/dist/installer/files.d.ts +15 -0
  83. package/dist/installer/files.d.ts.map +1 -0
  84. package/dist/installer/files.js +22 -0
  85. package/dist/installer/files.js.map +1 -0
  86. package/dist/installer/index.d.ts +19 -0
  87. package/dist/installer/index.d.ts.map +1 -0
  88. package/dist/installer/index.js +14 -0
  89. package/dist/installer/index.js.map +1 -0
  90. package/dist/installer/install.d.ts +13 -0
  91. package/dist/installer/install.d.ts.map +1 -0
  92. package/dist/installer/install.js +61 -0
  93. package/dist/installer/install.js.map +1 -0
  94. package/dist/installer/io.d.ts +4 -0
  95. package/dist/installer/io.d.ts.map +1 -0
  96. package/dist/installer/io.js +18 -0
  97. package/dist/installer/io.js.map +1 -0
  98. package/dist/installer/manifest.d.ts +59 -0
  99. package/dist/installer/manifest.d.ts.map +1 -0
  100. package/dist/installer/manifest.js +60 -0
  101. package/dist/installer/manifest.js.map +1 -0
  102. package/dist/installer/manifestSources.d.ts +21 -0
  103. package/dist/installer/manifestSources.d.ts.map +1 -0
  104. package/dist/installer/manifestSources.js +39 -0
  105. package/dist/installer/manifestSources.js.map +1 -0
  106. package/dist/installer/marketplace.d.ts +34 -0
  107. package/dist/installer/marketplace.d.ts.map +1 -0
  108. package/dist/installer/marketplace.js +64 -0
  109. package/dist/installer/marketplace.js.map +1 -0
  110. package/dist/installer/origin.d.ts +43 -0
  111. package/dist/installer/origin.d.ts.map +1 -0
  112. package/dist/installer/origin.js +22 -0
  113. package/dist/installer/origin.js.map +1 -0
  114. package/dist/installer/remove.d.ts +14 -0
  115. package/dist/installer/remove.d.ts.map +1 -0
  116. package/dist/installer/remove.js +37 -0
  117. package/dist/installer/remove.js.map +1 -0
  118. package/dist/installer/resolve.d.ts +78 -0
  119. package/dist/installer/resolve.d.ts.map +1 -0
  120. package/dist/installer/resolve.js +184 -0
  121. package/dist/installer/resolve.js.map +1 -0
  122. package/dist/installer/sourceRegistry.d.ts +59 -0
  123. package/dist/installer/sourceRegistry.d.ts.map +1 -0
  124. package/dist/installer/sourceRegistry.js +71 -0
  125. package/dist/installer/sourceRegistry.js.map +1 -0
  126. package/dist/installer/types.d.ts +80 -0
  127. package/dist/installer/types.d.ts.map +1 -0
  128. package/dist/installer/types.js +21 -0
  129. package/dist/installer/types.js.map +1 -0
  130. package/dist/registry/index.d.ts +12 -0
  131. package/dist/registry/index.d.ts.map +1 -0
  132. package/dist/registry/index.js +12 -0
  133. package/dist/registry/index.js.map +1 -0
  134. package/dist/registry/registry.handlers.d.ts +9 -0
  135. package/dist/registry/registry.handlers.d.ts.map +1 -0
  136. package/dist/registry/registry.handlers.js +13 -0
  137. package/dist/registry/registry.handlers.js.map +1 -0
  138. package/dist/registry/registry.io.d.ts +22 -0
  139. package/dist/registry/registry.io.d.ts.map +1 -0
  140. package/dist/registry/registry.io.js +78 -0
  141. package/dist/registry/registry.io.js.map +1 -0
  142. package/dist/registry/registry.mutations.d.ts +12 -0
  143. package/dist/registry/registry.mutations.d.ts.map +1 -0
  144. package/dist/registry/registry.mutations.js +22 -0
  145. package/dist/registry/registry.mutations.js.map +1 -0
  146. package/dist/registry/registry.selectors.d.ts +38 -0
  147. package/dist/registry/registry.selectors.d.ts.map +1 -0
  148. package/dist/registry/registry.selectors.js +61 -0
  149. package/dist/registry/registry.selectors.js.map +1 -0
  150. package/dist/registry/registry.store.d.ts +34 -0
  151. package/dist/registry/registry.store.d.ts.map +1 -0
  152. package/dist/registry/registry.store.js +27 -0
  153. package/dist/registry/registry.store.js.map +1 -0
  154. package/dist/registry/registry.template.d.ts +23 -0
  155. package/dist/registry/registry.template.d.ts.map +1 -0
  156. package/dist/registry/registry.template.js +63 -0
  157. package/dist/registry/registry.template.js.map +1 -0
  158. package/dist/registry/types.d.ts +33 -0
  159. package/dist/registry/types.d.ts.map +1 -0
  160. package/dist/registry/types.js +25 -0
  161. package/dist/registry/types.js.map +1 -0
  162. package/dist/security/index.d.ts +2 -0
  163. package/dist/security/index.d.ts.map +1 -0
  164. package/dist/security/index.js +2 -0
  165. package/dist/security/index.js.map +1 -0
  166. package/dist/security/securityParser.d.ts +14 -0
  167. package/dist/security/securityParser.d.ts.map +1 -0
  168. package/dist/security/securityParser.js +89 -0
  169. package/dist/security/securityParser.js.map +1 -0
  170. package/dist/security/securityWorker.d.ts +8 -0
  171. package/dist/security/securityWorker.d.ts.map +1 -0
  172. package/dist/security/securityWorker.js +158 -0
  173. package/dist/security/securityWorker.js.map +1 -0
  174. package/dist/sources/checkout.d.ts +14 -0
  175. package/dist/sources/checkout.d.ts.map +1 -0
  176. package/dist/sources/checkout.js +27 -0
  177. package/dist/sources/checkout.js.map +1 -0
  178. package/dist/sources/git.d.ts +9 -0
  179. package/dist/sources/git.d.ts.map +1 -0
  180. package/dist/sources/git.js +22 -0
  181. package/dist/sources/git.js.map +1 -0
  182. package/dist/sources/index.d.ts +5 -0
  183. package/dist/sources/index.d.ts.map +1 -0
  184. package/dist/sources/index.js +6 -0
  185. package/dist/sources/index.js.map +1 -0
  186. package/dist/sources/local.d.ts +10 -0
  187. package/dist/sources/local.d.ts.map +1 -0
  188. package/dist/sources/local.js +20 -0
  189. package/dist/sources/local.js.map +1 -0
  190. package/dist/sources/npm.d.ts +13 -0
  191. package/dist/sources/npm.d.ts.map +1 -0
  192. package/dist/sources/npm.js +128 -0
  193. package/dist/sources/npm.js.map +1 -0
  194. package/dist/sources/packageJson.d.ts +3 -0
  195. package/dist/sources/packageJson.d.ts.map +1 -0
  196. package/dist/sources/packageJson.js +13 -0
  197. package/dist/sources/packageJson.js.map +1 -0
  198. package/dist/sources/parse.d.ts +34 -0
  199. package/dist/sources/parse.d.ts.map +1 -0
  200. package/dist/sources/parse.js +92 -0
  201. package/dist/sources/parse.js.map +1 -0
  202. package/dist/sources/process.d.ts +18 -0
  203. package/dist/sources/process.d.ts.map +1 -0
  204. package/dist/sources/process.js +43 -0
  205. package/dist/sources/process.js.map +1 -0
  206. package/dist/sources/register.d.ts +16 -0
  207. package/dist/sources/register.d.ts.map +1 -0
  208. package/dist/sources/register.js +37 -0
  209. package/dist/sources/register.js.map +1 -0
  210. package/dist/sources/types.d.ts +73 -0
  211. package/dist/sources/types.d.ts.map +1 -0
  212. package/dist/sources/types.js +36 -0
  213. package/dist/sources/types.js.map +1 -0
  214. package/dist/utils/errors.d.ts +3 -0
  215. package/dist/utils/errors.d.ts.map +1 -0
  216. package/dist/utils/errors.js +6 -0
  217. package/dist/utils/errors.js.map +1 -0
  218. package/dist/utils/index.d.ts +7 -0
  219. package/dist/utils/index.d.ts.map +1 -0
  220. package/dist/utils/index.js +7 -0
  221. package/dist/utils/index.js.map +1 -0
  222. package/dist/utils/merge.d.ts +6 -0
  223. package/dist/utils/merge.d.ts.map +1 -0
  224. package/dist/utils/merge.js +21 -0
  225. package/dist/utils/merge.js.map +1 -0
  226. package/dist/utils/packageMeta.d.ts +12 -0
  227. package/dist/utils/packageMeta.d.ts.map +1 -0
  228. package/dist/utils/packageMeta.js +20 -0
  229. package/dist/utils/packageMeta.js.map +1 -0
  230. package/dist/utils/paths.d.ts +16 -0
  231. package/dist/utils/paths.d.ts.map +1 -0
  232. package/dist/utils/paths.js +40 -0
  233. package/dist/utils/paths.js.map +1 -0
  234. package/dist/utils/prompt.d.ts +3 -0
  235. package/dist/utils/prompt.d.ts.map +1 -0
  236. package/dist/utils/prompt.js +8 -0
  237. package/dist/utils/prompt.js.map +1 -0
  238. package/dist/utils/version.d.ts +9 -0
  239. package/dist/utils/version.d.ts.map +1 -0
  240. package/dist/utils/version.js +103 -0
  241. package/dist/utils/version.js.map +1 -0
  242. package/package.json +64 -3
  243. package/README.md +0 -3
@@ -0,0 +1,59 @@
1
+ import { type RegistryStore } from "../registry/registry.store";
2
+ import type { RegisteredSource, SourceCheckout } from "../sources/types";
3
+ import type { EntrySource } from "../cli/types";
4
+ import { type OriginEntry } from "./origin";
5
+ /** What a package's reader found in one checked-out source. */
6
+ export interface SourceEntries<T extends OriginEntry> {
7
+ /** Entries by key, each with its `origin` filled in */
8
+ entries: [string, T][];
9
+ warnings: string[];
10
+ }
11
+ /** Reads the entries one checked-out source offers; each installer supplies its own. */
12
+ export type ReadSource<T extends OriginEntry> = (checkout: SourceCheckout) => Promise<SourceEntries<T>>;
13
+ /** A source that could not be checked out or read, with the reason. */
14
+ export interface FailedSource {
15
+ name: string;
16
+ error: string;
17
+ }
18
+ /**
19
+ * The entries a set of sources offers, one registry store per source, read
20
+ * from checkouts that stay on disk until `dispose` so the install can copy
21
+ * files out of them.
22
+ *
23
+ * Built by `loadSourceRegistry` in each installer's `add`, `update`, `ls` and
24
+ * `source add` commands. `offers` lists every entry for name resolution, and
25
+ * `entrySource` copies an entry's files from its checkout.
26
+ */
27
+ export interface SourceRegistry<T extends OriginEntry> {
28
+ /** Entries by source name, in the order the sources were given */
29
+ sources: Map<string, RegistryStore<T>>;
30
+ checkouts: Map<string, SourceCheckout>;
31
+ warnings: string[];
32
+ failed: FailedSource[];
33
+ dispose: () => void;
34
+ }
35
+ /** One entry one source offers. */
36
+ export interface SourceOffer<T extends OriginEntry> {
37
+ key: string;
38
+ entry: T;
39
+ }
40
+ /**
41
+ * Checks out each source and reads its entries with `readSource`, all
42
+ * sources at once. A source that cannot be checked out or read lands in
43
+ * `failed` instead of throwing, so one unreachable source does not stop the
44
+ * rest. A key offered twice by one source keeps the first, with a warning.
45
+ *
46
+ * @param projectRoot - Absolute root that local source paths and the `node_modules` lookup start from
47
+ */
48
+ export declare function loadSourceRegistry<T extends OriginEntry>(sources: readonly RegisteredSource[], projectRoot: string, readSource: ReadSource<T>): Promise<SourceRegistry<T>>;
49
+ /** Every entry of every source, sources in their given order and keys sorted within each. */
50
+ export declare function offers<T extends OriginEntry>(registry: SourceRegistry<T>): SourceOffer<T>[];
51
+ /**
52
+ * File source for the core install commands: a file at `files[].path` is
53
+ * copied from `<checkout>/<origin.dir>/<path>` in the checkout of the
54
+ * entry's source.
55
+ */
56
+ export declare function entrySource<T extends OriginEntry>(registry: SourceRegistry<T>): EntrySource;
57
+ /** Registry the core install commands take, keyed by entry key. */
58
+ export declare function offerRegistry<T extends OriginEntry>(selected: Iterable<SourceOffer<T>>): Record<string, T>;
59
+ //# sourceMappingURL=sourceRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceRegistry.d.ts","sourceRoot":"","sources":["../../src/installer/sourceRegistry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAIpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAExE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAE9D,+DAA+D;AAC/D,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,WAAW;IAClD,uDAAuD;IACvD,OAAO,EAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wFAAwF;AACxF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;AAEvG,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAG,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,WAAW;IACnD,kEAAkE;IAClE,OAAO,EAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACtC,QAAQ,EAAG,MAAM,EAAE,CAAA;IACnB,MAAM,EAAK,YAAY,EAAE,CAAA;IACzB,OAAO,EAAI,MAAM,IAAI,CAAA;CACtB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,WAAW;IAChD,GAAG,EAAI,MAAM,CAAA;IACb,KAAK,EAAE,CAAC,CAAA;CACT;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,SAAS,WAAW,EAC5D,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CA6B5B;AAED,6FAA6F;AAC7F,wBAAgB,MAAM,CAAC,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAG3F;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,WAAW,CAO3F;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAI1G"}
@@ -0,0 +1,71 @@
1
+ // packages/core/src/installer/sourceRegistry.ts
2
+ import path from "node:path";
3
+ import { createRegistryStore } from "../registry/registry.store";
4
+ import { register } from "../registry/registry.mutations";
5
+ import { entries } from "../registry/registry.selectors";
6
+ import { checkoutSource } from "../sources/checkout";
7
+ import { errorMessage } from "../utils/errors";
8
+ import { copySource } from "./install";
9
+ import { OriginEntrySchema } from "./origin";
10
+ /**
11
+ * Checks out each source and reads its entries with `readSource`, all
12
+ * sources at once. A source that cannot be checked out or read lands in
13
+ * `failed` instead of throwing, so one unreachable source does not stop the
14
+ * rest. A key offered twice by one source keeps the first, with a warning.
15
+ *
16
+ * @param projectRoot - Absolute root that local source paths and the `node_modules` lookup start from
17
+ */
18
+ export async function loadSourceRegistry(sources, projectRoot, readSource) {
19
+ const registry = { sources: new Map(), checkouts: new Map(), warnings: [], failed: [], dispose: () => { } };
20
+ registry.dispose = () => { for (const checkout of registry.checkouts.values())
21
+ checkout.dispose(); };
22
+ const results = await Promise.allSettled(sources.map(async (source) => {
23
+ const checkout = await checkoutSource(source, projectRoot);
24
+ registry.checkouts.set(source.name, checkout);
25
+ return readSource(checkout);
26
+ }));
27
+ results.forEach((result, index) => {
28
+ const name = sources[index]?.name ?? "";
29
+ if (result.status === "rejected") {
30
+ registry.failed.push({ name, error: errorMessage(result.reason) });
31
+ return;
32
+ }
33
+ const store = createRegistryStore();
34
+ for (const [key, entry] of result.value.entries) {
35
+ if (store.store.state[key] !== undefined) {
36
+ registry.warnings.push(`${name}: "${key}" is offered twice, using the first`);
37
+ continue;
38
+ }
39
+ register(store, key, entry);
40
+ }
41
+ registry.sources.set(name, store);
42
+ registry.warnings.push(...result.value.warnings.map((warning) => `${name}: ${warning}`));
43
+ });
44
+ return registry;
45
+ }
46
+ /** Every entry of every source, sources in their given order and keys sorted within each. */
47
+ export function offers(registry) {
48
+ return [...registry.sources.values()].flatMap((store) => Object.entries(entries(store)).sort(([a], [b]) => a.localeCompare(b)).map(([key, entry]) => ({ key, entry })));
49
+ }
50
+ /**
51
+ * File source for the core install commands: a file at `files[].path` is
52
+ * copied from `<checkout>/<origin.dir>/<path>` in the checkout of the
53
+ * entry's source.
54
+ */
55
+ export function entrySource(registry) {
56
+ return (entry) => {
57
+ const { origin } = OriginEntrySchema.pick({ origin: true }).parse(entry);
58
+ const checkout = registry.checkouts.get(origin.source);
59
+ if (checkout === undefined)
60
+ throw new Error(`source ${origin.source} of "${entry.name}" is not checked out`);
61
+ return copySource((filePath) => path.join(checkout.dir, origin.dir, filePath));
62
+ };
63
+ }
64
+ /** Registry the core install commands take, keyed by entry key. */
65
+ export function offerRegistry(selected) {
66
+ const registry = {};
67
+ for (const offer of selected)
68
+ registry[offer.key] = offer.entry;
69
+ return registry;
70
+ }
71
+ //# sourceMappingURL=sourceRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceRegistry.js","sourceRoot":"","sources":["../../src/installer/sourceRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { BaseFileEntry } from "../registry/types";
2
+ /**
3
+ * How one installed file relates to its package version. Ordered by
4
+ * severity: everything >= UserOnly carries local changes.
5
+ * (Const-object enum — the `enum` keyword is barred by `erasableSyntaxOnly`.)
6
+ */
7
+ export declare const FileState: {
8
+ /** On disk and identical to the package file */
9
+ readonly UpToDate: 0;
10
+ /** Missing, or unmodified while the package file changed; writable without data loss */
11
+ readonly SafeUpdate: 1;
12
+ /** Modified locally while the package file is unchanged */
13
+ readonly UserOnly: 2;
14
+ /** Modified locally and the package file changed too */
15
+ readonly Conflict: 3;
16
+ };
17
+ export type FileState = (typeof FileState)[keyof typeof FileState];
18
+ /** What to do with `UserOnly` and `Conflict` files when applying. */
19
+ export declare const ConflictDecision: {
20
+ readonly Keep: 0;
21
+ readonly Overwrite: 1;
22
+ };
23
+ export type ConflictDecision = (typeof ConflictDecision)[keyof typeof ConflictDecision];
24
+ /** Classification of one file, produced by `classifyFiles` and consumed by `applyClassifications`. */
25
+ export interface FileClassification<F extends BaseFileEntry = BaseFileEntry> {
26
+ file: F;
27
+ destPath: string;
28
+ state: FileState;
29
+ exists: boolean;
30
+ /** Hash of the file currently on disk, null when it does not exist */
31
+ currentHash: string | null;
32
+ /** Hash recorded in the user manifest at install time, undefined when never installed */
33
+ recordedHash: string | undefined;
34
+ /** Hash of the package's current version of the file */
35
+ latestHash: string;
36
+ }
37
+ /** Where a file's content comes from when it is written. `null` skips the file. */
38
+ export type FileContent = {
39
+ kind: "copy";
40
+ sourcePath: string;
41
+ } | {
42
+ kind: "write";
43
+ content: string;
44
+ } | null;
45
+ export type FileSource<F extends BaseFileEntry = BaseFileEntry> = (file: F) => FileContent | Promise<FileContent>;
46
+ /**
47
+ * Filesystem boundary for the installer. `createInstallerIO` supplies the
48
+ * real implementation; tests inject stubs per field.
49
+ */
50
+ export interface InstallerIO {
51
+ exists: (path: string) => boolean;
52
+ ensureDir: (dir: string) => void;
53
+ copyFile: (src: string, dest: string) => void;
54
+ writeFile: (dest: string, content: string) => void;
55
+ removeFile: (path: string) => void;
56
+ listDir: (dir: string) => string[];
57
+ removeDir: (dir: string) => void;
58
+ hashFile: (path: string) => Promise<string>;
59
+ }
60
+ export interface ApplyOptions {
61
+ decision: ConflictDecision;
62
+ force?: boolean;
63
+ dryRun?: boolean;
64
+ }
65
+ export interface ApplyResult<F extends BaseFileEntry = BaseFileEntry> {
66
+ /** Relative paths written (or that would be written under dryRun) */
67
+ written: string[];
68
+ /** Relative paths with local changes that were left alone */
69
+ kept: string[];
70
+ /** Relative paths whose source produced no content */
71
+ missingSource: string[];
72
+ /** Manifest entries reflecting the on-disk state after the apply */
73
+ files: F[];
74
+ }
75
+ export interface RemoveResult {
76
+ removed: string[];
77
+ kept: string[];
78
+ missing: string[];
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD;;;;GAIG;AACH,eAAO,MAAM,SAAS;IACpB,gDAAgD;aAChD,QAAQ,EAAI,CAAC;IACb,wFAAwF;aACxF,UAAU,EAAE,CAAC;IACb,2DAA2D;aAC3D,QAAQ,EAAI,CAAC;IACb,wDAAwD;aACxD,QAAQ,EAAI,CAAC;CACL,CAAA;AACV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAA;AAElE,qEAAqE;AACrE,eAAO,MAAM,gBAAgB;aAC3B,IAAI,EAAO,CAAC;aACZ,SAAS,EAAE,CAAC;CACJ,CAAA;AACV,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAA;AAEvF,sGAAsG;AACtG,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACzE,IAAI,EAAU,CAAC,CAAA;IACf,QAAQ,EAAM,MAAM,CAAA;IACpB,KAAK,EAAS,SAAS,CAAA;IACvB,MAAM,EAAQ,OAAO,CAAA;IACrB,sEAAsE;IACtE,WAAW,EAAG,MAAM,GAAG,IAAI,CAAA;IAC3B,yFAAyF;IACzF,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,wDAAwD;IACxD,UAAU,EAAI,MAAM,CAAA;CACrB;AAED,mFAAmF;AACnF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC,IAAI,CAAA;AAER,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IAC5D,CAAC,IAAI,EAAE,CAAC,KAAK,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AAEjD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAM,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACrC,SAAS,EAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/C,SAAS,EAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,OAAO,EAAK,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAA;IACrC,SAAS,EAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,QAAQ,EAAI,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,KAAK,CAAC,EAAI,OAAO,CAAA;IACjB,MAAM,CAAC,EAAG,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IAClE,qEAAqE;IACrE,OAAO,EAAQ,MAAM,EAAE,CAAA;IACvB,6DAA6D;IAC7D,IAAI,EAAW,MAAM,EAAE,CAAA;IACvB,sDAAsD;IACtD,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,oEAAoE;IACpE,KAAK,EAAU,CAAC,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAK,MAAM,EAAE,CAAA;IACjB,OAAO,EAAE,MAAM,EAAE,CAAA;CAClB"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * How one installed file relates to its package version. Ordered by
3
+ * severity: everything >= UserOnly carries local changes.
4
+ * (Const-object enum — the `enum` keyword is barred by `erasableSyntaxOnly`.)
5
+ */
6
+ export const FileState = {
7
+ /** On disk and identical to the package file */
8
+ UpToDate: 0,
9
+ /** Missing, or unmodified while the package file changed; writable without data loss */
10
+ SafeUpdate: 1,
11
+ /** Modified locally while the package file is unchanged */
12
+ UserOnly: 2,
13
+ /** Modified locally and the package file changed too */
14
+ Conflict: 3,
15
+ };
16
+ /** What to do with `UserOnly` and `Conflict` files when applying. */
17
+ export const ConflictDecision = {
18
+ Keep: 0,
19
+ Overwrite: 1,
20
+ };
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/installer/types.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,gDAAgD;IAChD,QAAQ,EAAI,CAAC;IACb,wFAAwF;IACxF,UAAU,EAAE,CAAC;IACb,2DAA2D;IAC3D,QAAQ,EAAI,CAAC;IACb,wDAAwD;IACxD,QAAQ,EAAI,CAAC;CACL,CAAA;AAGV,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAO,CAAC;IACZ,SAAS,EAAE,CAAC;CACJ,CAAA"}
@@ -0,0 +1,12 @@
1
+ export * from "./types";
2
+ export * from "./registry.handlers";
3
+ export * from "./registry.store";
4
+ export * from "./registry.mutations";
5
+ export * from "./registry.selectors";
6
+ export * from "./registry.template";
7
+ export * from "./registry.io";
8
+ /**
9
+ * Purposfully a custom registry store. To reduce dependencies. Still follows the same pattern as the tanstack store design skill. Though it could still be improved since it is still missing a lot of default operators.
10
+ * Nevertheless, this stores doesn't need reactive updates. Hence, once more the, part of why it is a custom store.
11
+ */
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAE7B;;;GAGG"}
@@ -0,0 +1,12 @@
1
+ export * from "./types";
2
+ export * from "./registry.handlers";
3
+ export * from "./registry.store";
4
+ export * from "./registry.mutations";
5
+ export * from "./registry.selectors";
6
+ export * from "./registry.template";
7
+ export * from "./registry.io";
8
+ /**
9
+ * Purposfully a custom registry store. To reduce dependencies. Still follows the same pattern as the tanstack store design skill. Though it could still be improved since it is still missing a lot of default operators.
10
+ * Nevertheless, this stores doesn't need reactive updates. Hence, once more the, part of why it is a custom store.
11
+ */
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAE7B;;;GAGG"}
@@ -0,0 +1,9 @@
1
+ import type { BaseRegistry, BaseRegistryEntry } from "./types";
2
+ export interface RegistryHandler<T extends BaseRegistryEntry = BaseRegistryEntry> {
3
+ extensions: string[];
4
+ serialize: (data: BaseRegistry<T>) => string;
5
+ deserialize: (raw: string) => BaseRegistry<T>;
6
+ }
7
+ export declare const tsHandler: RegistryHandler<any>;
8
+ export declare const jsonHandler: RegistryHandler<any>;
9
+ //# sourceMappingURL=registry.handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.handlers.d.ts","sourceRoot":"","sources":["../../src/registry/registry.handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAE9D,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IAC9E,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAA;IAC5C,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAA;CAC9C;AAED,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,GAAG,CAO1C,CAAA;AAED,eAAO,MAAM,WAAW,EAAE,eAAe,CAAC,GAAG,CAI5C,CAAA"}
@@ -0,0 +1,13 @@
1
+ export const tsHandler = {
2
+ extensions: ["ts"],
3
+ serialize: (data) => `export const registry = ${JSON.stringify(data, null, 2)} as const\n`,
4
+ deserialize: () => {
5
+ throw new Error("TS handler deserializes via dynamic import — use load()");
6
+ },
7
+ };
8
+ export const jsonHandler = {
9
+ extensions: ["json"],
10
+ serialize: (data) => JSON.stringify(data, null, 2),
11
+ deserialize: (raw) => JSON.parse(raw),
12
+ };
13
+ //# sourceMappingURL=registry.handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.handlers.js","sourceRoot":"","sources":["../../src/registry/registry.handlers.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,SAAS,GAAyB;IAC7C,UAAU,EAAE,CAAC,IAAI,CAAC;IAClB,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAClB,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,aAAa;IACvE,WAAW,EAAE,GAAG,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAC5E,CAAC;CACF,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAyB;IAC/C,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;CACtC,CAAA"}
@@ -0,0 +1,22 @@
1
+ import type { BaseRegistryEntry } from "./types";
2
+ import type { RegistryStore } from "./registry.store";
3
+ import type { RegistryHandler } from "./registry.handlers";
4
+ /**
5
+ * name alias for load() when you want to specify an explicit filePath. Otherwise identical behavior.
6
+ */
7
+ export declare function loadFrom<T extends BaseRegistryEntry>(registry: RegistryStore<T>, filePath: string): Promise<void>;
8
+ export declare function load<T extends BaseRegistryEntry>(registry: RegistryStore<T>, filePath?: string): Promise<void>;
9
+ /**
10
+ * Flushes the store to its already-bound filePath.
11
+ * Sorts entries alphabetically for deterministic output.
12
+ *
13
+ * @throws If the store has no bound filePath.
14
+ */
15
+ export declare function flush<T extends BaseRegistryEntry>(registry: RegistryStore<T>, handler?: RegistryHandler<T>): void;
16
+ /**
17
+ * Writes the store to an explicit path.
18
+ * Sorts entries alphabetically for deterministic output.
19
+ * Does not affect the store's bound filePath.
20
+ */
21
+ export declare function writeTo<T extends BaseRegistryEntry>(registry: RegistryStore<T>, filePath: string, handler?: RegistryHandler<T>): void;
22
+ //# sourceMappingURL=registry.io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.io.d.ts","sourceRoot":"","sources":["../../src/registry/registry.io.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAwB1D;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,SAAS,iBAAiB,EACxD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAEf;AAYD,wBAAsB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EACpD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAMD;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,iBAAiB,EAC/C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAC3B,IAAI,CASN;AAMD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,iBAAiB,EACjD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAC3B,IAAI,CAGN"}
@@ -0,0 +1,78 @@
1
+ import { writeFileSync, readFileSync } from "node:fs";
2
+ import { tsHandler } from "./registry.handlers";
3
+ // ---------------------------------------------------------------------------
4
+ // Helpers
5
+ // ---------------------------------------------------------------------------
6
+ function resolveHandler(registry, override) {
7
+ return override ?? registry.handler ?? tsHandler;
8
+ }
9
+ function sortedEntries(registry) {
10
+ return Object.fromEntries(Object.entries(registry.store.state).sort(([a], [b]) => a.localeCompare(b)));
11
+ }
12
+ // ---------------------------------------------------------------------------
13
+ // loadFrom (file → store)
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * name alias for load() when you want to specify an explicit filePath. Otherwise identical behavior.
17
+ */
18
+ export async function loadFrom(registry, filePath) {
19
+ return load(registry, filePath);
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // load (file → store)
23
+ //
24
+ // Hydrates the store from its bound filePath.
25
+ // - .ts files: uses dynamic import (handler is not called — TS files export
26
+ // a `registry` object directly at runtime via Bun/tsx)
27
+ // - other files: uses readFileSync + handler.deserialize
28
+ //
29
+ // No-op if the store has no filePath or the file does not exist yet.
30
+ // ---------------------------------------------------------------------------
31
+ export async function load(registry, filePath) {
32
+ const target = filePath ?? registry.filePath;
33
+ if (!target)
34
+ return;
35
+ try {
36
+ if (target.endsWith(".ts")) {
37
+ const mod = (await import(`file://${target}`));
38
+ registry.store.setState(() => ({ ...mod.registry }));
39
+ }
40
+ else {
41
+ const h = resolveHandler(registry);
42
+ const raw = readFileSync(target, "utf-8");
43
+ registry.store.setState(() => ({ ...h.deserialize(raw) }));
44
+ }
45
+ }
46
+ catch {
47
+ // File doesn't exist yet — store stays empty
48
+ }
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // flush (store → bound filePath)
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Flushes the store to its already-bound filePath.
55
+ * Sorts entries alphabetically for deterministic output.
56
+ *
57
+ * @throws If the store has no bound filePath.
58
+ */
59
+ export function flush(registry, handler) {
60
+ if (!registry.filePath) {
61
+ throw new Error("flush() requires a bound filePath. Use createRegistryStore({ filePath }) to bind one.");
62
+ }
63
+ const h = resolveHandler(registry, handler);
64
+ writeFileSync(registry.filePath, h.serialize(sortedEntries(registry)), "utf-8");
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // writeTo (store → explicit path)
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Writes the store to an explicit path.
71
+ * Sorts entries alphabetically for deterministic output.
72
+ * Does not affect the store's bound filePath.
73
+ */
74
+ export function writeTo(registry, filePath, handler) {
75
+ const h = resolveHandler(registry, handler);
76
+ writeFileSync(filePath, h.serialize(sortedEntries(registry)), "utf-8");
77
+ }
78
+ //# sourceMappingURL=registry.io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.io.js","sourceRoot":"","sources":["../../src/registry/registry.io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { BaseRegistryEntry } from "./types";
2
+ import type { RegistryStore } from "./registry.store";
3
+ /**
4
+ * Register or overwrite an entry in the store.
5
+ */
6
+ export declare function register<T extends BaseRegistryEntry>(registry: RegistryStore<T>, key: string, entry: T): void;
7
+ /**
8
+ * Remove an entry from the store.
9
+ * Returns true if the entry existed, false if it was already absent.
10
+ */
11
+ export declare function unregister<T extends BaseRegistryEntry>(registry: RegistryStore<T>, key: string): boolean;
12
+ //# sourceMappingURL=registry.mutations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mutations.d.ts","sourceRoot":"","sources":["../../src/registry/registry.mutations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,iBAAiB,EAClD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,GACP,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,iBAAiB,EACpD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAYT"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Register or overwrite an entry in the store.
3
+ */
4
+ export function register(registry, key, entry) {
5
+ registry.store.setState((s) => ({ ...s, [key]: entry }));
6
+ }
7
+ /**
8
+ * Remove an entry from the store.
9
+ * Returns true if the entry existed, false if it was already absent.
10
+ */
11
+ export function unregister(registry, key) {
12
+ const existed = key in registry.store.state;
13
+ if (existed) {
14
+ registry.store.setState((s) => {
15
+ const next = { ...s };
16
+ delete next[key];
17
+ return next;
18
+ });
19
+ }
20
+ return existed;
21
+ }
22
+ //# sourceMappingURL=registry.mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mutations.js","sourceRoot":"","sources":["../../src/registry/registry.mutations.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,QAAQ,CACtB,QAA0B,EAC1B,GAAW,EACX,KAAQ;IAER,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,QAA0B,EAC1B,GAAW;IAEX,MAAM,OAAO,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAA;IAE3C,IAAI,OAAO,EAAE,CAAC;QACZ,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,CAAA;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAA;YAChB,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { BaseRegistry, BaseRegistryEntry } from "./types";
2
+ import type { RegistryStore } from "./registry.store";
3
+ /**
4
+ * Get a single entry by key. Returns undefined if not found.
5
+ */
6
+ export declare function get<T extends BaseRegistryEntry>(registry: RegistryStore<T>, key: string): T | undefined;
7
+ /**
8
+ * Check whether a key exists in the store.
9
+ */
10
+ export declare function has<T extends BaseRegistryEntry>(registry: RegistryStore<T>, key: string): boolean;
11
+ /**
12
+ * Return all entries as a plain record.
13
+ */
14
+ export declare function entries<T extends BaseRegistryEntry>(registry: RegistryStore<T>): BaseRegistry<T>;
15
+ /**
16
+ * Return all registered keys.
17
+ */
18
+ export declare function keys<T extends BaseRegistryEntry>(registry: RegistryStore<T>): string[];
19
+ /**
20
+ * Return all entries that match a given version string.
21
+ */
22
+ export declare function getByVersion<T extends BaseRegistryEntry>(registry: RegistryStore<T>, version: string): BaseRegistry<T>;
23
+ /**
24
+ * Return the count of registered entries.
25
+ */
26
+ export declare function size<T extends BaseRegistryEntry>(registry: RegistryStore<T>): number;
27
+ /**
28
+ * Depth-first walk of `registryDependencies` starting at `key`. Every entry
29
+ * reached is added to `seen`; keys without a registry entry are pushed to
30
+ * `unknown` and not walked further.
31
+ */
32
+ export declare function collectDependencies(key: string, entries: BaseRegistry, seen: Set<string>, unknown: string[]): void;
33
+ /**
34
+ * Return which of `candidates` have `key` in their `registryDependencies` —
35
+ * the entries that need it and would break if it were removed.
36
+ */
37
+ export declare function entryDependencies(key: string, entries: BaseRegistry, candidates: string[]): string[];
38
+ //# sourceMappingURL=registry.selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.selectors.d.ts","sourceRoot":"","sources":["../../src/registry/registry.selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,GACV,CAAC,GAAG,SAAS,CAEf;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,iBAAiB,EAC7C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,GAAG,EAAE,MAAM,GACV,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,iBAAiB,EACjD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,YAAY,CAAC,CAAC,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,MAAM,EAAE,CAEV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,iBAAiB,EACtD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,MAAM,GACd,YAAY,CAAC,CAAC,CAAC,CAIjB;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GACzB,MAAM,CAER;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB,IAAI,CASN;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,MAAM,EAAE,GACnB,MAAM,EAAE,CAEV"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Get a single entry by key. Returns undefined if not found.
3
+ */
4
+ export function get(registry, key) {
5
+ return registry.store.state[key];
6
+ }
7
+ /**
8
+ * Check whether a key exists in the store.
9
+ */
10
+ export function has(registry, key) {
11
+ return key in registry.store.state;
12
+ }
13
+ /**
14
+ * Return all entries as a plain record.
15
+ */
16
+ export function entries(registry) {
17
+ return registry.store.state;
18
+ }
19
+ /**
20
+ * Return all registered keys.
21
+ */
22
+ export function keys(registry) {
23
+ return Object.keys(registry.store.state);
24
+ }
25
+ /**
26
+ * Return all entries that match a given version string.
27
+ */
28
+ export function getByVersion(registry, version) {
29
+ return Object.fromEntries(Object.entries(registry.store.state).filter(([, entry]) => entry.version === version));
30
+ }
31
+ /**
32
+ * Return the count of registered entries.
33
+ */
34
+ export function size(registry) {
35
+ return Object.keys(registry.store.state).length;
36
+ }
37
+ /**
38
+ * Depth-first walk of `registryDependencies` starting at `key`. Every entry
39
+ * reached is added to `seen`; keys without a registry entry are pushed to
40
+ * `unknown` and not walked further.
41
+ */
42
+ export function collectDependencies(key, entries, seen, unknown) {
43
+ if (seen.has(key))
44
+ return;
45
+ const entry = entries[key];
46
+ if (!entry) {
47
+ unknown.push(key);
48
+ return;
49
+ }
50
+ seen.add(key);
51
+ for (const dep of entry.registryDependencies ?? [])
52
+ collectDependencies(dep, entries, seen, unknown);
53
+ }
54
+ /**
55
+ * Return which of `candidates` have `key` in their `registryDependencies` —
56
+ * the entries that need it and would break if it were removed.
57
+ */
58
+ export function entryDependencies(key, entries, candidates) {
59
+ return candidates.filter((k) => entries[k]?.registryDependencies?.includes(key) ?? false);
60
+ }
61
+ //# sourceMappingURL=registry.selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.selectors.js","sourceRoot":"","sources":["../../src/registry/registry.selectors.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,QAA0B,EAC1B,GAAW;IAEX,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CACjB,QAA0B,EAC1B,GAAW;IAEX,OAAO,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAA;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,QAA0B;IAE1B,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,QAA0B;IAE1B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA0B,EAC1B,OAAe;IAEf,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,CACtF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAClB,QAA0B;IAE1B,OAAO,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAW,EACX,OAAqB,EACrB,IAAiB,EACjB,OAAiB;IAEjB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAM;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjB,OAAM;IACR,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE;QAAE,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AACtG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,OAAqB,EACrB,UAAoB;IAEpB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAA;AAC3F,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { Store } from "@tanstack/store";
2
+ import type { BaseRegistry, BaseRegistryEntry } from "./types";
3
+ import type { RegistryHandler } from "./registry.handlers";
4
+ export interface RegistryStoreOptions<T extends BaseRegistryEntry = BaseRegistryEntry> {
5
+ /** Absolute path to the manifest file. Used by load() and flush(). */
6
+ filePath?: string;
7
+ /** Default handler for serialization/deserialization. Defaults to tsHandler. */
8
+ handler?: RegistryHandler<T>;
9
+ }
10
+ /**
11
+ * The registry store instance — passed to mutations, selectors, and io helpers.
12
+ */
13
+ export interface RegistryStore<T extends BaseRegistryEntry = BaseRegistryEntry> {
14
+ /** The underlying TanStack Store. Subscribe, derive, or read .state directly. */
15
+ store: Store<BaseRegistry<T>>;
16
+ /** Absolute path this store is bound to (if any). */
17
+ filePath?: string;
18
+ /** Default handler for serialization/deserialization. */
19
+ handler?: RegistryHandler<T>;
20
+ }
21
+ /**
22
+ * Creates a RegistryStore backed by TanStack Store.
23
+ * State starts empty — call load() to hydrate from disk.
24
+ *
25
+ * @example
26
+ * const registry = createRegistryStore<MyEntry>({ filePath: "/abs/.g3nerate-manifest.ts" })
27
+ * await load(registry)
28
+ */
29
+ export declare function createRegistryStore<T extends BaseRegistryEntry = BaseRegistryEntry>(options?: RegistryStoreOptions<T>): RegistryStore<T>;
30
+ /**
31
+ * Sets the default handler on the store. Returns the store for chaining.
32
+ */
33
+ export declare function useHandler<T extends BaseRegistryEntry>(registry: RegistryStore<T>, handler: RegistryHandler<T>): RegistryStore<T>;
34
+ //# sourceMappingURL=registry.store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.store.d.ts","sourceRoot":"","sources":["../../src/registry/registry.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAM1D,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IACnF,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB;IAC5E,iFAAiF;IACjF,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;CAC7B;AAMD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,EACjF,OAAO,GAAE,oBAAoB,CAAC,CAAC,CAAM,GACpC,aAAa,CAAC,CAAC,CAAC,CAMlB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,iBAAiB,EACpD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,aAAa,CAAC,CAAC,CAAC,CAGlB"}