@datakable/core 1.0.0 → 1.1.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 (290) hide show
  1. package/README.md +4 -2
  2. package/dist/catalog/codes.cjs +12 -8
  3. package/dist/catalog/codes.cjs.map +1 -1
  4. package/dist/catalog/codes.js +12 -8
  5. package/dist/catalog/codes.js.map +1 -1
  6. package/dist/catalog/slots.cjs +10 -6
  7. package/dist/catalog/slots.cjs.map +1 -1
  8. package/dist/catalog/slots.js +10 -6
  9. package/dist/catalog/slots.js.map +1 -1
  10. package/dist/{codes-BKdS9EiO.d.cts → codes-B9bCK73-.d.cts} +46 -8
  11. package/dist/{codes-BKdS9EiO.d.ts → codes-B9bCK73-.d.ts} +46 -8
  12. package/dist/column/column-def.cjs.map +1 -1
  13. package/dist/column/get-value.cjs +6 -1
  14. package/dist/column/get-value.cjs.map +1 -1
  15. package/dist/column/get-value.js +6 -1
  16. package/dist/column/get-value.js.map +1 -1
  17. package/dist/column-filters.d.cts +2 -2
  18. package/dist/column-filters.d.ts +2 -2
  19. package/dist/diagnostics/build.cjs +10 -4
  20. package/dist/diagnostics/build.cjs.map +1 -1
  21. package/dist/diagnostics/build.js +8 -3
  22. package/dist/diagnostics/build.js.map +1 -1
  23. package/dist/diagnostics/catalog.cjs +11 -5
  24. package/dist/diagnostics/catalog.cjs.map +1 -1
  25. package/dist/diagnostics/catalog.js +10 -5
  26. package/dist/diagnostics/catalog.js.map +1 -1
  27. package/dist/diagnostics/codes.cjs +12 -8
  28. package/dist/diagnostics/codes.cjs.map +1 -1
  29. package/dist/diagnostics/codes.js +12 -8
  30. package/dist/diagnostics/codes.js.map +1 -1
  31. package/dist/diagnostics/console.cjs +13 -6
  32. package/dist/diagnostics/console.cjs.map +1 -1
  33. package/dist/diagnostics/console.js +13 -6
  34. package/dist/diagnostics/console.js.map +1 -1
  35. package/dist/diagnostics/env.cjs +1 -0
  36. package/dist/diagnostics/env.cjs.map +1 -1
  37. package/dist/diagnostics/env.js +1 -0
  38. package/dist/diagnostics/env.js.map +1 -1
  39. package/dist/diagnostics/explain-text.cjs +2 -1
  40. package/dist/diagnostics/explain-text.cjs.map +1 -1
  41. package/dist/diagnostics/explain-text.js +2 -1
  42. package/dist/diagnostics/explain-text.js.map +1 -1
  43. package/dist/diagnostics/explain.cjs +3 -2
  44. package/dist/diagnostics/explain.cjs.map +1 -1
  45. package/dist/diagnostics/explain.js +3 -2
  46. package/dist/diagnostics/explain.js.map +1 -1
  47. package/dist/diagnostics/hub.cjs +6 -5
  48. package/dist/diagnostics/hub.cjs.map +1 -1
  49. package/dist/diagnostics/hub.js +7 -6
  50. package/dist/diagnostics/hub.js.map +1 -1
  51. package/dist/diagnostics/process-guard.cjs +26 -0
  52. package/dist/diagnostics/process-guard.cjs.map +1 -0
  53. package/dist/diagnostics/process-guard.js +9 -0
  54. package/dist/diagnostics/process-guard.js.map +1 -0
  55. package/dist/diagnostics/prose.cjs +120 -0
  56. package/dist/diagnostics/prose.cjs.map +1 -0
  57. package/dist/diagnostics/prose.js +93 -0
  58. package/dist/diagnostics/prose.js.map +1 -0
  59. package/dist/diagnostics/redact.cjs +7 -4
  60. package/dist/diagnostics/redact.cjs.map +1 -1
  61. package/dist/diagnostics/redact.js +6 -4
  62. package/dist/diagnostics/redact.js.map +1 -1
  63. package/dist/diagnostics/trace-store.cjs +6 -0
  64. package/dist/diagnostics/trace-store.cjs.map +1 -1
  65. package/dist/diagnostics/trace-store.js +4 -0
  66. package/dist/diagnostics/trace-store.js.map +1 -1
  67. package/dist/diagnostics/tracer.cjs +74 -13
  68. package/dist/diagnostics/tracer.cjs.map +1 -1
  69. package/dist/diagnostics/tracer.js +75 -14
  70. package/dist/diagnostics/tracer.js.map +1 -1
  71. package/dist/diagnostics/types.cjs.map +1 -1
  72. package/dist/{explain-aagaYHcy.d.cts → explain-Q8Cg0cZy.d.cts} +13 -4
  73. package/dist/{explain-DcUZfFh5.d.ts → explain-i0OATi_W.d.ts} +13 -4
  74. package/dist/feature/codes.cjs +1 -0
  75. package/dist/feature/codes.cjs.map +1 -1
  76. package/dist/feature/codes.js +1 -0
  77. package/dist/feature/codes.js.map +1 -1
  78. package/dist/feature/define.cjs +3 -1
  79. package/dist/feature/define.cjs.map +1 -1
  80. package/dist/feature/define.js +3 -1
  81. package/dist/feature/define.js.map +1 -1
  82. package/dist/feature/install.cjs +4 -3
  83. package/dist/feature/install.cjs.map +1 -1
  84. package/dist/feature/install.js +4 -3
  85. package/dist/feature/install.js.map +1 -1
  86. package/dist/feature/runtime.cjs.map +1 -1
  87. package/dist/feature/runtime.js.map +1 -1
  88. package/dist/features/column-filters/codes.cjs +1 -0
  89. package/dist/features/column-filters/codes.cjs.map +1 -1
  90. package/dist/features/column-filters/codes.js +1 -0
  91. package/dist/features/column-filters/codes.js.map +1 -1
  92. package/dist/features/column-filters/column-filters.cjs +4 -2
  93. package/dist/features/column-filters/column-filters.cjs.map +1 -1
  94. package/dist/features/column-filters/column-filters.js +4 -2
  95. package/dist/features/column-filters/column-filters.js.map +1 -1
  96. package/dist/features/column-filters/match.cjs +5 -5
  97. package/dist/features/column-filters/match.cjs.map +1 -1
  98. package/dist/features/column-filters/match.js +5 -5
  99. package/dist/features/column-filters/match.js.map +1 -1
  100. package/dist/features/pagination/codes.cjs +6 -3
  101. package/dist/features/pagination/codes.cjs.map +1 -1
  102. package/dist/features/pagination/codes.js +6 -3
  103. package/dist/features/pagination/codes.js.map +1 -1
  104. package/dist/features/pagination/pagination.cjs +19 -14
  105. package/dist/features/pagination/pagination.cjs.map +1 -1
  106. package/dist/features/pagination/pagination.js +19 -14
  107. package/dist/features/pagination/pagination.js.map +1 -1
  108. package/dist/features/search/codes.cjs +1 -0
  109. package/dist/features/search/codes.cjs.map +1 -1
  110. package/dist/features/search/codes.js +1 -0
  111. package/dist/features/search/codes.js.map +1 -1
  112. package/dist/features/search/search-index.cjs +105 -48
  113. package/dist/features/search/search-index.cjs.map +1 -1
  114. package/dist/features/search/search-index.js +106 -49
  115. package/dist/features/search/search-index.js.map +1 -1
  116. package/dist/features/search/search.cjs +82 -24
  117. package/dist/features/search/search.cjs.map +1 -1
  118. package/dist/features/search/search.js +82 -24
  119. package/dist/features/search/search.js.map +1 -1
  120. package/dist/features/search/skipped-codes.cjs +45 -0
  121. package/dist/features/search/skipped-codes.cjs.map +1 -0
  122. package/dist/features/search/skipped-codes.js +20 -0
  123. package/dist/features/search/skipped-codes.js.map +1 -0
  124. package/dist/features/sorting/codes.cjs +1 -0
  125. package/dist/features/sorting/codes.cjs.map +1 -1
  126. package/dist/features/sorting/codes.js +1 -0
  127. package/dist/features/sorting/codes.js.map +1 -1
  128. package/dist/features/sorting/sorting.cjs +19 -23
  129. package/dist/features/sorting/sorting.cjs.map +1 -1
  130. package/dist/features/sorting/sorting.js +19 -23
  131. package/dist/features/sorting/sorting.js.map +1 -1
  132. package/dist/features/sorting/strategy.cjs +4 -4
  133. package/dist/features/sorting/strategy.cjs.map +1 -1
  134. package/dist/features/sorting/strategy.js +4 -4
  135. package/dist/features/sorting/strategy.js.map +1 -1
  136. package/dist/features/validity/codes.cjs +1 -0
  137. package/dist/features/validity/codes.cjs.map +1 -1
  138. package/dist/features/validity/codes.js +1 -0
  139. package/dist/features/validity/codes.js.map +1 -1
  140. package/dist/features/validity/validity.cjs +3 -3
  141. package/dist/features/validity/validity.cjs.map +1 -1
  142. package/dist/features/validity/validity.js +3 -3
  143. package/dist/features/validity/validity.js.map +1 -1
  144. package/dist/index.d.cts +16 -11
  145. package/dist/index.d.ts +16 -11
  146. package/dist/ingest/data-check-codes.cjs +4 -2
  147. package/dist/ingest/data-check-codes.cjs.map +1 -1
  148. package/dist/ingest/data-check-codes.js +4 -2
  149. package/dist/ingest/data-check-codes.js.map +1 -1
  150. package/dist/ingest/data-checks.cjs +1 -1
  151. package/dist/ingest/data-checks.cjs.map +1 -1
  152. package/dist/ingest/data-checks.js +1 -1
  153. package/dist/ingest/data-checks.js.map +1 -1
  154. package/dist/ingest/row-key-codes.cjs +1 -0
  155. package/dist/ingest/row-key-codes.cjs.map +1 -1
  156. package/dist/ingest/row-key-codes.js +1 -0
  157. package/dist/ingest/row-key-codes.js.map +1 -1
  158. package/dist/ingest/row-key.cjs +23 -20
  159. package/dist/ingest/row-key.cjs.map +1 -1
  160. package/dist/ingest/row-key.js +23 -20
  161. package/dist/ingest/row-key.js.map +1 -1
  162. package/dist/ingest/schema-codes.cjs +1 -0
  163. package/dist/ingest/schema-codes.cjs.map +1 -1
  164. package/dist/ingest/schema-codes.js +1 -0
  165. package/dist/ingest/schema-codes.js.map +1 -1
  166. package/dist/ingest/unique-fields.cjs +2 -2
  167. package/dist/ingest/unique-fields.cjs.map +1 -1
  168. package/dist/ingest/unique-fields.js +2 -2
  169. package/dist/ingest/unique-fields.js.map +1 -1
  170. package/dist/intercept/boundary.cjs +4 -2
  171. package/dist/intercept/boundary.cjs.map +1 -1
  172. package/dist/intercept/boundary.js +4 -2
  173. package/dist/intercept/boundary.js.map +1 -1
  174. package/dist/intercept/cell-batch.cjs +7 -4
  175. package/dist/intercept/cell-batch.cjs.map +1 -1
  176. package/dist/intercept/cell-batch.js +7 -4
  177. package/dist/intercept/cell-batch.js.map +1 -1
  178. package/dist/intercept/codes.cjs +1 -0
  179. package/dist/intercept/codes.cjs.map +1 -1
  180. package/dist/intercept/codes.js +1 -0
  181. package/dist/intercept/codes.js.map +1 -1
  182. package/dist/intercept/fallbacks.cjs +12 -20
  183. package/dist/intercept/fallbacks.cjs.map +1 -1
  184. package/dist/intercept/fallbacks.js +12 -20
  185. package/dist/intercept/fallbacks.js.map +1 -1
  186. package/dist/intercept/runtime.cjs +7 -9
  187. package/dist/intercept/runtime.cjs.map +1 -1
  188. package/dist/intercept/runtime.js +7 -9
  189. package/dist/intercept/runtime.js.map +1 -1
  190. package/dist/messages/index.cjs +4 -1
  191. package/dist/messages/index.cjs.map +1 -1
  192. package/dist/messages/index.js +4 -1
  193. package/dist/messages/index.js.map +1 -1
  194. package/dist/pagination.d.cts +2 -2
  195. package/dist/pagination.d.ts +2 -2
  196. package/dist/pipeline/codes.cjs +1 -0
  197. package/dist/pipeline/codes.cjs.map +1 -1
  198. package/dist/pipeline/codes.js +1 -0
  199. package/dist/pipeline/codes.js.map +1 -1
  200. package/dist/pipeline/column-cache.cjs +94 -76
  201. package/dist/pipeline/column-cache.cjs.map +1 -1
  202. package/dist/pipeline/column-cache.js +92 -75
  203. package/dist/pipeline/column-cache.js.map +1 -1
  204. package/dist/pipeline/dev-checks.cjs +1 -0
  205. package/dist/pipeline/dev-checks.cjs.map +1 -1
  206. package/dist/pipeline/dev-checks.js +1 -0
  207. package/dist/pipeline/dev-checks.js.map +1 -1
  208. package/dist/pipeline/env-codes.cjs +3 -2
  209. package/dist/pipeline/env-codes.cjs.map +1 -1
  210. package/dist/pipeline/env-codes.js +3 -2
  211. package/dist/pipeline/env-codes.js.map +1 -1
  212. package/dist/pipeline/perf-codes.cjs +1 -0
  213. package/dist/pipeline/perf-codes.cjs.map +1 -1
  214. package/dist/pipeline/perf-codes.js +1 -0
  215. package/dist/pipeline/perf-codes.js.map +1 -1
  216. package/dist/pipeline/row.cjs +8 -7
  217. package/dist/pipeline/row.cjs.map +1 -1
  218. package/dist/pipeline/row.js +8 -7
  219. package/dist/pipeline/row.js.map +1 -1
  220. package/dist/pipeline/runner.cjs +17 -9
  221. package/dist/pipeline/runner.cjs.map +1 -1
  222. package/dist/pipeline/runner.js +17 -9
  223. package/dist/pipeline/runner.js.map +1 -1
  224. package/dist/pipeline/slice.cjs +3 -1
  225. package/dist/pipeline/slice.cjs.map +1 -1
  226. package/dist/pipeline/slice.js +3 -1
  227. package/dist/pipeline/slice.js.map +1 -1
  228. package/dist/schema.d.cts +2 -2
  229. package/dist/schema.d.ts +2 -2
  230. package/dist/{search-async-entry-C3mXxLP8.d.cts → search-async-entry-CuLYPfY_.d.cts} +2 -2
  231. package/dist/{search-async-entry-BmQYT120.d.ts → search-async-entry-Cx7xpuVZ.d.ts} +2 -2
  232. package/dist/search-async.d.cts +3 -3
  233. package/dist/search-async.d.ts +3 -3
  234. package/dist/search.d.cts +8 -6
  235. package/dist/search.d.ts +8 -6
  236. package/dist/server.d.cts +3 -3
  237. package/dist/server.d.ts +3 -3
  238. package/dist/sorting.d.cts +6 -3
  239. package/dist/sorting.d.ts +6 -3
  240. package/dist/source/codes.cjs +1 -0
  241. package/dist/source/codes.cjs.map +1 -1
  242. package/dist/source/codes.js +1 -0
  243. package/dist/source/codes.js.map +1 -1
  244. package/dist/source/fetch-codes.cjs +1 -0
  245. package/dist/source/fetch-codes.cjs.map +1 -1
  246. package/dist/source/fetch-codes.js +1 -0
  247. package/dist/source/fetch-codes.js.map +1 -1
  248. package/dist/table/codes.cjs +1 -0
  249. package/dist/table/codes.cjs.map +1 -1
  250. package/dist/table/codes.js +1 -0
  251. package/dist/table/codes.js.map +1 -1
  252. package/dist/table/create-table.cjs +39 -9
  253. package/dist/table/create-table.cjs.map +1 -1
  254. package/dist/table/create-table.js +39 -9
  255. package/dist/table/create-table.js.map +1 -1
  256. package/dist/table/data-mutation.cjs +1 -0
  257. package/dist/table/data-mutation.cjs.map +1 -1
  258. package/dist/table/data-mutation.js +1 -0
  259. package/dist/table/data-mutation.js.map +1 -1
  260. package/dist/table/internals.cjs.map +1 -1
  261. package/dist/table/internals.js.map +1 -1
  262. package/dist/table/ssr-codes.cjs +1 -0
  263. package/dist/table/ssr-codes.cjs.map +1 -1
  264. package/dist/table/ssr-codes.js +1 -0
  265. package/dist/table/ssr-codes.js.map +1 -1
  266. package/dist/table/ssr.cjs +4 -1
  267. package/dist/table/ssr.cjs.map +1 -1
  268. package/dist/table/ssr.js +4 -1
  269. package/dist/table/ssr.js.map +1 -1
  270. package/dist/table/state-feedback.cjs +19 -0
  271. package/dist/table/state-feedback.cjs.map +1 -1
  272. package/dist/table/state-feedback.js +19 -0
  273. package/dist/table/state-feedback.js.map +1 -1
  274. package/dist/table/types.cjs.map +1 -1
  275. package/dist/table/types.js.map +1 -1
  276. package/dist/validity.d.cts +2 -2
  277. package/dist/validity.d.ts +2 -2
  278. package/dist/version.cjs +1 -1
  279. package/dist/version.cjs.map +1 -1
  280. package/dist/version.js +1 -1
  281. package/dist/version.js.map +1 -1
  282. package/dist/versioning/codes.cjs +18 -0
  283. package/dist/versioning/codes.cjs.map +1 -1
  284. package/dist/versioning/codes.js +18 -0
  285. package/dist/versioning/codes.js.map +1 -1
  286. package/dist/versioning/registry.cjs +4 -2
  287. package/dist/versioning/registry.cjs.map +1 -1
  288. package/dist/versioning/registry.js +4 -2
  289. package/dist/versioning/registry.js.map +1 -1
  290. package/package.json +39 -3
@@ -1,5 +1,6 @@
1
1
  // src/versioning/codes.ts
2
2
  import { defineDiagnostic } from "../diagnostics/catalog.js";
3
+ import "../diagnostics/process-guard.js";
3
4
  import { compareVersions, parseVersion } from "./semver.js";
4
5
  var FIXED_GROUP = ["@datakable/core", "@datakable/react", "datakable"];
5
6
  var OPTIONS = "options.";
@@ -29,6 +30,15 @@ var versioningMessages = {
29
30
  'or force one version: "pnpm": { "overrides": { "@datakable/core": "<version>" } } in package.json (npm "overrides", yarn "resolutions")'
30
31
  ]
31
32
  },
33
+ DK_DUPLICATE_CORE_SAME_VERSION: {
34
+ problem: (d) => `@datakable/core ${d.version} is loaded ${d.copies} times, all this version: its ESM and CJS builds, a bundler's layers (Next.js dev: RSC, SSR, route handlers), a hot reload, or two installs of it`,
35
+ impact: () => "tables work, each with its own copy; a DatakableError thrown by one copy is not an instanceof the classes of the other, and a browser bundle with both ships core twice",
36
+ fix: () => [
37
+ 'compare errors by their .code (e.g. err.code === "DK_INVALID_OPTION"), not instanceof',
38
+ "mixed import and require of @datakable/core in one Node process: use one of them",
39
+ "in a browser bundle, find the second install: pnpm why @datakable/core, then pnpm dedupe"
40
+ ]
41
+ },
32
42
  DK_VERSION_MISMATCH: {
33
43
  problem: (d) => `${d.package}@${d.version} is used with @datakable/core@${d.core}; these packages are released together and must have the same version`,
34
44
  impact: () => "it may work, but APIs and types between the two can disagree",
@@ -77,6 +87,14 @@ var versioningDiagnostics = [
77
87
  },
78
88
  process.env.NODE_ENV !== "production" && versioningMessages.DK_DUPLICATE_CORE
79
89
  ),
90
+ defineDiagnostic(
91
+ {
92
+ code: "DK_DUPLICATE_CORE_SAME_VERSION",
93
+ level: "info",
94
+ where: () => CREATE
95
+ },
96
+ process.env.NODE_ENV !== "production" && versioningMessages.DK_DUPLICATE_CORE_SAME_VERSION
97
+ ),
80
98
  defineDiagnostic(
81
99
  {
82
100
  code: "DK_VERSION_MISMATCH",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/versioning/codes.ts"],"sourcesContent":["import { type DiagnosticMessages, defineDiagnostic } from '../diagnostics/catalog'\nimport type { Location } from '../diagnostics/types'\nimport { compareVersions, parseVersion } from './semver'\n\ndeclare module '../diagnostics/catalog' {\n interface DiagnosticCatalog {\n DK_DEPRECATED: {\n /** `options.<path>` for an option, else the method, e.g. `table.setGlobalFilter`. */\n api: string\n since: string\n removeIn: string\n replacement: string\n codemod?: string\n }\n DK_DUPLICATE_CORE: {\n /** Versions of every registered core copy, in registration order (this copy last). */\n versions: string[]\n }\n DK_VERSION_MISMATCH: {\n /** The fixed-group package whose version differs, e.g. `@datakable/react`. */\n package: string\n version: string\n /** This core's version. */\n core: string\n }\n DK_DEP_INCOMPATIBLE: {\n /** The feature that uses the capability. */\n feature: string\n dependency: string\n capability: string\n /** The dependency range DataKable supports. */\n supported: string\n /** What is used instead. */\n fallback: string\n }\n DK_FEATURE_INCOMPATIBLE: {\n feature: string\n /** `requires.core` of the feature. */\n required: string\n core: string\n /** `true` when `required` is not a semver range. */\n invalid: boolean\n }\n }\n}\n\n/** The fixed release group (§12): always published with one version. */\nexport const FIXED_GROUP = ['@datakable/core', '@datakable/react', 'datakable'] as const\n\nconst OPTIONS = 'options.'\nconst CREATE: Location = { kind: 'operation', op: 'createTable' }\n\n/** The newer of two versions (unparseable ones lose). */\nconst newest = (a: string, b: string): string => {\n const pa = parseVersion(a)\n const pb = parseVersion(b)\n if (!pa) return b\n if (!pb) return a\n return compareVersions(pa, pb) < 0 ? b : a\n}\n\n/** Message text (§8.2): development builds, or production via `@datakable/core/messages`. */\nexport const versioningMessages: DiagnosticMessages<\n | 'DK_DEPRECATED'\n | 'DK_DUPLICATE_CORE'\n | 'DK_VERSION_MISMATCH'\n | 'DK_DEP_INCOMPATIBLE'\n | 'DK_FEATURE_INCOMPATIBLE'\n> = {\n DK_DEPRECATED: {\n problem: (d) => `${d.api} is deprecated since ${d.since}`,\n impact: (d) =>\n `it still works in this version and is removed in ${d.removeIn}; this warning is shown ` +\n 'once per session',\n fix: (d) => [\n `use ${d.replacement} instead`,\n ...(d.codemod ? [`run the codemod: ${d.codemod}`] : []),\n ],\n },\n DK_DUPLICATE_CORE: {\n problem: (d) =>\n `${d.versions.length} copies of @datakable/core are loaded (${d.versions.join(', ')}); ` +\n 'features, interceptors and types from one copy do not match the other',\n impact: () =>\n 'each table works with its own copy, but plugins built against the other copy may be ' +\n 'ignored or fail instanceof / registry checks, and the bundle ships core twice',\n fix: () => [\n 'find who pulls the second copy: pnpm why @datakable/core (npm ls @datakable/core / yarn why)',\n 'dedupe it: pnpm dedupe (npm dedupe), and align @datakable/react and datakable to one version',\n 'or force one version: \"pnpm\": { \"overrides\": { \"@datakable/core\": \"<version>\" } } in ' +\n 'package.json (npm \"overrides\", yarn \"resolutions\")',\n ],\n },\n DK_VERSION_MISMATCH: {\n problem: (d) =>\n `${d.package}@${d.version} is used with @datakable/core@${d.core}; ` +\n 'these packages are released together and must have the same version',\n impact: () => 'it may work, but APIs and types between the two can disagree',\n fix: (d) => {\n const v = newest(d.version, d.core)\n return [\n `pnpm add ${FIXED_GROUP.map((p) => `${p}@${v}`).join(' ')} (install only the ones you use)`,\n `or with npm: npm install ${FIXED_GROUP.map((p) => `${p}@${v}`).join(' ')}`,\n ]\n },\n },\n DK_DEP_INCOMPATIBLE: {\n problem: (d) =>\n `${d.dependency} has no usable ${d.capability}; it was probably overridden to a version ` +\n `outside ${d.supported}`,\n impact: (d) => `feature \"${d.feature}\" uses ${d.fallback} instead; results stay correct`,\n fix: (d) => [\n `install a supported version: pnpm add ${d.dependency}@\"${d.supported}\" (check pnpm why ${d.dependency})`,\n `remove the override / resolution of ${d.dependency} from package.json`,\n ],\n },\n DK_FEATURE_INCOMPATIBLE: {\n problem: (d) =>\n d.invalid\n ? `feature \"${d.feature}\" declares requires.core \"${d.required}\", which is not a semver range`\n : `feature \"${d.feature}\" requires @datakable/core ${d.required}, but this is ${d.core}`,\n impact: () => 'the table was not created',\n fix: (d) =>\n d.invalid\n ? [\n `the feature author must set requires: { core: '^1.0' } (a semver range such as ` +\n `'^1.0', '>=1.2 <2' or '1.x')`,\n `meanwhile, remove feature \"${d.feature}\" from options.features`,\n ]\n : [\n `upgrade core: pnpm add @datakable/core@\"${d.required}\" (and @datakable/react / ` +\n 'datakable to the same version)',\n `or use a version of feature \"${d.feature}\" that supports @datakable/core ${d.core}`,\n ],\n },\n}\n\n/** Codes owned by versioning (§8.5). */\nexport const versioningDiagnostics = [\n defineDiagnostic(\n {\n code: 'DK_DEPRECATED',\n level: 'warn',\n where: (d) =>\n d.api.startsWith(OPTIONS)\n ? { kind: 'option', path: d.api.slice(OPTIONS.length) }\n : { kind: 'operation', op: d.api },\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DEPRECATED,\n ),\n defineDiagnostic(\n {\n code: 'DK_DUPLICATE_CORE',\n level: 'error',\n where: () => CREATE,\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DUPLICATE_CORE,\n ),\n defineDiagnostic(\n {\n code: 'DK_VERSION_MISMATCH',\n level: 'warn',\n where: () => CREATE,\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_VERSION_MISMATCH,\n ),\n defineDiagnostic(\n {\n code: 'DK_DEP_INCOMPATIBLE',\n level: 'warn',\n where: (d) => ({ kind: 'feature', name: d.feature }),\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DEP_INCOMPATIBLE,\n ),\n defineDiagnostic(\n {\n code: 'DK_FEATURE_INCOMPATIBLE',\n level: 'error',\n config: true,\n where: (d) => ({ kind: 'feature', name: d.feature }),\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_FEATURE_INCOMPATIBLE,\n ),\n]\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/versioning/codes.ts"],"sourcesContent":["import { type DiagnosticMessages, defineDiagnostic } from '../diagnostics/catalog'\nimport '../diagnostics/process-guard'\nimport type { Location } from '../diagnostics/types'\nimport { compareVersions, parseVersion } from './semver'\n\ndeclare module '../diagnostics/catalog' {\n interface DiagnosticCatalog {\n DK_DEPRECATED: {\n /** `options.<path>` for an option, else the method, e.g. `table.setGlobalFilter`. */\n api: string\n since: string\n removeIn: string\n replacement: string\n codemod?: string\n }\n DK_DUPLICATE_CORE: {\n /** Versions of every registered core copy, in registration order (this copy last). */\n versions: string[]\n }\n DK_DUPLICATE_CORE_SAME_VERSION: {\n version: string\n /** Copies of core registered so far (this copy included), all of `version`. */\n copies: number\n }\n DK_VERSION_MISMATCH: {\n /** The fixed-group package whose version differs, e.g. `@datakable/react`. */\n package: string\n version: string\n /** This core's version. */\n core: string\n }\n DK_DEP_INCOMPATIBLE: {\n /** The feature that uses the capability. */\n feature: string\n dependency: string\n capability: string\n /** The dependency range DataKable supports. */\n supported: string\n /** What is used instead. */\n fallback: string\n }\n DK_FEATURE_INCOMPATIBLE: {\n feature: string\n /** `requires.core` of the feature. */\n required: string\n core: string\n /** `true` when `required` is not a semver range. */\n invalid: boolean\n }\n }\n}\n\n/** The fixed release group (§12): always published with one version. */\nexport const FIXED_GROUP = ['@datakable/core', '@datakable/react', 'datakable'] as const\n\nconst OPTIONS = 'options.'\nconst CREATE: Location = { kind: 'operation', op: 'createTable' }\n\n/** The newer of two versions (unparseable ones lose). */\nconst newest = (a: string, b: string): string => {\n const pa = parseVersion(a)\n const pb = parseVersion(b)\n if (!pa) return b\n if (!pb) return a\n return compareVersions(pa, pb) < 0 ? b : a\n}\n\n/** Message text (§8.2): development builds, or production via `@datakable/core/messages`. */\nexport const versioningMessages: DiagnosticMessages<\n | 'DK_DEPRECATED'\n | 'DK_DUPLICATE_CORE'\n | 'DK_DUPLICATE_CORE_SAME_VERSION'\n | 'DK_VERSION_MISMATCH'\n | 'DK_DEP_INCOMPATIBLE'\n | 'DK_FEATURE_INCOMPATIBLE'\n> = {\n DK_DEPRECATED: {\n problem: (d) => `${d.api} is deprecated since ${d.since}`,\n impact: (d) =>\n `it still works in this version and is removed in ${d.removeIn}; this warning is shown ` +\n 'once per session',\n fix: (d) => [\n `use ${d.replacement} instead`,\n ...(d.codemod ? [`run the codemod: ${d.codemod}`] : []),\n ],\n },\n DK_DUPLICATE_CORE: {\n problem: (d) =>\n `${d.versions.length} copies of @datakable/core are loaded (${d.versions.join(', ')}); ` +\n 'features, interceptors and types from one copy do not match the other',\n impact: () =>\n 'each table works with its own copy, but plugins built against the other copy may be ' +\n 'ignored or fail instanceof / registry checks, and the bundle ships core twice',\n fix: () => [\n 'find who pulls the second copy: pnpm why @datakable/core (npm ls @datakable/core / yarn why)',\n 'dedupe it: pnpm dedupe (npm dedupe), and align @datakable/react and datakable to one version',\n 'or force one version: \"pnpm\": { \"overrides\": { \"@datakable/core\": \"<version>\" } } in ' +\n 'package.json (npm \"overrides\", yarn \"resolutions\")',\n ],\n },\n DK_DUPLICATE_CORE_SAME_VERSION: {\n problem: (d) =>\n `@datakable/core ${d.version} is loaded ${d.copies} times, all this version: its ESM and ` +\n \"CJS builds, a bundler's layers (Next.js dev: RSC, SSR, route handlers), a hot reload, or \" +\n 'two installs of it',\n impact: () =>\n 'tables work, each with its own copy; a DatakableError thrown by one copy is not an ' +\n 'instanceof the classes of the other, and a browser bundle with both ships core twice',\n fix: () => [\n 'compare errors by their .code (e.g. err.code === \"DK_INVALID_OPTION\"), not instanceof',\n 'mixed import and require of @datakable/core in one Node process: use one of them',\n 'in a browser bundle, find the second install: pnpm why @datakable/core, then pnpm dedupe',\n ],\n },\n DK_VERSION_MISMATCH: {\n problem: (d) =>\n `${d.package}@${d.version} is used with @datakable/core@${d.core}; ` +\n 'these packages are released together and must have the same version',\n impact: () => 'it may work, but APIs and types between the two can disagree',\n fix: (d) => {\n const v = newest(d.version, d.core)\n return [\n `pnpm add ${FIXED_GROUP.map((p) => `${p}@${v}`).join(' ')} (install only the ones you use)`,\n `or with npm: npm install ${FIXED_GROUP.map((p) => `${p}@${v}`).join(' ')}`,\n ]\n },\n },\n DK_DEP_INCOMPATIBLE: {\n problem: (d) =>\n `${d.dependency} has no usable ${d.capability}; it was probably overridden to a version ` +\n `outside ${d.supported}`,\n impact: (d) => `feature \"${d.feature}\" uses ${d.fallback} instead; results stay correct`,\n fix: (d) => [\n `install a supported version: pnpm add ${d.dependency}@\"${d.supported}\" (check pnpm why ${d.dependency})`,\n `remove the override / resolution of ${d.dependency} from package.json`,\n ],\n },\n DK_FEATURE_INCOMPATIBLE: {\n problem: (d) =>\n d.invalid\n ? `feature \"${d.feature}\" declares requires.core \"${d.required}\", which is not a semver range`\n : `feature \"${d.feature}\" requires @datakable/core ${d.required}, but this is ${d.core}`,\n impact: () => 'the table was not created',\n fix: (d) =>\n d.invalid\n ? [\n `the feature author must set requires: { core: '^1.0' } (a semver range such as ` +\n `'^1.0', '>=1.2 <2' or '1.x')`,\n `meanwhile, remove feature \"${d.feature}\" from options.features`,\n ]\n : [\n `upgrade core: pnpm add @datakable/core@\"${d.required}\" (and @datakable/react / ` +\n 'datakable to the same version)',\n `or use a version of feature \"${d.feature}\" that supports @datakable/core ${d.core}`,\n ],\n },\n}\n\n/** Codes owned by versioning (§8.5). */\nexport const versioningDiagnostics = [\n defineDiagnostic(\n {\n code: 'DK_DEPRECATED',\n level: 'warn',\n where: (d) =>\n d.api.startsWith(OPTIONS)\n ? { kind: 'option', path: d.api.slice(OPTIONS.length) }\n : { kind: 'operation', op: d.api },\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DEPRECATED,\n ),\n defineDiagnostic(\n {\n code: 'DK_DUPLICATE_CORE',\n level: 'error',\n where: () => CREATE,\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DUPLICATE_CORE,\n ),\n defineDiagnostic(\n {\n code: 'DK_DUPLICATE_CORE_SAME_VERSION',\n level: 'info',\n where: () => CREATE,\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DUPLICATE_CORE_SAME_VERSION,\n ),\n defineDiagnostic(\n {\n code: 'DK_VERSION_MISMATCH',\n level: 'warn',\n where: () => CREATE,\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_VERSION_MISMATCH,\n ),\n defineDiagnostic(\n {\n code: 'DK_DEP_INCOMPATIBLE',\n level: 'warn',\n where: (d) => ({ kind: 'feature', name: d.feature }),\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_DEP_INCOMPATIBLE,\n ),\n defineDiagnostic(\n {\n code: 'DK_FEATURE_INCOMPATIBLE',\n level: 'error',\n config: true,\n where: (d) => ({ kind: 'feature', name: d.feature }),\n },\n (process.env.NODE_ENV !== \"production\") && versioningMessages.DK_FEATURE_INCOMPATIBLE,\n ),\n]\n"],"mappings":"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","names":[]}
@@ -81,8 +81,10 @@ function checkVersions(features, emit, table) {
81
81
  const reg = getVersionRegistry();
82
82
  if (!reg.cores.includes(self)) {
83
83
  reg.cores.push(self);
84
- if (reg.cores.length > 1) {
85
- emit("DK_DUPLICATE_CORE", { versions: reg.cores.map((c) => String(c?.version)) });
84
+ const versions = reg.cores.map((c) => String(c?.version));
85
+ if (versions.some((v) => v !== import_version.VERSION)) emit("DK_DUPLICATE_CORE", { versions });
86
+ else if (versions.length > 1 && firstInSession("DK_DUPLICATE_CORE_SAME_VERSION")) {
87
+ emit("DK_DUPLICATE_CORE_SAME_VERSION", { version: import_version.VERSION, copies: versions.length });
86
88
  }
87
89
  }
88
90
  for (const name of import_codes.FIXED_GROUP) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/versioning/registry.ts"],"sourcesContent":["import { throwConfigError } from '../diagnostics/build'\nimport { keepDiagnostics } from '../diagnostics/catalog'\nimport type { Emit } from '../diagnostics/types'\nimport type { AnyFeature } from '../feature/types'\nimport { VERSION } from '../version'\nimport { FIXED_GROUP, versioningDiagnostics } from './codes'\nimport { satisfies } from './semver'\n\nkeepDiagnostics(versioningDiagnostics)\n\n/** `globalThis[Symbol.for('datakable')]`: shared by every copy of core in the process (§8.5). */\nexport const REGISTRY_KEY: unique symbol = Symbol.for('datakable') as never\n\ninterface CoreEntry {\n readonly version: string\n}\n\n/** Version 1 of the registry shape. Later cores must keep these fields readable. */\nexport interface VersionRegistry {\n v: number\n /** One entry per core copy that created a table, in registration order. */\n cores: CoreEntry[]\n /** Fixed-group package → version (`registerPackage`). */\n packages: Record<string, string>\n /** Once-per-session keys (deprecations, dependency capabilities). */\n reported: Set<string>\n}\n\n/** This copy of core; its identity tells copies apart even when their versions are equal. */\nconst self: CoreEntry = { version: VERSION }\n/** `package@version` pairs this copy already reported as mismatched. */\nconst mismatched = new Set<string>()\nlet local: VersionRegistry | undefined\n\nconst isObject = (v: unknown): v is Record<string, unknown> => v !== null && typeof v === 'object'\n\n/**\n * The global registry, created on first use. Fields are read defensively: a registry left by\n * another core version (or anything else under the symbol) is repaired, never trusted to throw.\n */\nexport function getVersionRegistry(): VersionRegistry {\n const g = globalThis as unknown as Record<symbol, unknown>\n try {\n let r = g[REGISTRY_KEY]\n if (!isObject(r)) {\n r = {}\n g[REGISTRY_KEY] = r\n }\n const reg = r as Partial<VersionRegistry>\n if (typeof reg.v !== 'number') reg.v = 1\n if (!Array.isArray(reg.cores)) reg.cores = []\n if (!isObject(reg.packages)) reg.packages = {}\n if (!(reg.reported instanceof Set)) reg.reported = new Set()\n return reg as VersionRegistry\n } catch {\n // Frozen / non-writable global: fall back to a per-copy registry (no cross-copy detection).\n local ??= { v: 1, cores: [], packages: {}, reported: new Set() }\n return local\n }\n}\n\n/**\n * Records a fixed-group package's version (`@datakable/react`, `datakable`) so `createTable` can\n * report `DK_VERSION_MISMATCH`. Called once by each binding when it is first used.\n */\nexport function registerPackage(name: string, version: string): void {\n getVersionRegistry().packages[name] = version\n}\n\n/** `true` the first time `key` is seen in this session (across core copies). */\nexport function firstInSession(key: string): boolean {\n const reported = getVersionRegistry().reported\n if (reported.has(key)) return false\n reported.add(key)\n return true\n}\n\n/**\n * Version checks of one `createTable` (§8.5), cold path:\n * - feature `requires.core` against this core → `DatakableConfigError` `DK_FEATURE_INCOMPATIBLE`;\n * - registers this copy on its first table; a copy finding another one → `DK_DUPLICATE_CORE` (once);\n * - fixed-group packages with another version → `DK_VERSION_MISMATCH` (once per package version).\n */\nexport function checkVersions(features: readonly AnyFeature[], emit: Emit, table: string): void {\n for (const f of features) {\n const required = f.requires?.core\n if (required === undefined) continue\n const ok = typeof required === 'string' ? satisfies(VERSION, required) : undefined\n if (ok === true) continue\n throwConfigError(\n 'DK_FEATURE_INCOMPATIBLE',\n { feature: f.name, required: String(required), core: VERSION, invalid: ok === undefined },\n { table },\n )\n }\n const reg = getVersionRegistry()\n if (!reg.cores.includes(self)) {\n reg.cores.push(self)\n if (reg.cores.length > 1) {\n emit('DK_DUPLICATE_CORE', { versions: reg.cores.map((c) => String(c?.version)) })\n }\n }\n for (const name of FIXED_GROUP) {\n const version = reg.packages[name]\n if (typeof version !== 'string' || version === VERSION) continue\n const key = `${name}@${version}`\n if (mismatched.has(key)) continue\n mismatched.add(key)\n emit('DK_VERSION_MISMATCH', { package: name, version, core: VERSION })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAiC;AACjC,qBAAgC;AAGhC,qBAAwB;AACxB,mBAAmD;AACnD,oBAA0B;AAAA,IAE1B,gCAAgB,kCAAqB;AAG9B,IAAM,eAA8B,uBAAO,IAAI,WAAW;AAkBjE,IAAM,OAAkB,EAAE,SAAS,uBAAQ;AAE3C,IAAM,aAAa,oBAAI,IAAY;AACnC,IAAI;AAEJ,IAAM,WAAW,CAAC,MAA6C,MAAM,QAAQ,OAAO,MAAM;AAMnF,SAAS,qBAAsC;AACpD,QAAM,IAAI;AACV,MAAI;AACF,QAAI,IAAI,EAAE,YAAY;AACtB,QAAI,CAAC,SAAS,CAAC,GAAG;AAChB,UAAI,CAAC;AACL,QAAE,YAAY,IAAI;AAAA,IACpB;AACA,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,MAAM,SAAU,KAAI,IAAI;AACvC,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,KAAI,QAAQ,CAAC;AAC5C,QAAI,CAAC,SAAS,IAAI,QAAQ,EAAG,KAAI,WAAW,CAAC;AAC7C,QAAI,EAAE,IAAI,oBAAoB,KAAM,KAAI,WAAW,oBAAI,IAAI;AAC3D,WAAO;AAAA,EACT,QAAQ;AAEN,cAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,oBAAI,IAAI,EAAE;AAC/D,WAAO;AAAA,EACT;AACF;AAMO,SAAS,gBAAgB,MAAc,SAAuB;AACnE,qBAAmB,EAAE,SAAS,IAAI,IAAI;AACxC;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,WAAW,mBAAmB,EAAE;AACtC,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,WAAS,IAAI,GAAG;AAChB,SAAO;AACT;AAQO,SAAS,cAAc,UAAiC,MAAY,OAAqB;AAC9F,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,EAAE,UAAU;AAC7B,QAAI,aAAa,OAAW;AAC5B,UAAM,KAAK,OAAO,aAAa,eAAW,yBAAU,wBAAS,QAAQ,IAAI;AACzE,QAAI,OAAO,KAAM;AACjB;AAAA,MACE;AAAA,MACA,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,GAAG,MAAM,wBAAS,SAAS,OAAO,OAAU;AAAA,MACxF,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM,mBAAmB;AAC/B,MAAI,CAAC,IAAI,MAAM,SAAS,IAAI,GAAG;AAC7B,QAAI,MAAM,KAAK,IAAI;AACnB,QAAI,IAAI,MAAM,SAAS,GAAG;AACxB,WAAK,qBAAqB,EAAE,UAAU,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IAClF;AAAA,EACF;AACA,aAAW,QAAQ,0BAAa;AAC9B,UAAM,UAAU,IAAI,SAAS,IAAI;AACjC,QAAI,OAAO,YAAY,YAAY,YAAY,uBAAS;AACxD,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,WAAW,IAAI,GAAG,EAAG;AACzB,eAAW,IAAI,GAAG;AAClB,SAAK,uBAAuB,EAAE,SAAS,MAAM,SAAS,MAAM,uBAAQ,CAAC;AAAA,EACvE;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/versioning/registry.ts"],"sourcesContent":["import { throwConfigError } from '../diagnostics/build'\nimport { keepDiagnostics } from '../diagnostics/catalog'\nimport type { Emit } from '../diagnostics/types'\nimport type { AnyFeature } from '../feature/types'\nimport { VERSION } from '../version'\nimport { FIXED_GROUP, versioningDiagnostics } from './codes'\nimport { satisfies } from './semver'\n\nkeepDiagnostics(versioningDiagnostics)\n\n/** `globalThis[Symbol.for('datakable')]`: shared by every copy of core in the process (§8.5). */\nexport const REGISTRY_KEY: unique symbol = Symbol.for('datakable') as never\n\ninterface CoreEntry {\n readonly version: string\n}\n\n/** Version 1 of the registry shape. Later cores must keep these fields readable. */\nexport interface VersionRegistry {\n v: number\n /** One entry per core copy that created a table, in registration order. */\n cores: CoreEntry[]\n /** Fixed-group package → version (`registerPackage`). */\n packages: Record<string, string>\n /** Once-per-session keys (deprecations, dependency capabilities). */\n reported: Set<string>\n}\n\n/** This copy of core; its identity tells copies apart even when their versions are equal. */\nconst self: CoreEntry = { version: VERSION }\n/** `package@version` pairs this copy already reported as mismatched. */\nconst mismatched = new Set<string>()\nlet local: VersionRegistry | undefined\n\nconst isObject = (v: unknown): v is Record<string, unknown> => v !== null && typeof v === 'object'\n\n/**\n * The global registry, created on first use. Fields are read defensively: a registry left by\n * another core version (or anything else under the symbol) is repaired, never trusted to throw.\n */\nexport function getVersionRegistry(): VersionRegistry {\n const g = globalThis as unknown as Record<symbol, unknown>\n try {\n let r = g[REGISTRY_KEY]\n if (!isObject(r)) {\n r = {}\n g[REGISTRY_KEY] = r\n }\n const reg = r as Partial<VersionRegistry>\n if (typeof reg.v !== 'number') reg.v = 1\n if (!Array.isArray(reg.cores)) reg.cores = []\n if (!isObject(reg.packages)) reg.packages = {}\n if (!(reg.reported instanceof Set)) reg.reported = new Set()\n return reg as VersionRegistry\n } catch {\n // Frozen / non-writable global: fall back to a per-copy registry (no cross-copy detection).\n local ??= { v: 1, cores: [], packages: {}, reported: new Set() }\n return local\n }\n}\n\n/**\n * Records a fixed-group package's version (`@datakable/react`, `datakable`) so `createTable` can\n * report `DK_VERSION_MISMATCH`. Called once by each binding when it is first used.\n */\nexport function registerPackage(name: string, version: string): void {\n getVersionRegistry().packages[name] = version\n}\n\n/** `true` the first time `key` is seen in this session (across core copies). */\nexport function firstInSession(key: string): boolean {\n const reported = getVersionRegistry().reported\n if (reported.has(key)) return false\n reported.add(key)\n return true\n}\n\n/**\n * Version checks of one `createTable` (§8.5), cold path:\n * - feature `requires.core` against this core → `DatakableConfigError` `DK_FEATURE_INCOMPATIBLE`;\n * - registers this copy on its first table; a copy finding one of another version →\n * `DK_DUPLICATE_CORE` (once per copy), only copies of its own version →\n * `DK_DUPLICATE_CORE_SAME_VERSION` (info, once per session);\n * - fixed-group packages with another version → `DK_VERSION_MISMATCH` (once per package version).\n */\nexport function checkVersions(features: readonly AnyFeature[], emit: Emit, table: string): void {\n for (const f of features) {\n const required = f.requires?.core\n if (required === undefined) continue\n const ok = typeof required === 'string' ? satisfies(VERSION, required) : undefined\n if (ok === true) continue\n throwConfigError(\n 'DK_FEATURE_INCOMPATIBLE',\n { feature: f.name, required: String(required), core: VERSION, invalid: ok === undefined },\n { table },\n )\n }\n const reg = getVersionRegistry()\n if (!reg.cores.includes(self)) {\n reg.cores.push(self)\n const versions = reg.cores.map((c) => String(c?.version))\n // One version evaluated again (ESM + CJS builds, bundler layers, HMR) is not a second install\n // (#14): an info, once per session, that strict never throws.\n if (versions.some((v) => v !== VERSION)) emit('DK_DUPLICATE_CORE', { versions })\n else if (versions.length > 1 && firstInSession('DK_DUPLICATE_CORE_SAME_VERSION')) {\n emit('DK_DUPLICATE_CORE_SAME_VERSION', { version: VERSION, copies: versions.length })\n }\n }\n for (const name of FIXED_GROUP) {\n const version = reg.packages[name]\n if (typeof version !== 'string' || version === VERSION) continue\n const key = `${name}@${version}`\n if (mismatched.has(key)) continue\n mismatched.add(key)\n emit('DK_VERSION_MISMATCH', { package: name, version, core: VERSION })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAiC;AACjC,qBAAgC;AAGhC,qBAAwB;AACxB,mBAAmD;AACnD,oBAA0B;AAAA,IAE1B,gCAAgB,kCAAqB;AAG9B,IAAM,eAA8B,uBAAO,IAAI,WAAW;AAkBjE,IAAM,OAAkB,EAAE,SAAS,uBAAQ;AAE3C,IAAM,aAAa,oBAAI,IAAY;AACnC,IAAI;AAEJ,IAAM,WAAW,CAAC,MAA6C,MAAM,QAAQ,OAAO,MAAM;AAMnF,SAAS,qBAAsC;AACpD,QAAM,IAAI;AACV,MAAI;AACF,QAAI,IAAI,EAAE,YAAY;AACtB,QAAI,CAAC,SAAS,CAAC,GAAG;AAChB,UAAI,CAAC;AACL,QAAE,YAAY,IAAI;AAAA,IACpB;AACA,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,MAAM,SAAU,KAAI,IAAI;AACvC,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,KAAI,QAAQ,CAAC;AAC5C,QAAI,CAAC,SAAS,IAAI,QAAQ,EAAG,KAAI,WAAW,CAAC;AAC7C,QAAI,EAAE,IAAI,oBAAoB,KAAM,KAAI,WAAW,oBAAI,IAAI;AAC3D,WAAO;AAAA,EACT,QAAQ;AAEN,cAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,oBAAI,IAAI,EAAE;AAC/D,WAAO;AAAA,EACT;AACF;AAMO,SAAS,gBAAgB,MAAc,SAAuB;AACnE,qBAAmB,EAAE,SAAS,IAAI,IAAI;AACxC;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,WAAW,mBAAmB,EAAE;AACtC,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,WAAS,IAAI,GAAG;AAChB,SAAO;AACT;AAUO,SAAS,cAAc,UAAiC,MAAY,OAAqB;AAC9F,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,EAAE,UAAU;AAC7B,QAAI,aAAa,OAAW;AAC5B,UAAM,KAAK,OAAO,aAAa,eAAW,yBAAU,wBAAS,QAAQ,IAAI;AACzE,QAAI,OAAO,KAAM;AACjB;AAAA,MACE;AAAA,MACA,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,GAAG,MAAM,wBAAS,SAAS,OAAO,OAAU;AAAA,MACxF,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM,mBAAmB;AAC/B,MAAI,CAAC,IAAI,MAAM,SAAS,IAAI,GAAG;AAC7B,QAAI,MAAM,KAAK,IAAI;AACnB,UAAM,WAAW,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAGxD,QAAI,SAAS,KAAK,CAAC,MAAM,MAAM,sBAAO,EAAG,MAAK,qBAAqB,EAAE,SAAS,CAAC;AAAA,aACtE,SAAS,SAAS,KAAK,eAAe,gCAAgC,GAAG;AAChF,WAAK,kCAAkC,EAAE,SAAS,wBAAS,QAAQ,SAAS,OAAO,CAAC;AAAA,IACtF;AAAA,EACF;AACA,aAAW,QAAQ,0BAAa;AAC9B,UAAM,UAAU,IAAI,SAAS,IAAI;AACjC,QAAI,OAAO,YAAY,YAAY,YAAY,uBAAS;AACxD,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,WAAW,IAAI,GAAG,EAAG;AACzB,eAAW,IAAI,GAAG;AAClB,SAAK,uBAAuB,EAAE,SAAS,MAAM,SAAS,MAAM,uBAAQ,CAAC;AAAA,EACvE;AACF;","names":[]}
@@ -53,8 +53,10 @@ function checkVersions(features, emit, table) {
53
53
  const reg = getVersionRegistry();
54
54
  if (!reg.cores.includes(self)) {
55
55
  reg.cores.push(self);
56
- if (reg.cores.length > 1) {
57
- emit("DK_DUPLICATE_CORE", { versions: reg.cores.map((c) => String(c?.version)) });
56
+ const versions = reg.cores.map((c) => String(c?.version));
57
+ if (versions.some((v) => v !== VERSION)) emit("DK_DUPLICATE_CORE", { versions });
58
+ else if (versions.length > 1 && firstInSession("DK_DUPLICATE_CORE_SAME_VERSION")) {
59
+ emit("DK_DUPLICATE_CORE_SAME_VERSION", { version: VERSION, copies: versions.length });
58
60
  }
59
61
  }
60
62
  for (const name of FIXED_GROUP) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/versioning/registry.ts"],"sourcesContent":["import { throwConfigError } from '../diagnostics/build'\nimport { keepDiagnostics } from '../diagnostics/catalog'\nimport type { Emit } from '../diagnostics/types'\nimport type { AnyFeature } from '../feature/types'\nimport { VERSION } from '../version'\nimport { FIXED_GROUP, versioningDiagnostics } from './codes'\nimport { satisfies } from './semver'\n\nkeepDiagnostics(versioningDiagnostics)\n\n/** `globalThis[Symbol.for('datakable')]`: shared by every copy of core in the process (§8.5). */\nexport const REGISTRY_KEY: unique symbol = Symbol.for('datakable') as never\n\ninterface CoreEntry {\n readonly version: string\n}\n\n/** Version 1 of the registry shape. Later cores must keep these fields readable. */\nexport interface VersionRegistry {\n v: number\n /** One entry per core copy that created a table, in registration order. */\n cores: CoreEntry[]\n /** Fixed-group package → version (`registerPackage`). */\n packages: Record<string, string>\n /** Once-per-session keys (deprecations, dependency capabilities). */\n reported: Set<string>\n}\n\n/** This copy of core; its identity tells copies apart even when their versions are equal. */\nconst self: CoreEntry = { version: VERSION }\n/** `package@version` pairs this copy already reported as mismatched. */\nconst mismatched = new Set<string>()\nlet local: VersionRegistry | undefined\n\nconst isObject = (v: unknown): v is Record<string, unknown> => v !== null && typeof v === 'object'\n\n/**\n * The global registry, created on first use. Fields are read defensively: a registry left by\n * another core version (or anything else under the symbol) is repaired, never trusted to throw.\n */\nexport function getVersionRegistry(): VersionRegistry {\n const g = globalThis as unknown as Record<symbol, unknown>\n try {\n let r = g[REGISTRY_KEY]\n if (!isObject(r)) {\n r = {}\n g[REGISTRY_KEY] = r\n }\n const reg = r as Partial<VersionRegistry>\n if (typeof reg.v !== 'number') reg.v = 1\n if (!Array.isArray(reg.cores)) reg.cores = []\n if (!isObject(reg.packages)) reg.packages = {}\n if (!(reg.reported instanceof Set)) reg.reported = new Set()\n return reg as VersionRegistry\n } catch {\n // Frozen / non-writable global: fall back to a per-copy registry (no cross-copy detection).\n local ??= { v: 1, cores: [], packages: {}, reported: new Set() }\n return local\n }\n}\n\n/**\n * Records a fixed-group package's version (`@datakable/react`, `datakable`) so `createTable` can\n * report `DK_VERSION_MISMATCH`. Called once by each binding when it is first used.\n */\nexport function registerPackage(name: string, version: string): void {\n getVersionRegistry().packages[name] = version\n}\n\n/** `true` the first time `key` is seen in this session (across core copies). */\nexport function firstInSession(key: string): boolean {\n const reported = getVersionRegistry().reported\n if (reported.has(key)) return false\n reported.add(key)\n return true\n}\n\n/**\n * Version checks of one `createTable` (§8.5), cold path:\n * - feature `requires.core` against this core → `DatakableConfigError` `DK_FEATURE_INCOMPATIBLE`;\n * - registers this copy on its first table; a copy finding another one → `DK_DUPLICATE_CORE` (once);\n * - fixed-group packages with another version → `DK_VERSION_MISMATCH` (once per package version).\n */\nexport function checkVersions(features: readonly AnyFeature[], emit: Emit, table: string): void {\n for (const f of features) {\n const required = f.requires?.core\n if (required === undefined) continue\n const ok = typeof required === 'string' ? satisfies(VERSION, required) : undefined\n if (ok === true) continue\n throwConfigError(\n 'DK_FEATURE_INCOMPATIBLE',\n { feature: f.name, required: String(required), core: VERSION, invalid: ok === undefined },\n { table },\n )\n }\n const reg = getVersionRegistry()\n if (!reg.cores.includes(self)) {\n reg.cores.push(self)\n if (reg.cores.length > 1) {\n emit('DK_DUPLICATE_CORE', { versions: reg.cores.map((c) => String(c?.version)) })\n }\n }\n for (const name of FIXED_GROUP) {\n const version = reg.packages[name]\n if (typeof version !== 'string' || version === VERSION) continue\n const key = `${name}@${version}`\n if (mismatched.has(key)) continue\n mismatched.add(key)\n emit('DK_VERSION_MISMATCH', { package: name, version, core: VERSION })\n }\n}\n"],"mappings":";AAAA,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAGhC,SAAS,eAAe;AACxB,SAAS,aAAa,6BAA6B;AACnD,SAAS,iBAAiB;AAE1B,gBAAgB,qBAAqB;AAG9B,IAAM,eAA8B,uBAAO,IAAI,WAAW;AAkBjE,IAAM,OAAkB,EAAE,SAAS,QAAQ;AAE3C,IAAM,aAAa,oBAAI,IAAY;AACnC,IAAI;AAEJ,IAAM,WAAW,CAAC,MAA6C,MAAM,QAAQ,OAAO,MAAM;AAMnF,SAAS,qBAAsC;AACpD,QAAM,IAAI;AACV,MAAI;AACF,QAAI,IAAI,EAAE,YAAY;AACtB,QAAI,CAAC,SAAS,CAAC,GAAG;AAChB,UAAI,CAAC;AACL,QAAE,YAAY,IAAI;AAAA,IACpB;AACA,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,MAAM,SAAU,KAAI,IAAI;AACvC,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,KAAI,QAAQ,CAAC;AAC5C,QAAI,CAAC,SAAS,IAAI,QAAQ,EAAG,KAAI,WAAW,CAAC;AAC7C,QAAI,EAAE,IAAI,oBAAoB,KAAM,KAAI,WAAW,oBAAI,IAAI;AAC3D,WAAO;AAAA,EACT,QAAQ;AAEN,cAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,oBAAI,IAAI,EAAE;AAC/D,WAAO;AAAA,EACT;AACF;AAMO,SAAS,gBAAgB,MAAc,SAAuB;AACnE,qBAAmB,EAAE,SAAS,IAAI,IAAI;AACxC;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,WAAW,mBAAmB,EAAE;AACtC,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,WAAS,IAAI,GAAG;AAChB,SAAO;AACT;AAQO,SAAS,cAAc,UAAiC,MAAY,OAAqB;AAC9F,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,EAAE,UAAU;AAC7B,QAAI,aAAa,OAAW;AAC5B,UAAM,KAAK,OAAO,aAAa,WAAW,UAAU,SAAS,QAAQ,IAAI;AACzE,QAAI,OAAO,KAAM;AACjB;AAAA,MACE;AAAA,MACA,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,GAAG,MAAM,SAAS,SAAS,OAAO,OAAU;AAAA,MACxF,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM,mBAAmB;AAC/B,MAAI,CAAC,IAAI,MAAM,SAAS,IAAI,GAAG;AAC7B,QAAI,MAAM,KAAK,IAAI;AACnB,QAAI,IAAI,MAAM,SAAS,GAAG;AACxB,WAAK,qBAAqB,EAAE,UAAU,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IAClF;AAAA,EACF;AACA,aAAW,QAAQ,aAAa;AAC9B,UAAM,UAAU,IAAI,SAAS,IAAI;AACjC,QAAI,OAAO,YAAY,YAAY,YAAY,QAAS;AACxD,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,WAAW,IAAI,GAAG,EAAG;AACzB,eAAW,IAAI,GAAG;AAClB,SAAK,uBAAuB,EAAE,SAAS,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,EACvE;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/versioning/registry.ts"],"sourcesContent":["import { throwConfigError } from '../diagnostics/build'\nimport { keepDiagnostics } from '../diagnostics/catalog'\nimport type { Emit } from '../diagnostics/types'\nimport type { AnyFeature } from '../feature/types'\nimport { VERSION } from '../version'\nimport { FIXED_GROUP, versioningDiagnostics } from './codes'\nimport { satisfies } from './semver'\n\nkeepDiagnostics(versioningDiagnostics)\n\n/** `globalThis[Symbol.for('datakable')]`: shared by every copy of core in the process (§8.5). */\nexport const REGISTRY_KEY: unique symbol = Symbol.for('datakable') as never\n\ninterface CoreEntry {\n readonly version: string\n}\n\n/** Version 1 of the registry shape. Later cores must keep these fields readable. */\nexport interface VersionRegistry {\n v: number\n /** One entry per core copy that created a table, in registration order. */\n cores: CoreEntry[]\n /** Fixed-group package → version (`registerPackage`). */\n packages: Record<string, string>\n /** Once-per-session keys (deprecations, dependency capabilities). */\n reported: Set<string>\n}\n\n/** This copy of core; its identity tells copies apart even when their versions are equal. */\nconst self: CoreEntry = { version: VERSION }\n/** `package@version` pairs this copy already reported as mismatched. */\nconst mismatched = new Set<string>()\nlet local: VersionRegistry | undefined\n\nconst isObject = (v: unknown): v is Record<string, unknown> => v !== null && typeof v === 'object'\n\n/**\n * The global registry, created on first use. Fields are read defensively: a registry left by\n * another core version (or anything else under the symbol) is repaired, never trusted to throw.\n */\nexport function getVersionRegistry(): VersionRegistry {\n const g = globalThis as unknown as Record<symbol, unknown>\n try {\n let r = g[REGISTRY_KEY]\n if (!isObject(r)) {\n r = {}\n g[REGISTRY_KEY] = r\n }\n const reg = r as Partial<VersionRegistry>\n if (typeof reg.v !== 'number') reg.v = 1\n if (!Array.isArray(reg.cores)) reg.cores = []\n if (!isObject(reg.packages)) reg.packages = {}\n if (!(reg.reported instanceof Set)) reg.reported = new Set()\n return reg as VersionRegistry\n } catch {\n // Frozen / non-writable global: fall back to a per-copy registry (no cross-copy detection).\n local ??= { v: 1, cores: [], packages: {}, reported: new Set() }\n return local\n }\n}\n\n/**\n * Records a fixed-group package's version (`@datakable/react`, `datakable`) so `createTable` can\n * report `DK_VERSION_MISMATCH`. Called once by each binding when it is first used.\n */\nexport function registerPackage(name: string, version: string): void {\n getVersionRegistry().packages[name] = version\n}\n\n/** `true` the first time `key` is seen in this session (across core copies). */\nexport function firstInSession(key: string): boolean {\n const reported = getVersionRegistry().reported\n if (reported.has(key)) return false\n reported.add(key)\n return true\n}\n\n/**\n * Version checks of one `createTable` (§8.5), cold path:\n * - feature `requires.core` against this core → `DatakableConfigError` `DK_FEATURE_INCOMPATIBLE`;\n * - registers this copy on its first table; a copy finding one of another version →\n * `DK_DUPLICATE_CORE` (once per copy), only copies of its own version →\n * `DK_DUPLICATE_CORE_SAME_VERSION` (info, once per session);\n * - fixed-group packages with another version → `DK_VERSION_MISMATCH` (once per package version).\n */\nexport function checkVersions(features: readonly AnyFeature[], emit: Emit, table: string): void {\n for (const f of features) {\n const required = f.requires?.core\n if (required === undefined) continue\n const ok = typeof required === 'string' ? satisfies(VERSION, required) : undefined\n if (ok === true) continue\n throwConfigError(\n 'DK_FEATURE_INCOMPATIBLE',\n { feature: f.name, required: String(required), core: VERSION, invalid: ok === undefined },\n { table },\n )\n }\n const reg = getVersionRegistry()\n if (!reg.cores.includes(self)) {\n reg.cores.push(self)\n const versions = reg.cores.map((c) => String(c?.version))\n // One version evaluated again (ESM + CJS builds, bundler layers, HMR) is not a second install\n // (#14): an info, once per session, that strict never throws.\n if (versions.some((v) => v !== VERSION)) emit('DK_DUPLICATE_CORE', { versions })\n else if (versions.length > 1 && firstInSession('DK_DUPLICATE_CORE_SAME_VERSION')) {\n emit('DK_DUPLICATE_CORE_SAME_VERSION', { version: VERSION, copies: versions.length })\n }\n }\n for (const name of FIXED_GROUP) {\n const version = reg.packages[name]\n if (typeof version !== 'string' || version === VERSION) continue\n const key = `${name}@${version}`\n if (mismatched.has(key)) continue\n mismatched.add(key)\n emit('DK_VERSION_MISMATCH', { package: name, version, core: VERSION })\n }\n}\n"],"mappings":";AAAA,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAGhC,SAAS,eAAe;AACxB,SAAS,aAAa,6BAA6B;AACnD,SAAS,iBAAiB;AAE1B,gBAAgB,qBAAqB;AAG9B,IAAM,eAA8B,uBAAO,IAAI,WAAW;AAkBjE,IAAM,OAAkB,EAAE,SAAS,QAAQ;AAE3C,IAAM,aAAa,oBAAI,IAAY;AACnC,IAAI;AAEJ,IAAM,WAAW,CAAC,MAA6C,MAAM,QAAQ,OAAO,MAAM;AAMnF,SAAS,qBAAsC;AACpD,QAAM,IAAI;AACV,MAAI;AACF,QAAI,IAAI,EAAE,YAAY;AACtB,QAAI,CAAC,SAAS,CAAC,GAAG;AAChB,UAAI,CAAC;AACL,QAAE,YAAY,IAAI;AAAA,IACpB;AACA,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,MAAM,SAAU,KAAI,IAAI;AACvC,QAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,EAAG,KAAI,QAAQ,CAAC;AAC5C,QAAI,CAAC,SAAS,IAAI,QAAQ,EAAG,KAAI,WAAW,CAAC;AAC7C,QAAI,EAAE,IAAI,oBAAoB,KAAM,KAAI,WAAW,oBAAI,IAAI;AAC3D,WAAO;AAAA,EACT,QAAQ;AAEN,cAAU,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,oBAAI,IAAI,EAAE;AAC/D,WAAO;AAAA,EACT;AACF;AAMO,SAAS,gBAAgB,MAAc,SAAuB;AACnE,qBAAmB,EAAE,SAAS,IAAI,IAAI;AACxC;AAGO,SAAS,eAAe,KAAsB;AACnD,QAAM,WAAW,mBAAmB,EAAE;AACtC,MAAI,SAAS,IAAI,GAAG,EAAG,QAAO;AAC9B,WAAS,IAAI,GAAG;AAChB,SAAO;AACT;AAUO,SAAS,cAAc,UAAiC,MAAY,OAAqB;AAC9F,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,EAAE,UAAU;AAC7B,QAAI,aAAa,OAAW;AAC5B,UAAM,KAAK,OAAO,aAAa,WAAW,UAAU,SAAS,QAAQ,IAAI;AACzE,QAAI,OAAO,KAAM;AACjB;AAAA,MACE;AAAA,MACA,EAAE,SAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,GAAG,MAAM,SAAS,SAAS,OAAO,OAAU;AAAA,MACxF,EAAE,MAAM;AAAA,IACV;AAAA,EACF;AACA,QAAM,MAAM,mBAAmB;AAC/B,MAAI,CAAC,IAAI,MAAM,SAAS,IAAI,GAAG;AAC7B,QAAI,MAAM,KAAK,IAAI;AACnB,UAAM,WAAW,IAAI,MAAM,IAAI,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAGxD,QAAI,SAAS,KAAK,CAAC,MAAM,MAAM,OAAO,EAAG,MAAK,qBAAqB,EAAE,SAAS,CAAC;AAAA,aACtE,SAAS,SAAS,KAAK,eAAe,gCAAgC,GAAG;AAChF,WAAK,kCAAkC,EAAE,SAAS,SAAS,QAAQ,SAAS,OAAO,CAAC;AAAA,IACtF;AAAA,EACF;AACA,aAAW,QAAQ,aAAa;AAC9B,UAAM,UAAU,IAAI,SAAS,IAAI;AACjC,QAAI,OAAO,YAAY,YAAY,YAAY,QAAS;AACxD,UAAM,MAAM,GAAG,IAAI,IAAI,OAAO;AAC9B,QAAI,WAAW,IAAI,GAAG,EAAG;AACzB,eAAW,IAAI,GAAG;AAClB,SAAK,uBAAuB,EAAE,SAAS,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,EACvE;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datakable/core",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Headless, framework-agnostic core of DataKable — table state, sorting, filtering and types.",
5
5
  "license": "MIT",
6
6
  "author": "Supakit Kitjanabumrungsak",
@@ -23,11 +23,47 @@
23
23
  "type": "module",
24
24
  "sideEffects": [
25
25
  "./dist/messages/index.js",
26
- "./dist/messages/index.cjs"
26
+ "./dist/messages/index.cjs",
27
+ "./dist/diagnostics/process-guard.js",
28
+ "./dist/diagnostics/process-guard.cjs"
27
29
  ],
30
+ "engines": {
31
+ "node": ">=18.18.0"
32
+ },
28
33
  "main": "./dist/index.cjs",
29
34
  "module": "./dist/index.js",
30
35
  "types": "./dist/index.d.ts",
36
+ "typesVersions": {
37
+ "*": {
38
+ "column-filters": [
39
+ "./dist/column-filters.d.ts"
40
+ ],
41
+ "validity": [
42
+ "./dist/validity.d.ts"
43
+ ],
44
+ "search": [
45
+ "./dist/search.d.ts"
46
+ ],
47
+ "sorting": [
48
+ "./dist/sorting.d.ts"
49
+ ],
50
+ "pagination": [
51
+ "./dist/pagination.d.ts"
52
+ ],
53
+ "messages": [
54
+ "./dist/messages.d.ts"
55
+ ],
56
+ "schema": [
57
+ "./dist/schema.d.ts"
58
+ ],
59
+ "search-async": [
60
+ "./dist/search-async.d.ts"
61
+ ],
62
+ "server": [
63
+ "./dist/server.d.ts"
64
+ ]
65
+ }
66
+ },
31
67
  "exports": {
32
68
  ".": {
33
69
  "import": {
@@ -146,7 +182,7 @@
146
182
  "build": "tsup && node scripts/postbuild.mjs",
147
183
  "dev": "tsup --watch",
148
184
  "typecheck": "tsc -p tsconfig.json",
149
- "check:pkg": "publint --strict && attw --pack . --profile node16 && node scripts/check-catalog.mjs",
185
+ "check:pkg": "publint --strict && attw --pack . && node scripts/check-catalog.mjs",
150
186
  "check:catalog": "node scripts/check-catalog.mjs"
151
187
  }
152
188
  }