ifct2017 2.0.14 → 2.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 (111) hide show
  1. package/LICENSE +661 -21
  2. package/README.md +1019 -71
  3. package/abbreviations/index.csv +78 -0
  4. package/abbreviations/index.d.ts +39 -0
  5. package/abbreviations/index.js +103 -0
  6. package/abbreviations/index.txt +12 -0
  7. package/about/build.ts +31 -0
  8. package/about/index.d.ts +47 -0
  9. package/about/index.js +110 -0
  10. package/about/index.txt +174 -0
  11. package/build.ts +115 -0
  12. package/carbohydrates/index.csv +8 -0
  13. package/carbohydrates/index.d.ts +42 -0
  14. package/carbohydrates/index.js +112 -0
  15. package/carbohydrates/index.txt +14 -0
  16. package/codes/index.csv +2904 -0
  17. package/codes/index.d.ts +36 -0
  18. package/codes/index.js +102 -0
  19. package/codes/index.txt +12 -0
  20. package/columndescriptions/build.ts +22 -0
  21. package/columndescriptions/index.csv +215 -0
  22. package/columndescriptions/index.d.ts +44 -0
  23. package/columndescriptions/index.js +119 -0
  24. package/columns/build.ts +23 -0
  25. package/columns/index.csv +215 -0
  26. package/columns/index.d.ts +39 -0
  27. package/columns/index.js +111 -0
  28. package/columns/index.txt +71 -0
  29. package/compositingcentres/index.csv +7 -0
  30. package/compositingcentres/index.d.ts +35 -0
  31. package/compositingcentres/index.js +103 -0
  32. package/compositingcentres/index.txt +13 -0
  33. package/compositions/build.ts +212 -0
  34. package/compositions/index.csv +543 -0
  35. package/compositions/index.d.ts +254 -0
  36. package/compositions/index.js +204 -0
  37. package/compositionstats/build.ts +103 -0
  38. package/compositionstats/index.csv +4 -0
  39. package/compositionstats/index.d.ts +31 -0
  40. package/compositionstats/index.js +97 -0
  41. package/contents/index.csv +21 -0
  42. package/contents/index.d.ts +39 -0
  43. package/contents/index.js +102 -0
  44. package/contents/index.txt +13 -0
  45. package/deno.lock +67 -0
  46. package/descriptions/index.csv +543 -0
  47. package/descriptions/index.d.ts +45 -0
  48. package/descriptions/index.js +124 -0
  49. package/descriptions/index.txt +15 -0
  50. package/energies/index.csv +6 -0
  51. package/energies/index.d.ts +34 -0
  52. package/energies/index.js +101 -0
  53. package/energies/index.txt +13 -0
  54. package/frequencydistribution/index.csv +10 -0
  55. package/frequencydistribution/index.d.ts +36 -0
  56. package/frequencydistribution/index.js +90 -0
  57. package/frequencydistribution/index.txt +14 -0
  58. package/groups/index.csv +21 -0
  59. package/groups/index.d.ts +46 -0
  60. package/groups/index.js +118 -0
  61. package/groups/index.txt +14 -0
  62. package/hierarchy/asset.csv +215 -0
  63. package/hierarchy/asset.txt +70 -0
  64. package/hierarchy/build.ts +73 -0
  65. package/hierarchy/index.csv +215 -0
  66. package/hierarchy/index.d.ts +39 -0
  67. package/hierarchy/index.js +100 -0
  68. package/hierarchy/index.txt +14 -0
  69. package/index.d.ts +24 -28
  70. package/index.js +28 -39
  71. package/index.test.ts +717 -0
  72. package/intakes/build.ts +28 -0
  73. package/intakes/index.csv +42 -0
  74. package/intakes/index.d.ts +66 -0
  75. package/intakes/index.js +113 -0
  76. package/intakes/index.txt +20 -0
  77. package/jonesfactors/index.csv +15 -0
  78. package/jonesfactors/index.d.ts +35 -0
  79. package/jonesfactors/index.js +105 -0
  80. package/jonesfactors/index.txt +12 -0
  81. package/languages/index.csv +22 -0
  82. package/languages/index.d.ts +39 -0
  83. package/languages/index.js +103 -0
  84. package/languages/index.txt +12 -0
  85. package/methods/build.ts +101 -0
  86. package/methods/index.csv +37 -0
  87. package/methods/index.d.ts +39 -0
  88. package/methods/index.js +196 -0
  89. package/methods/index.txt +13 -0
  90. package/package.json +15 -63
  91. package/regions/index.csv +7 -0
  92. package/regions/index.d.ts +36 -0
  93. package/regions/index.js +100 -0
  94. package/regions/index.txt +12 -0
  95. package/representations/build.ts +133 -0
  96. package/representations/index.csv +215 -0
  97. package/representations/index.d.ts +36 -0
  98. package/representations/index.js +91 -0
  99. package/retentionfactors/groups.csv +21 -0
  100. package/retentionfactors/index.csv +215 -0
  101. package/samplingunits/index.csv +36 -0
  102. package/samplingunits/index.d.ts +39 -0
  103. package/samplingunits/index.js +110 -0
  104. package/samplingunits/index.txt +14 -0
  105. package/yieldfactors/index.csv +543 -0
  106. package/yieldfactors/index.d.ts +57 -0
  107. package/yieldfactors/index.js +158 -0
  108. package/yieldfactors/index.txt +294 -0
  109. package/corpus.js +0 -6
  110. package/corpus.min.js +0 -1
  111. package/pictures.d.ts +0 -41
@@ -0,0 +1,31 @@
1
+ import type { Composition } from "../compositions/index.js";
2
+ /** Type of the composition stats. */ export type CompositionStatType = "min" | "max" | "avg";
3
+ /**
4
+ * Load the compositions corpus from the file.
5
+ * @returns compositions corpus
6
+ */ export declare function loadCompositionStats(): Promise<Map<string, Composition>>;
7
+ /**
8
+ * Get the path to the compositions stats CSV file.
9
+ * @returns CSV file URL
10
+ */ export declare function compositionStatsCsv(): string;
11
+ /**
12
+ * Find the minimum, maximum, or average composition of all the foods.
13
+ * @param type type of the composition stats (min/max/avg)
14
+ * @returns composition stat (minimum, maximum, or average)
15
+ * @example
16
+ * ```javascript
17
+ * ifct2017.compositionsStats('max');
18
+ * // → { code: 'XMAX',
19
+ * // → name: 'Maximum composition of all foods',
20
+ * // → scie: '',
21
+ * // → lang: '',
22
+ * // → grup: '',
23
+ * // → regn: 0,
24
+ * // → tags: '',
25
+ * // → enerc: 2809,
26
+ * // → enerc_e: 86,
27
+ * // → water: 95.77,
28
+ * // → water_e: 2.78,
29
+ * // → ... } ]
30
+ * ```
31
+ */ export declare function compositionStats(type: CompositionStatType): Composition[];
@@ -0,0 +1,97 @@
1
+ // Copyright (C) 2025-26 Subhajit Sahu
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later
3
+ // See LICENSE for full terms
4
+ import * as csv from "@std/csv";
5
+ //#endregion
6
+ //#region CONSTANTS
7
+ const TEXTCOLS = new Set([
8
+ 'code',
9
+ 'name',
10
+ 'scie',
11
+ 'lang',
12
+ 'grup',
13
+ 'tags'
14
+ ]);
15
+ //#endregion
16
+ //#region GLOBALS
17
+ let corpus = null;
18
+ //#endregion
19
+ //#region FUNCTIONS
20
+ // Parse a row from the CSV file.
21
+ function parseRow(row) {
22
+ const a = {};
23
+ for(const k in row){
24
+ // Name of column is after the last semicolon.
25
+ const l = k.substring(k.lastIndexOf(';') + 1).trim();
26
+ a[l] = TEXTCOLS.has(l) ? row[k] : parseFloat(row[k]);
27
+ }
28
+ return a;
29
+ }
30
+ /**
31
+ * Load the compositions corpus from CSV file.
32
+ * @param file CSV file path
33
+ * @returns compositions corpus
34
+ */ async function loadFromCsv(file) {
35
+ const map = new Map();
36
+ const data = await (await fetch(file)).text();
37
+ const records = csv.parse(data, {
38
+ skipFirstRow: true,
39
+ comment: "#"
40
+ });
41
+ for (const r of records)map.set(r.code, parseRow(r));
42
+ return map;
43
+ }
44
+ /**
45
+ * Load the compositions corpus from the file.
46
+ * @returns compositions corpus
47
+ */ export async function loadCompositionStats() {
48
+ if (corpus) return corpus;
49
+ corpus = await loadFromCsv(compositionStatsCsv());
50
+ return corpus;
51
+ }
52
+ /**
53
+ * Get the path to the compositions stats CSV file.
54
+ * @returns CSV file URL
55
+ */ export function compositionStatsCsv() {
56
+ return import.meta.resolve('./index.csv');
57
+ }
58
+ /**
59
+ * Find the minimum, maximum, or average composition of all the foods.
60
+ * @param type type of the composition stats (min/max/avg)
61
+ * @returns composition stat (minimum, maximum, or average)
62
+ * @example
63
+ * ```javascript
64
+ * ifct2017.compositionsStats('max');
65
+ * // → { code: 'XMAX',
66
+ * // → name: 'Maximum composition of all foods',
67
+ * // → scie: '',
68
+ * // → lang: '',
69
+ * // → grup: '',
70
+ * // → regn: 0,
71
+ * // → tags: '',
72
+ * // → enerc: 2809,
73
+ * // → enerc_e: 86,
74
+ * // → water: 95.77,
75
+ * // → water_e: 2.78,
76
+ * // → ... } ]
77
+ * ```
78
+ */ export function compositionStats(type) {
79
+ if (corpus == null) return [];
80
+ switch(type){
81
+ case 'min':
82
+ return [
83
+ corpus.get('XMIN')
84
+ ];
85
+ case 'max':
86
+ return [
87
+ corpus.get('XMAX')
88
+ ];
89
+ case 'avg':
90
+ return [
91
+ corpus.get('XAVG')
92
+ ];
93
+ default:
94
+ return [];
95
+ }
96
+ } //#endregion
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9pZmN0MjAxNy9pZmN0MjAxNy9jb21wb3NpdGlvbnN0YXRzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoQykgMjAyNS0yNiBTdWJoYWppdCBTYWh1XG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb3ItbGF0ZXJcbi8vIFNlZSBMSUNFTlNFIGZvciBmdWxsIHRlcm1zXG5pbXBvcnQgKiBhcyBjc3YgIGZyb20gXCJAc3RkL2NzdlwiO1xuLy8gaW1wb3J0IGx1bnIgZnJvbSBcImx1bnJcIjsgIC8vIEBkZW5vLXR5cGVzPVwibnBtOkB0eXBlcy9sdW5yQDIuMy43XCJcbmltcG9ydCB0eXBlIHtDb21wb3NpdGlvbn0gZnJvbSBcIi4uL2NvbXBvc2l0aW9ucy9pbmRleC5qc1wiO1xuXG5cblxuLy8jcmVnaW9uIFRZUEVTXG4vKiogVHlwZSBvZiB0aGUgY29tcG9zaXRpb24gc3RhdHMuICovXG5leHBvcnQgdHlwZSBDb21wb3NpdGlvblN0YXRUeXBlID0gXCJtaW5cIiB8IFwibWF4XCIgfCBcImF2Z1wiO1xuLy8jZW5kcmVnaW9uXG5cblxuXG5cbi8vI3JlZ2lvbiBDT05TVEFOVFNcbmNvbnN0IFRFWFRDT0xTID0gbmV3IFNldChbJ2NvZGUnLCAnbmFtZScsICdzY2llJywgJ2xhbmcnLCAnZ3J1cCcsICd0YWdzJ10pO1xuLy8jZW5kcmVnaW9uXG5cblxuXG5cbi8vI3JlZ2lvbiBHTE9CQUxTXG5sZXQgY29ycHVzOiBNYXA8c3RyaW5nLCBDb21wb3NpdGlvbj4gfCBudWxsID0gbnVsbDtcbi8vI2VuZHJlZ2lvblxuXG5cblxuXG4vLyNyZWdpb24gRlVOQ1RJT05TXG4vLyBQYXJzZSBhIHJvdyBmcm9tIHRoZSBDU1YgZmlsZS5cbmZ1bmN0aW9uIHBhcnNlUm93KHJvdzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICBjb25zdCBhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gIGZvciAoY29uc3QgayBpbiByb3cpIHtcbiAgICAvLyBOYW1lIG9mIGNvbHVtbiBpcyBhZnRlciB0aGUgbGFzdCBzZW1pY29sb24uXG4gICAgY29uc3QgbCA9IGsuc3Vic3RyaW5nKGsubGFzdEluZGV4T2YoJzsnKSsxKS50cmltKCk7XG4gICAgYVtsXSA9IFRFWFRDT0xTLmhhcyhsKT8gcm93W2tdIDogcGFyc2VGbG9hdChyb3dba10pO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG5cbi8qKlxuICogTG9hZCB0aGUgY29tcG9zaXRpb25zIGNvcnB1cyBmcm9tIENTViBmaWxlLlxuICogQHBhcmFtIGZpbGUgQ1NWIGZpbGUgcGF0aFxuICogQHJldHVybnMgY29tcG9zaXRpb25zIGNvcnB1c1xuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkRnJvbUNzdihmaWxlOiBzdHJpbmcpIHtcbiAgY29uc3QgbWFwICA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb3NpdGlvbj4oKTtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IChhd2FpdCBmZXRjaChmaWxlKSkudGV4dCgpO1xuICBjb25zdCByZWNvcmRzID0gY3N2LnBhcnNlKGRhdGEsIHtza2lwRmlyc3RSb3c6IHRydWUsIGNvbW1lbnQ6IFwiI1wifSk7XG4gIGZvciAoY29uc3QgciBvZiByZWNvcmRzKVxuICAgIG1hcC5zZXQoci5jb2RlLCBwYXJzZVJvdyhyKSBhcyB1bmtub3duIGFzIENvbXBvc2l0aW9uKTtcbiAgcmV0dXJuIG1hcDtcbn1cblxuXG4vKipcbiAqIExvYWQgdGhlIGNvbXBvc2l0aW9ucyBjb3JwdXMgZnJvbSB0aGUgZmlsZS5cbiAqIEByZXR1cm5zIGNvbXBvc2l0aW9ucyBjb3JwdXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb21wb3NpdGlvblN0YXRzKCk6IFByb21pc2U8TWFwPHN0cmluZywgQ29tcG9zaXRpb24+PiB7XG4gIGlmIChjb3JwdXMpIHJldHVybiBjb3JwdXM7XG4gIGNvcnB1cyA9IGF3YWl0IGxvYWRGcm9tQ3N2KGNvbXBvc2l0aW9uU3RhdHNDc3YoKSk7XG4gIHJldHVybiBjb3JwdXM7XG59XG5cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBvc2l0aW9ucyBzdGF0cyBDU1YgZmlsZS5cbiAqIEByZXR1cm5zIENTViBmaWxlIFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zaXRpb25TdGF0c0NzdigpOiBzdHJpbmcge1xuICByZXR1cm4gaW1wb3J0Lm1ldGEucmVzb2x2ZSgnLi9pbmRleC5jc3YnKTtcbn1cblxuXG4vKipcbiAqIEZpbmQgdGhlIG1pbmltdW0sIG1heGltdW0sIG9yIGF2ZXJhZ2UgY29tcG9zaXRpb24gb2YgYWxsIHRoZSBmb29kcy5cbiAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgdGhlIGNvbXBvc2l0aW9uIHN0YXRzIChtaW4vbWF4L2F2ZylcbiAqIEByZXR1cm5zIGNvbXBvc2l0aW9uIHN0YXQgKG1pbmltdW0sIG1heGltdW0sIG9yIGF2ZXJhZ2UpXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogaWZjdDIwMTcuY29tcG9zaXRpb25zU3RhdHMoJ21heCcpO1xuICogLy8g4oaSIHsgY29kZTogJ1hNQVgnLFxuICogLy8g4oaSICAgbmFtZTogJ01heGltdW0gY29tcG9zaXRpb24gb2YgYWxsIGZvb2RzJyxcbiAqIC8vIOKGkiAgIHNjaWU6ICcnLFxuICogLy8g4oaSICAgbGFuZzogJycsXG4gKiAvLyDihpIgICBncnVwOiAnJyxcbiAqIC8vIOKGkiAgIHJlZ246IDAsXG4gKiAvLyDihpIgICB0YWdzOiAnJyxcbiAqIC8vIOKGkiAgIGVuZXJjOiAyODA5LFxuICogLy8g4oaSICAgZW5lcmNfZTogODYsXG4gKiAvLyDihpIgICB3YXRlcjogOTUuNzcsXG4gKiAvLyDihpIgICB3YXRlcl9lOiAyLjc4LFxuICogLy8g4oaSICAgLi4uIH0gXVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NpdGlvblN0YXRzKHR5cGU6IENvbXBvc2l0aW9uU3RhdFR5cGUpOiBDb21wb3NpdGlvbltdIHtcbiAgaWYgKGNvcnB1cyA9PSBudWxsKSByZXR1cm4gW107XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ21pbic6IHJldHVybiBbY29ycHVzLmdldCgnWE1JTicpIGFzIENvbXBvc2l0aW9uXTtcbiAgICBjYXNlICdtYXgnOiByZXR1cm4gW2NvcnB1cy5nZXQoJ1hNQVgnKSBhcyBDb21wb3NpdGlvbl07XG4gICAgY2FzZSAnYXZnJzogcmV0dXJuIFtjb3JwdXMuZ2V0KCdYQVZHJykgYXMgQ29tcG9zaXRpb25dO1xuICAgIGRlZmF1bHQ6IHJldHVybiBbXTtcbiAgfVxufVxuLy8jZW5kcmVnaW9uXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0NBQXNDO0FBQ3RDLDZDQUE2QztBQUM3Qyw2QkFBNkI7QUFDN0IsWUFBWSxTQUFVLFdBQVc7QUFTakMsWUFBWTtBQUtaLG1CQUFtQjtBQUNuQixNQUFNLFdBQVcsSUFBSSxJQUFJO0VBQUM7RUFBUTtFQUFRO0VBQVE7RUFBUTtFQUFRO0NBQU87QUFDekUsWUFBWTtBQUtaLGlCQUFpQjtBQUNqQixJQUFJLFNBQTBDO0FBQzlDLFlBQVk7QUFLWixtQkFBbUI7QUFDbkIsaUNBQWlDO0FBQ2pDLFNBQVMsU0FBUyxHQUEyQjtFQUMzQyxNQUFNLElBQXFDLENBQUM7RUFDNUMsSUFBSyxNQUFNLEtBQUssSUFBSztJQUNuQiw4Q0FBOEM7SUFDOUMsTUFBTSxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsV0FBVyxDQUFDLE9BQUssR0FBRyxJQUFJO0lBQ2hELENBQUMsQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLENBQUMsS0FBSSxHQUFHLENBQUMsRUFBRSxHQUFHLFdBQVcsR0FBRyxDQUFDLEVBQUU7RUFDcEQ7RUFDQSxPQUFPO0FBQ1Q7QUFHQTs7OztDQUlDLEdBQ0QsZUFBZSxZQUFZLElBQVk7RUFDckMsTUFBTSxNQUFPLElBQUk7RUFDakIsTUFBTSxPQUFPLE1BQU0sQ0FBQyxNQUFNLE1BQU0sS0FBSyxFQUFFLElBQUk7RUFDM0MsTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLE1BQU07SUFBQyxjQUFjO0lBQU0sU0FBUztFQUFHO0VBQ2pFLEtBQUssTUFBTSxLQUFLLFFBQ2QsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUztFQUMzQixPQUFPO0FBQ1Q7QUFHQTs7O0NBR0MsR0FDRCxPQUFPLGVBQWU7RUFDcEIsSUFBSSxRQUFRLE9BQU87RUFDbkIsU0FBUyxNQUFNLFlBQVk7RUFDM0IsT0FBTztBQUNUO0FBR0E7OztDQUdDLEdBQ0QsT0FBTyxTQUFTO0VBQ2QsT0FBTyxZQUFZLE9BQU8sQ0FBQztBQUM3QjtBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9CQyxHQUNELE9BQU8sU0FBUyxpQkFBaUIsSUFBeUI7RUFDeEQsSUFBSSxVQUFVLE1BQU0sT0FBTyxFQUFFO0VBQzdCLE9BQVE7SUFDTixLQUFLO01BQU8sT0FBTztRQUFDLE9BQU8sR0FBRyxDQUFDO09BQXVCO0lBQ3RELEtBQUs7TUFBTyxPQUFPO1FBQUMsT0FBTyxHQUFHLENBQUM7T0FBdUI7SUFDdEQsS0FBSztNQUFPLE9BQU87UUFBQyxPQUFPLEdBQUcsQ0FBQztPQUF1QjtJQUN0RDtNQUFTLE9BQU8sRUFBRTtFQUNwQjtBQUNGLEVBQ0EsWUFBWSJ9
@@ -0,0 +1,21 @@
1
+ sno,title,pagenos
2
+ 1.,"Origin and progression of Indian Food Composition Tables",i
3
+ 2.,"Identification of key foods, National sampling plan and analytical parameters",xii
4
+ 3.,"General Information",xx
5
+ 4.,"References",xxiv
6
+ 5.,"Abbreviations",xxxi
7
+ 6.,"Food Composition Tables",
8
+ 6.1.,"Table 1: Proximate Principles and Dietary Fiber",1
9
+ 6.2.,"Table 2: Water Soluble Vitamins",31
10
+ 6.3.,"Table 3: Fat Soluble Vitamins",61
11
+ 6.4.,"Table 4: Carotenoids",91
12
+ 6.5.,"Table 5: Minerals and Trace Elements",111
13
+ 6.6.,"Table 6: Starch and Individual Sugars",169
14
+ 6.7.,"Table 7: Fatty Acid Profile",187
15
+ 6.8.,"Table 8: Amino Acid Profile",257
16
+ 6.9.,"Table 9: Organic Acids",313
17
+ 6.10.,"Table 10: Polyphenols",333
18
+ 6.11.,"Table 11: Oligosaccharides, Phytosterols, Saponins and Phytates",403
19
+ 6.12.,"Table 12: Fatty Acid Profile of Edible Oils and Fats",423
20
+ 7.,"Food Pictures and Description",427
21
+ 8.,"Index",501
@@ -0,0 +1,39 @@
1
+ import { type SetupTableOptions } from "@nodef/extra-sql";
2
+ /** Content in the original book. */ export interface Content {
3
+ /** S. No. */ sno: string;
4
+ /** Title. */ title: string;
5
+ /** Page Nos. */ pagenos: string;
6
+ }
7
+ /**
8
+ * Load the contents corpus from the file.
9
+ * @returns contents corpus
10
+ */ export declare function loadContents(): Promise<Map<string, Content>>;
11
+ /**
12
+ * Get the path to the contents CSV file.
13
+ * @returns CSV file URL
14
+ */ export declare function contentsCsv(): string;
15
+ /**
16
+ * Obtain SQL command to create and populate the contents table.
17
+ * @param tab table name
18
+ * @param opt options for the table
19
+ * @returns CREATE TABLE, INSERT, CREATE VIEW, CREATE INDEX statements
20
+ */ export declare function contentsSql(tab?: string, opt?: SetupTableOptions): Promise<string>;
21
+ /**
22
+ * Find matching contents of an sno/title/pagenos query.
23
+ * @param txt sno/title/pagenos query
24
+ * @returns matches `[{sno, title, pagenos}]`
25
+ * @example
26
+ * ```javascript
27
+ * ifct2017.contents('table 2');
28
+ * ifct2017.contents('Water soluble vitamins');
29
+ * // → [ { sno: '6.2.',
30
+ * // → title: 'Table 2: Water Soluble Vitamins',
31
+ * // → pagenos: '31' } ]
32
+ *
33
+ * ifct2017.contents('what is page number of table 3?');
34
+ * ifct2017.contents('fat soluble vitamin page number');
35
+ * // → [ { sno: '6.3.',
36
+ * // → title: 'Table 3: Fat Soluble Vitamins',
37
+ * // → pagenos: '61' } ]
38
+ * ```
39
+ */ export declare function contents(txt: string): Content[];
@@ -0,0 +1,102 @@
1
+ // Copyright (C) 2025-26 Subhajit Sahu
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later
3
+ // See LICENSE for full terms
4
+ import * as csv from "@std/csv";
5
+ import lunr from "lunr"; // @deno-types="npm:@types/lunr@2.3.7"
6
+ import { setupTable } from "@nodef/extra-sql";
7
+ //#endregion
8
+ //#region GLOBALS
9
+ let corpus = null;
10
+ let index = null;
11
+ //#endregion
12
+ //#region FUNCTIONS
13
+ /**
14
+ * Load the contents corpus from CSV file.
15
+ * @param file CSV file path
16
+ * @returns contents corpus
17
+ */ async function loadFromCsv(file) {
18
+ const map = new Map();
19
+ const data = await (await fetch(file)).text();
20
+ const records = csv.parse(data, {
21
+ skipFirstRow: true,
22
+ comment: "#"
23
+ });
24
+ for (const r of records)map.set(r.sno, r);
25
+ return map;
26
+ }
27
+ /**
28
+ * Setup the lunr index for the contents corpus.
29
+ * @returns lunr index
30
+ */ function setupIndex(corpus) {
31
+ return lunr(function() {
32
+ this.ref('sno');
33
+ this.field('sno');
34
+ this.field('title');
35
+ this.field('pagenos');
36
+ for (const r of corpus.values())this.add(r);
37
+ });
38
+ }
39
+ /**
40
+ * Load the contents corpus from the file.
41
+ * @returns contents corpus
42
+ */ export async function loadContents() {
43
+ if (corpus) return corpus;
44
+ corpus = await loadFromCsv(contentsCsv());
45
+ index = setupIndex(corpus);
46
+ return corpus;
47
+ }
48
+ /**
49
+ * Get the path to the contents CSV file.
50
+ * @returns CSV file URL
51
+ */ export function contentsCsv() {
52
+ return import.meta.resolve('./index.csv');
53
+ }
54
+ /**
55
+ * Obtain SQL command to create and populate the contents table.
56
+ * @param tab table name
57
+ * @param opt options for the table
58
+ * @returns CREATE TABLE, INSERT, CREATE VIEW, CREATE INDEX statements
59
+ */ export async function contentsSql(tab = "contents", opt = {}) {
60
+ return setupTable(tab, {
61
+ sno: "TEXT",
62
+ title: "TEXT",
63
+ pagenos: "TEXT"
64
+ }, (await loadContents()).values(), Object.assign({
65
+ pk: "sno",
66
+ index: true,
67
+ tsvector: {
68
+ sno: "A",
69
+ title: "B",
70
+ pagenos: "C"
71
+ }
72
+ }, opt));
73
+ }
74
+ /**
75
+ * Find matching contents of an sno/title/pagenos query.
76
+ * @param txt sno/title/pagenos query
77
+ * @returns matches `[{sno, title, pagenos}]`
78
+ * @example
79
+ * ```javascript
80
+ * ifct2017.contents('table 2');
81
+ * ifct2017.contents('Water soluble vitamins');
82
+ * // → [ { sno: '6.2.',
83
+ * // → title: 'Table 2: Water Soluble Vitamins',
84
+ * // → pagenos: '31' } ]
85
+ *
86
+ * ifct2017.contents('what is page number of table 3?');
87
+ * ifct2017.contents('fat soluble vitamin page number');
88
+ * // → [ { sno: '6.3.',
89
+ * // → title: 'Table 3: Fat Soluble Vitamins',
90
+ * // → pagenos: '61' } ]
91
+ * ```
92
+ */ export function contents(txt) {
93
+ if (index == null) return [];
94
+ const a = [];
95
+ txt = txt.replace(/\W/g, ' ');
96
+ const mats = index.search(txt);
97
+ let max = 0;
98
+ for (const mat of mats)max = Math.max(max, Object.keys(mat.matchData.metadata).length);
99
+ for (const mat of mats)if (Object.keys(mat.matchData.metadata).length === max) a.push(corpus?.get(mat.ref) || {});
100
+ return a;
101
+ } //#endregion
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9pZmN0MjAxNy9pZmN0MjAxNy9jb250ZW50cy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKEMpIDIwMjUtMjYgU3ViaGFqaXQgU2FodVxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9yLWxhdGVyXG4vLyBTZWUgTElDRU5TRSBmb3IgZnVsbCB0ZXJtc1xuaW1wb3J0ICogYXMgY3N2ICBmcm9tIFwiQHN0ZC9jc3ZcIjtcbmltcG9ydCBsdW5yIGZyb20gXCJsdW5yXCI7ICAvLyBAZGVuby10eXBlcz1cIm5wbTpAdHlwZXMvbHVuckAyLjMuN1wiXG5pbXBvcnQge3R5cGUgUm93RGF0YSwgdHlwZSBTZXR1cFRhYmxlT3B0aW9ucywgc2V0dXBUYWJsZX0gZnJvbSBcIkBub2RlZi9leHRyYS1zcWxcIjtcblxuXG5cblxuLy8jcmVnaW9uIFRZUEVTXG4vKiogQ29udGVudCBpbiB0aGUgb3JpZ2luYWwgYm9vay4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudCB7XG4gIC8qKiBTLiBOby4gKi9cbiAgc25vOiBzdHJpbmcsXG4gIC8qKiBUaXRsZS4gKi9cbiAgdGl0bGU6IHN0cmluZyxcbiAgLyoqIFBhZ2UgTm9zLiAqL1xuICBwYWdlbm9zOiBzdHJpbmdcbn07XG4vLyNlbmRyZWdpb25cblxuXG5cblxuLy8jcmVnaW9uIEdMT0JBTFNcbmxldCBjb3JwdXM6IE1hcDxzdHJpbmcsIENvbnRlbnQ+IHwgbnVsbCA9IG51bGw7XG5sZXQgaW5kZXg6IGx1bnIuSW5kZXggfCBudWxsID0gbnVsbDtcbi8vI2VuZHJlZ2lvblxuXG5cblxuXG4vLyNyZWdpb24gRlVOQ1RJT05TXG4vKipcbiAqIExvYWQgdGhlIGNvbnRlbnRzIGNvcnB1cyBmcm9tIENTViBmaWxlLlxuICogQHBhcmFtIGZpbGUgQ1NWIGZpbGUgcGF0aFxuICogQHJldHVybnMgY29udGVudHMgY29ycHVzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRGcm9tQ3N2KGZpbGU6IHN0cmluZykge1xuICBjb25zdCBtYXAgID0gbmV3IE1hcDxzdHJpbmcsIENvbnRlbnQ+KCk7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCAoYXdhaXQgZmV0Y2goZmlsZSkpLnRleHQoKTtcbiAgY29uc3QgcmVjb3JkcyA9IGNzdi5wYXJzZShkYXRhLCB7c2tpcEZpcnN0Um93OiB0cnVlLCBjb21tZW50OiBcIiNcIn0pO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVjb3JkcylcbiAgICBtYXAuc2V0KHIuc25vLCByIGFzIHVua25vd24gYXMgQ29udGVudCk7XG4gIHJldHVybiBtYXA7XG59XG5cblxuLyoqXG4gKiBTZXR1cCB0aGUgbHVuciBpbmRleCBmb3IgdGhlIGNvbnRlbnRzIGNvcnB1cy5cbiAqIEByZXR1cm5zIGx1bnIgaW5kZXhcbiAqL1xuZnVuY3Rpb24gc2V0dXBJbmRleChjb3JwdXM6IE1hcDxzdHJpbmcsIENvbnRlbnQ+KSB7XG4gIHJldHVybiBsdW5yKGZ1bmN0aW9uKHRoaXM6IGx1bnIuQnVpbGRlcikge1xuICAgIHRoaXMucmVmKCdzbm8nKTtcbiAgICB0aGlzLmZpZWxkKCdzbm8nKTtcbiAgICB0aGlzLmZpZWxkKCd0aXRsZScpO1xuICAgIHRoaXMuZmllbGQoJ3BhZ2Vub3MnKTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgY29ycHVzLnZhbHVlcygpKVxuICAgICAgdGhpcy5hZGQocik7XG4gIH0pO1xufVxuXG5cbi8qKlxuICogTG9hZCB0aGUgY29udGVudHMgY29ycHVzIGZyb20gdGhlIGZpbGUuXG4gKiBAcmV0dXJucyBjb250ZW50cyBjb3JwdXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250ZW50cygpOiBQcm9taXNlPE1hcDxzdHJpbmcsIENvbnRlbnQ+PiB7XG4gIGlmIChjb3JwdXMpIHJldHVybiBjb3JwdXM7XG4gIGNvcnB1cyA9IGF3YWl0IGxvYWRGcm9tQ3N2KGNvbnRlbnRzQ3N2KCkpO1xuICBpbmRleCAgPSBzZXR1cEluZGV4KGNvcnB1cyk7XG4gIHJldHVybiBjb3JwdXM7XG59XG5cblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbnRlbnRzIENTViBmaWxlLlxuICogQHJldHVybnMgQ1NWIGZpbGUgVVJMXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250ZW50c0NzdigpOiBzdHJpbmcge1xuICByZXR1cm4gaW1wb3J0Lm1ldGEucmVzb2x2ZSgnLi9pbmRleC5jc3YnKTtcbn1cblxuXG4vKipcbiAqIE9idGFpbiBTUUwgY29tbWFuZCB0byBjcmVhdGUgYW5kIHBvcHVsYXRlIHRoZSBjb250ZW50cyB0YWJsZS5cbiAqIEBwYXJhbSB0YWIgdGFibGUgbmFtZVxuICogQHBhcmFtIG9wdCBvcHRpb25zIGZvciB0aGUgdGFibGVcbiAqIEByZXR1cm5zIENSRUFURSBUQUJMRSwgSU5TRVJULCBDUkVBVEUgVklFVywgQ1JFQVRFIElOREVYIHN0YXRlbWVudHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbnRlbnRzU3FsKHRhYjogc3RyaW5nPVwiY29udGVudHNcIiwgb3B0OiBTZXR1cFRhYmxlT3B0aW9ucz17fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBzZXR1cFRhYmxlKHRhYiwge3NubzogXCJURVhUXCIsIHRpdGxlOiBcIlRFWFRcIiwgcGFnZW5vczogXCJURVhUXCJ9LFxuICAgIChhd2FpdCBsb2FkQ29udGVudHMoKSkudmFsdWVzKCkgYXMgSXRlcmFibGU8Um93RGF0YT4sXG4gICAgT2JqZWN0LmFzc2lnbih7cGs6IFwic25vXCIsIGluZGV4OiB0cnVlLCB0c3ZlY3Rvcjoge3NubzogXCJBXCIsIHRpdGxlOiBcIkJcIiwgcGFnZW5vczogXCJDXCJ9fSwgb3B0KSk7XG59XG5cblxuLyoqXG4gKiBGaW5kIG1hdGNoaW5nIGNvbnRlbnRzIG9mIGFuIHNuby90aXRsZS9wYWdlbm9zIHF1ZXJ5LlxuICogQHBhcmFtIHR4dCBzbm8vdGl0bGUvcGFnZW5vcyBxdWVyeVxuICogQHJldHVybnMgbWF0Y2hlcyBgW3tzbm8sIHRpdGxlLCBwYWdlbm9zfV1gXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogaWZjdDIwMTcuY29udGVudHMoJ3RhYmxlIDInKTtcbiAqIGlmY3QyMDE3LmNvbnRlbnRzKCdXYXRlciBzb2x1YmxlIHZpdGFtaW5zJyk7XG4gKiAvLyDihpIgWyB7IHNubzogJzYuMi4nLFxuICogLy8g4oaSICAgICB0aXRsZTogJ1RhYmxlIDI6ICBXYXRlciBTb2x1YmxlIFZpdGFtaW5zJyxcbiAqIC8vIOKGkiAgICAgcGFnZW5vczogJzMxJyB9IF1cbiAqXG4gKiBpZmN0MjAxNy5jb250ZW50cygnd2hhdCBpcyBwYWdlIG51bWJlciBvZiB0YWJsZSAzPycpO1xuICogaWZjdDIwMTcuY29udGVudHMoJ2ZhdCBzb2x1YmxlIHZpdGFtaW4gcGFnZSBudW1iZXInKTtcbiAqIC8vIOKGkiBbIHsgc25vOiAnNi4zLicsXG4gKiAvLyDihpIgICAgIHRpdGxlOiAnVGFibGUgMzogIEZhdCBTb2x1YmxlIFZpdGFtaW5zJyxcbiAqIC8vIOKGkiAgICAgcGFnZW5vczogJzYxJyB9IF1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udGVudHModHh0OiBzdHJpbmcpOiBDb250ZW50W10ge1xuICBpZiAoaW5kZXggPT0gbnVsbCkgcmV0dXJuIFtdO1xuICBjb25zdCBhOiBDb250ZW50W10gPSBbXTsgdHh0ID0gdHh0LnJlcGxhY2UoL1xcVy9nLCAnICcpO1xuICBjb25zdCBtYXRzID0gaW5kZXguc2VhcmNoKHR4dCk7IGxldCBtYXggPSAwO1xuICBmb3IgKGNvbnN0IG1hdCBvZiBtYXRzKVxuICAgIG1heCA9IE1hdGgubWF4KG1heCwgT2JqZWN0LmtleXMobWF0Lm1hdGNoRGF0YS5tZXRhZGF0YSkubGVuZ3RoKTtcbiAgZm9yIChjb25zdCBtYXQgb2YgbWF0cylcbiAgICBpZiAoT2JqZWN0LmtleXMobWF0Lm1hdGNoRGF0YS5tZXRhZGF0YSkubGVuZ3RoID09PSBtYXgpIGEucHVzaChjb3JwdXM/LmdldChtYXQucmVmKSB8fCB7fSBhcyBDb250ZW50KTtcbiAgcmV0dXJuIGE7XG59XG4vLyNlbmRyZWdpb25cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzQ0FBc0M7QUFDdEMsNkNBQTZDO0FBQzdDLDZCQUE2QjtBQUM3QixZQUFZLFNBQVUsV0FBVztBQUNqQyxPQUFPLFVBQVUsT0FBTyxDQUFFLHNDQUFzQztBQUNoRSxTQUE4QyxVQUFVLFFBQU8sbUJBQW1CO0FBZWxGLFlBQVk7QUFLWixpQkFBaUI7QUFDakIsSUFBSSxTQUFzQztBQUMxQyxJQUFJLFFBQTJCO0FBQy9CLFlBQVk7QUFLWixtQkFBbUI7QUFDbkI7Ozs7Q0FJQyxHQUNELGVBQWUsWUFBWSxJQUFZO0VBQ3JDLE1BQU0sTUFBTyxJQUFJO0VBQ2pCLE1BQU0sT0FBTyxNQUFNLENBQUMsTUFBTSxNQUFNLEtBQUssRUFBRSxJQUFJO0VBQzNDLE1BQU0sVUFBVSxJQUFJLEtBQUssQ0FBQyxNQUFNO0lBQUMsY0FBYztJQUFNLFNBQVM7RUFBRztFQUNqRSxLQUFLLE1BQU0sS0FBSyxRQUNkLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFO0VBQ2pCLE9BQU87QUFDVDtBQUdBOzs7Q0FHQyxHQUNELFNBQVMsV0FBVyxNQUE0QjtFQUM5QyxPQUFPLEtBQUs7SUFDVixJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNYLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDWCxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ1gsS0FBSyxNQUFNLEtBQUssT0FBTyxNQUFNLEdBQzNCLElBQUksQ0FBQyxHQUFHLENBQUM7RUFDYjtBQUNGO0FBR0E7OztDQUdDLEdBQ0QsT0FBTyxlQUFlO0VBQ3BCLElBQUksUUFBUSxPQUFPO0VBQ25CLFNBQVMsTUFBTSxZQUFZO0VBQzNCLFFBQVMsV0FBVztFQUNwQixPQUFPO0FBQ1Q7QUFHQTs7O0NBR0MsR0FDRCxPQUFPLFNBQVM7RUFDZCxPQUFPLFlBQVksT0FBTyxDQUFDO0FBQzdCO0FBR0E7Ozs7O0NBS0MsR0FDRCxPQUFPLGVBQWUsWUFBWSxNQUFZLFVBQVUsRUFBRSxNQUF1QixDQUFDLENBQUM7RUFDakYsT0FBTyxXQUFXLEtBQUs7SUFBQyxLQUFLO0lBQVEsT0FBTztJQUFRLFNBQVM7RUFBTSxHQUNqRSxDQUFDLE1BQU0sY0FBYyxFQUFFLE1BQU0sSUFDN0IsT0FBTyxNQUFNLENBQUM7SUFBQyxJQUFJO0lBQU8sT0FBTztJQUFNLFVBQVU7TUFBQyxLQUFLO01BQUssT0FBTztNQUFLLFNBQVM7SUFBRztFQUFDLEdBQUc7QUFDNUY7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBQ0QsT0FBTyxTQUFTLFNBQVMsR0FBVztFQUNsQyxJQUFJLFNBQVMsTUFBTSxPQUFPLEVBQUU7RUFDNUIsTUFBTSxJQUFlLEVBQUU7RUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU87RUFDbEQsTUFBTSxPQUFPLE1BQU0sTUFBTSxDQUFDO0VBQU0sSUFBSSxNQUFNO0VBQzFDLEtBQUssTUFBTSxPQUFPLEtBQ2hCLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBTTtFQUNoRSxLQUFLLE1BQU0sT0FBTyxLQUNoQixJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEtBQUssS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztFQUMxRixPQUFPO0FBQ1QsRUFDQSxZQUFZIn0=
@@ -0,0 +1,13 @@
1
+ Indian Food Composition Tables 2017
2
+ T. Longvah, R. Ananthan, K. Bhaskarachary and K. Venkaiah
3
+
4
+ Copyright © 2017 by National Institute of Nutrition
5
+ Indian Council of Medical Research
6
+ Department of Health Research Ministry of Health and Family Welfare, Government of India
7
+ Jamai Osmania (PO), Hyderabad – 500 007
8
+ Telangana, India Phone: +91 40 27197334, Fax: +91 40 27000339, Email: nin@ap.nic.in
9
+
10
+ CONTENTS
11
+ - S. No.
12
+ - Title
13
+ - Page Nos.
package/deno.lock ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "version": "5",
3
+ "specifiers": {
4
+ "jsr:@nodef/extra-sql@~0.1.2": "0.1.2",
5
+ "jsr:@std/bytes@^1.0.6": "1.0.6",
6
+ "jsr:@std/cli@^1.0.32": "1.0.32",
7
+ "jsr:@std/csv@^1.0.6": "1.0.6",
8
+ "jsr:@std/fmt@^1.0.10": "1.0.10",
9
+ "jsr:@std/internal@^1.0.14": "1.0.14",
10
+ "jsr:@std/path@^1.1.6": "1.1.6",
11
+ "jsr:@std/streams@^1.0.9": "1.1.2",
12
+ "npm:lunr@2.3.9": "2.3.9"
13
+ },
14
+ "jsr": {
15
+ "@nodef/extra-sql@0.1.2": {
16
+ "integrity": "915e7c47145f6f7e64ac04ab1b12c09cc3ef1964e72cd3241f7be423f6d0be8a"
17
+ },
18
+ "@std/bytes@1.0.6": {
19
+ "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a"
20
+ },
21
+ "@std/cli@1.0.32": {
22
+ "integrity": "188b3a100d6202d64e3f5bd3d799c7fa4f6d77f92cc65eb7f641c1fa0aa92a66",
23
+ "dependencies": [
24
+ "jsr:@std/fmt",
25
+ "jsr:@std/internal"
26
+ ]
27
+ },
28
+ "@std/csv@1.0.6": {
29
+ "integrity": "52ef0e62799a0028d278fa04762f17f9bd263fad9a8e7f98c14fbd371d62d9fd",
30
+ "dependencies": [
31
+ "jsr:@std/streams"
32
+ ]
33
+ },
34
+ "@std/fmt@1.0.10": {
35
+ "integrity": "90dfba288802ac6de82fb31d0917eb9e4450b9925b954d5e51fc29ac07419db5"
36
+ },
37
+ "@std/internal@1.0.14": {
38
+ "integrity": "291516b3d4c35024d6ffbc0a9df5bf4c64116e05b50012cf846710152d2ffdf7"
39
+ },
40
+ "@std/path@1.1.6": {
41
+ "integrity": "c68485c2a4dfbb5ae3cc74fae4e8c4e5d874cf8a8ed12927917235c758b46cbe",
42
+ "dependencies": [
43
+ "jsr:@std/internal"
44
+ ]
45
+ },
46
+ "@std/streams@1.1.2": {
47
+ "integrity": "0249bf9b78a999f57032ca4d8e7ccaa57579090242640b35ddc948fbb745d3af",
48
+ "dependencies": [
49
+ "jsr:@std/bytes"
50
+ ]
51
+ }
52
+ },
53
+ "npm": {
54
+ "lunr@2.3.9": {
55
+ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="
56
+ }
57
+ },
58
+ "workspace": {
59
+ "dependencies": [
60
+ "jsr:@nodef/extra-sql@~0.1.2",
61
+ "jsr:@std/cli@^1.0.32",
62
+ "jsr:@std/csv@^1.0.6",
63
+ "jsr:@std/path@^1.1.6",
64
+ "npm:lunr@2.3.9"
65
+ ]
66
+ }
67
+ }