lemon-core 4.3.0 → 5.0.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 (167) hide show
  1. package/README.md +127 -2
  2. package/dist/common/lemon-error.d.ts +34 -0
  3. package/dist/common/lemon-error.js +52 -0
  4. package/dist/common/lemon-error.js.map +1 -0
  5. package/dist/controllers/general-api-controller.d.ts +7 -0
  6. package/dist/controllers/general-api-controller.js +7 -0
  7. package/dist/controllers/general-api-controller.js.map +1 -1
  8. package/dist/cores/api/api-service.js +10 -43
  9. package/dist/cores/api/api-service.js.map +1 -1
  10. package/dist/cores/aws/aws-kms-service.d.ts +13 -5
  11. package/dist/cores/aws/aws-kms-service.js +23 -9
  12. package/dist/cores/aws/aws-kms-service.js.map +1 -1
  13. package/dist/cores/aws/aws-s3-service.d.ts +30 -4
  14. package/dist/cores/aws/aws-s3-service.js +35 -15
  15. package/dist/cores/aws/aws-s3-service.js.map +1 -1
  16. package/dist/cores/aws/aws-sns-service.js +59 -9
  17. package/dist/cores/aws/aws-sns-service.js.map +1 -1
  18. package/dist/cores/aws/aws-sqs-service.d.ts +1 -1
  19. package/dist/cores/aws/aws-sqs-service.js +54 -12
  20. package/dist/cores/aws/aws-sqs-service.js.map +1 -1
  21. package/dist/cores/cache/cache-service.d.ts +10 -9
  22. package/dist/cores/cache/cache-service.js +9 -346
  23. package/dist/cores/cache/cache-service.js.map +1 -1
  24. package/dist/cores/config/config-service.d.ts +3 -15
  25. package/dist/cores/config/config-service.js +5 -34
  26. package/dist/cores/config/config-service.js.map +1 -1
  27. package/dist/cores/dynamo/dynamo-query-service.js +42 -2
  28. package/dist/cores/dynamo/dynamo-query-service.js.map +1 -1
  29. package/dist/cores/dynamo/dynamo-scan-service.js +42 -2
  30. package/dist/cores/dynamo/dynamo-scan-service.js.map +1 -1
  31. package/dist/cores/dynamo/dynamo-service.d.ts +45 -14
  32. package/dist/cores/dynamo/dynamo-service.js +48 -21
  33. package/dist/cores/dynamo/dynamo-service.js.map +1 -1
  34. package/dist/cores/dynamo/tools/expressions.js +32 -22
  35. package/dist/cores/dynamo/tools/expressions.js.map +1 -1
  36. package/dist/cores/dynamo/tools/lang.d.ts +30 -0
  37. package/dist/cores/dynamo/tools/lang.js +75 -0
  38. package/dist/cores/dynamo/tools/lang.js.map +1 -0
  39. package/dist/cores/dynamo/tools/query.js +20 -21
  40. package/dist/cores/dynamo/tools/query.js.map +1 -1
  41. package/dist/cores/dynamo/tools/scan.js +15 -16
  42. package/dist/cores/dynamo/tools/scan.js.map +1 -1
  43. package/dist/cores/dynamo/tools/serializer.js +40 -38
  44. package/dist/cores/dynamo/tools/serializer.js.map +1 -1
  45. package/dist/cores/dynamo/tools/utils.d.ts +6 -2
  46. package/dist/cores/dynamo/tools/utils.js +11 -8
  47. package/dist/cores/dynamo/tools/utils.js.map +1 -1
  48. package/dist/cores/elastic/elastic6-query-service.d.ts +1 -104
  49. package/dist/cores/elastic/elastic6-query-service.js +15 -489
  50. package/dist/cores/elastic/elastic6-query-service.js.map +1 -1
  51. package/dist/cores/elastic/elastic6-service.d.ts +1 -482
  52. package/dist/cores/elastic/elastic6-service.js +15 -1153
  53. package/dist/cores/elastic/elastic6-service.js.map +1 -1
  54. package/dist/cores/elastic/index.d.ts +2 -2
  55. package/dist/cores/elastic/index.js +3 -2
  56. package/dist/cores/elastic/index.js.map +1 -1
  57. package/dist/cores/elastic/os2-query-service.d.ts +104 -0
  58. package/dist/cores/elastic/os2-query-service.js +495 -0
  59. package/dist/cores/elastic/os2-query-service.js.map +1 -0
  60. package/dist/cores/elastic/os2-service.d.ts +372 -0
  61. package/dist/cores/elastic/os2-service.js +943 -0
  62. package/dist/cores/elastic/os2-service.js.map +1 -0
  63. package/dist/cores/index.d.ts +6 -1
  64. package/dist/cores/index.js +9 -2
  65. package/dist/cores/index.js.map +1 -1
  66. package/dist/cores/lambda/index.js +2 -1
  67. package/dist/cores/lambda/index.js.map +1 -1
  68. package/dist/cores/lambda/lambda-cron-handler.d.ts +1 -0
  69. package/dist/cores/lambda/lambda-cron-handler.js +5 -1
  70. package/dist/cores/lambda/lambda-cron-handler.js.map +1 -1
  71. package/dist/cores/lambda/lambda-dynamo-stream-handler.d.ts +5 -4
  72. package/dist/cores/lambda/lambda-dynamo-stream-handler.js +18 -5
  73. package/dist/cores/lambda/lambda-dynamo-stream-handler.js.map +1 -1
  74. package/dist/cores/lambda/lambda-handler.d.ts +22 -2
  75. package/dist/cores/lambda/lambda-handler.js +85 -23
  76. package/dist/cores/lambda/lambda-handler.js.map +1 -1
  77. package/dist/cores/lambda/lambda-sns-handler.d.ts +1 -0
  78. package/dist/cores/lambda/lambda-sns-handler.js +5 -0
  79. package/dist/cores/lambda/lambda-sns-handler.js.map +1 -1
  80. package/dist/cores/lambda/lambda-sqs-handler.d.ts +1 -0
  81. package/dist/cores/lambda/lambda-sqs-handler.js +20 -5
  82. package/dist/cores/lambda/lambda-sqs-handler.js.map +1 -1
  83. package/dist/cores/lambda/lambda-web-handler.d.ts +10 -0
  84. package/dist/cores/lambda/lambda-web-handler.js +107 -41
  85. package/dist/cores/lambda/lambda-web-handler.js.map +1 -1
  86. package/dist/cores/protocol/aws-lambda-helper.js +58 -11
  87. package/dist/cores/protocol/aws-lambda-helper.js.map +1 -1
  88. package/dist/cores/protocol/index.js +3 -0
  89. package/dist/cores/protocol/index.js.map +1 -1
  90. package/dist/cores/protocol/protocol-service.d.ts +26 -5
  91. package/dist/cores/protocol/protocol-service.js +42 -12
  92. package/dist/cores/protocol/protocol-service.js.map +1 -1
  93. package/dist/cores/protocol/protocol-sign.d.ts +72 -0
  94. package/dist/cores/protocol/protocol-sign.js +194 -0
  95. package/dist/cores/protocol/protocol-sign.js.map +1 -0
  96. package/dist/cores/storage/index.d.ts +0 -1
  97. package/dist/cores/storage/index.js +0 -1
  98. package/dist/cores/storage/index.js.map +1 -1
  99. package/dist/cores/storage/model-fields.d.ts +7 -0
  100. package/dist/cores/storage/model-fields.js +21 -0
  101. package/dist/cores/storage/model-fields.js.map +1 -0
  102. package/dist/cores/storage/model-manager.d.ts +5 -2
  103. package/dist/cores/storage/model-manager.js +11 -3
  104. package/dist/cores/storage/model-manager.js.map +1 -1
  105. package/dist/engine/builder.js +20 -2
  106. package/dist/engine/builder.js.map +1 -1
  107. package/dist/engine/engine.d.ts +2 -2
  108. package/dist/engine/engine.js +5 -5
  109. package/dist/engine/engine.js.map +1 -1
  110. package/dist/engine/utilities.d.ts +20 -12
  111. package/dist/engine/utilities.js +57 -86
  112. package/dist/engine/utilities.js.map +1 -1
  113. package/dist/environ.d.ts +0 -6
  114. package/dist/environ.js +1 -12
  115. package/dist/environ.js.map +1 -1
  116. package/dist/esm/index.mjs +141 -0
  117. package/dist/esm/testing.mjs +12 -0
  118. package/dist/extended/abstract-service.d.ts +48 -139
  119. package/dist/extended/abstract-service.js +46 -382
  120. package/dist/extended/abstract-service.js.map +1 -1
  121. package/dist/extended/cores/abstract-controllers.d.ts +25 -0
  122. package/dist/extended/cores/abstract-controllers.js +77 -7
  123. package/dist/extended/cores/abstract-controllers.js.map +1 -1
  124. package/dist/extended/cores/abstract-rest-apis.d.ts +2 -1
  125. package/dist/extended/cores/abstract-rest-apis.js +2 -1
  126. package/dist/extended/cores/abstract-rest-apis.js.map +1 -1
  127. package/dist/extended/cores/abstract-services.d.ts +48 -87
  128. package/dist/extended/cores/abstract-services.js +121 -248
  129. package/dist/extended/cores/abstract-services.js.map +1 -1
  130. package/dist/extended/cores/commons.d.ts +4 -113
  131. package/dist/extended/cores/commons.js +26 -180
  132. package/dist/extended/cores/commons.js.map +1 -1
  133. package/dist/extended/cores/fields-admin.d.ts +91 -0
  134. package/dist/extended/cores/fields-admin.js +142 -0
  135. package/dist/extended/cores/fields-admin.js.map +1 -0
  136. package/dist/extended/cores/index.d.ts +2 -0
  137. package/dist/extended/cores/index.js +2 -0
  138. package/dist/extended/cores/index.js.map +1 -1
  139. package/dist/extended/cores/types.d.ts +3 -225
  140. package/dist/extended/cores/types.js +28 -0
  141. package/dist/extended/cores/types.js.map +1 -1
  142. package/dist/helpers/helpers.d.ts +10 -5
  143. package/dist/helpers/helpers.js +46 -58
  144. package/dist/helpers/helpers.js.map +1 -1
  145. package/dist/helpers/types.d.ts +22 -10
  146. package/dist/index.d.ts +1 -5
  147. package/dist/index.js +8 -14
  148. package/dist/index.js.map +1 -1
  149. package/dist/lib/http-fetch.d.ts +54 -0
  150. package/dist/lib/http-fetch.js +133 -0
  151. package/dist/lib/http-fetch.js.map +1 -0
  152. package/dist/lib/lazy.d.ts +22 -0
  153. package/dist/lib/lazy.js +54 -0
  154. package/dist/lib/lazy.js.map +1 -0
  155. package/dist/lib/perf.d.ts +35 -0
  156. package/dist/lib/perf.js +52 -0
  157. package/dist/lib/perf.js.map +1 -0
  158. package/dist/tools/tools.d.ts +15 -3
  159. package/dist/tools/tools.js +21 -4
  160. package/dist/tools/tools.js.map +1 -1
  161. package/package.json +96 -39
  162. package/dist/cores/storage/redis-storage-service.d.ts +0 -183
  163. package/dist/cores/storage/redis-storage-service.js +0 -377
  164. package/dist/cores/storage/redis-storage-service.js.map +0 -1
  165. package/dist/generated/field-registry.d.ts +0 -12
  166. package/dist/generated/field-registry.js +0 -21
  167. package/dist/generated/field-registry.js.map +0 -1
@@ -1,185 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.$T = exports.onlyDefined = void 0;
4
- exports.parseListParam = parseListParam;
5
- exports.parsePaginateParam = parsePaginateParam;
6
- const helpers_1 = require("../../helpers/");
7
- const engine_1 = require("../../engine/");
8
- /** local copy of legacy `$T.B` — keep decoupled: L1 `$T.B` semantics differ across version lines (4.2.x returns boolean). */
9
- const _B = (val, def = 0) => {
10
- if (val === null || val === undefined)
11
- return def;
12
- if (typeof val === 'boolean')
13
- return val ? 1 : 0;
14
- if (typeof val === 'string' && ['y', 'yes', 't', 'true'].includes(val.toLowerCase()))
15
- return 1;
16
- return engine_1.$U.N(val, def) && 1;
17
- };
3
+ exports.onlyDefined = exports.parsePaginateParam = exports.parseListParam = exports.$T = void 0;
18
4
  /**
19
- * extract only the defined attribute.
20
- * ex) `{ a:1, b: undefined }` -> `{ a:1 }`
5
+ * `commons.ts`
6
+ * - common tools to export.
7
+ *
8
+ * @author Steve <steve@lemoncloud.io>
9
+ * @date 2022-11-01 optimized w/ `commons`
10
+ * @date 2024-06-24 optimized `parseListParam()`
11
+ * @date 2025-01-03 optimized `parseListParam()` w/ `offset`
12
+ * @date 2025-05-25 optimized `$T.N()` + `parsePaginateParam()` w/ `noLimit` option
13
+ * @date 2025-07-31 optimized `$T.B()` for boolean conversion.
14
+ * @date 2026-02-09 optimized `$T.F()` to keep the original function.
15
+ * @date 2026-04-10 optimized `types` to fix ts warning.
16
+ * @date 2026-10-28 v5 B3: re-exports only — each name has one definition below `extended/cores`.
17
+ *
18
+ * @copyright (C) 2022 LemonCloud Co Ltd. - All Rights Reserved.
19
+ * @origin `@lemoncloud/lemon-templates-api/cores`
21
20
  */
22
- const onlyDefined = (N) => N && typeof N === 'object'
23
- ? Object.entries(N).reduce((N, [k, v]) => {
24
- if (v !== undefined)
25
- N[k] = v;
26
- return N;
27
- }, {})
28
- : null;
29
- exports.onlyDefined = onlyDefined;
30
- /**
31
- * list param parser
32
- * @param param
33
- */
34
- function parseListParam(param, $def) {
35
- return (0, exports.onlyDefined)({
36
- sort: param?.sort !== undefined ? helpers_1.$T.S2(param?.sort, '') : '',
37
- limit: helpers_1.$T.N(param?.limit, $def?.limit ?? 10),
38
- });
39
- }
40
- /**
41
- * paginate param parser
42
- */
43
- function parsePaginateParam(param,
44
- /** default value or conditions */
45
- options) {
46
- const limit = options?.limit;
47
- const page = options?.page ?? 0;
48
- const res = (0, exports.onlyDefined)({
49
- ...parseListParam(param, { limit }),
50
- page: helpers_1.$T.N(param?.page, page),
51
- offset: param?.offset !== undefined ? helpers_1.$T.N(param?.offset, 0) : undefined,
52
- });
53
- const noLimit = options?.noLimit ?? res.limit == -1;
54
- const MAX_LIMIT = exports.$T.N(engine_1.$U.env('MAX_LIMIT', '2000'));
55
- if (MAX_LIMIT <= 0)
56
- throw new Error(`@env.MAX_LIMIT[${MAX_LIMIT}] (number) is invalid!`);
57
- //WARN! - limit the max result to 2000.
58
- if (!noLimit) {
59
- const limit = exports.$T.N(res?.limit ?? 0, 0);
60
- const page = exports.$T.N(res?.page ?? 0, 0);
61
- const maxPage = limit > 0 ? Math.floor(Math.min(limit * page, MAX_LIMIT) / limit) : MAX_LIMIT;
62
- res.page = Math.min(page, maxPage);
63
- }
64
- else {
65
- res.limit = MAX_LIMIT;
66
- res.page = 0;
67
- }
68
- //* returns.
69
- return res;
70
- }
71
- /**
72
- * common tools for transformer.
73
- * - extends the original `$T` in lemon-core.
74
- */
75
- exports.$T = {
76
- ...helpers_1.$T,
77
- /** clear white-spaces and trim */
78
- S2: (v, def) => helpers_1.$T.S2(v, def, ' ').trim(),
79
- /** array string with clear white-spaces and trim */
80
- SS: (v) => (v && Array.isArray(v) ? v : helpers_1.$T.SS(v)).map(v => helpers_1.$T.S2(v, '', ' ').trim()),
81
- /** remove duplicates from string array using reduce */
82
- US: (arr) => arr?.reduce((acc, v) => {
83
- if (!acc.includes(v))
84
- acc.push(v);
85
- return acc;
86
- }, []) ?? [],
87
- /** convert to `boolean`. */
88
- B: (v, def) => typeof v === 'boolean'
89
- ? v
90
- : typeof v === 'number' || typeof v === 'string'
91
- ? Boolean(exports.$T.BN(v, typeof def === 'boolean' ? (def ? 1 : 0) : def))
92
- : Boolean(def),
93
- /** convert to boolean style number. */
94
- BN: (v, def) => (v === undefined ? def : _B(v, def)),
95
- /** convert to `number` */
96
- N: (v, def = 0) => typeof v === 'boolean' ? (v ? 1 : 0) : typeof v === 'number' || typeof v === 'string' ? helpers_1.$T.N(v, def) : def,
97
- // /** convert to `float` w/ fixed(3) */
98
- // F: (n: number, def?: number) => _T.F3(n, def),
99
- /** cleanup if in undefined */
100
- clear: (N) => Object.entries(N).reduce((N, [k, v]) => {
101
- if (v !== undefined)
102
- N[k] = v;
103
- return N;
104
- }, {}),
105
- /** null to string */
106
- nul2str: (v) => {
107
- if (v === undefined)
108
- return undefined;
109
- return helpers_1.$T.S(v ?? '');
110
- },
111
- /**
112
- * find key in LUT table.
113
- */
114
- asLut: (key, $map, options) => {
115
- const $opts = typeof options === 'string' ? { name: options } : options;
116
- const name = $opts?.name ?? 'name';
117
- const throwable = $opts?.throwable ?? true;
118
- const _def = $opts?.default ?? null;
119
- const errScope = $opts?.errScope ?? `asLut(${name ?? ''})`;
120
- //* check of empty.
121
- if (key === undefined)
122
- return undefined;
123
- if (key === null)
124
- return _def;
125
- //* check if key is defined.
126
- if (typeof $map[key] === 'undefined') {
127
- //* lookup by value.
128
- const foundEntry = Object.entries($map).find(([k, v]) => v === key);
129
- if (foundEntry)
130
- return foundEntry[0];
131
- //! throw or default
132
- if (!throwable)
133
- return _def;
134
- if (errScope)
135
- throw new Error(`.${name}[${key}] is invalid key - ${errScope}`);
136
- throw new Error(`.${name}[${key}] is invalid!`);
137
- }
138
- return key;
139
- },
140
- /**
141
- * pack as meta in general-type.
142
- */
143
- asMeta: (body, options) => {
144
- const errScope = options?.errScope ?? '';
145
- if (!body)
146
- return {};
147
- if (typeof body !== 'object')
148
- throw new Error(`@body (object) is required ${errScope}`.trim());
149
- const isVal = (v) => typeof v === 'number' || typeof v === 'string';
150
- const res = Object.entries(body).reduce((R, [k, v]) => {
151
- if (isVal(v))
152
- R[k] = v;
153
- else if (v && Array.isArray(v))
154
- R[k] = v.filter(v => isVal(v));
155
- return R;
156
- }, {});
157
- return res;
158
- },
159
- /**
160
- * reduce aggregation from ES6
161
- * NOTE - 이거 반드시 최신꺼로 업데이트 필요함 @steve/250212
162
- */
163
- reduceAggr: ($aggr) => Object.keys($aggr).reduce((M, key) => {
164
- const N = $aggr[key];
165
- if (key == 'doc_count' && typeof N == 'number') {
166
- M['doc_count'] = { total: N };
167
- return M;
168
- }
169
- M[key] = Object.keys(N).reduce((M, x) => {
170
- const Y = N[x];
171
- if (x == 'doc_count')
172
- M['total'] = exports.$T.N(Y, 0);
173
- if (x == 'buckets' && Array.isArray(Y))
174
- return Y.reduce((M, N) => {
175
- if (typeof N?.key === 'string' && typeof N?.doc_count === 'number') {
176
- M[N?.key] = N.doc_count;
177
- }
178
- return M;
179
- }, M);
180
- return M;
181
- }, {});
182
- return M;
183
- }, {}),
184
- };
21
+ //* v5 B3: the single `$T` (32 members) lives in `helpers/helpers.ts`; re-exported to keep the L2 barrel and deep path.
22
+ var helpers_1 = require("../../helpers/");
23
+ Object.defineProperty(exports, "$T", { enumerable: true, get: function () { return helpers_1.$T; } });
24
+ //* v5 B3: the parsers were verbatim copies of the `helpers/helpers.ts` ones; re-exported for the same reason.
25
+ var helpers_2 = require("../../helpers/");
26
+ Object.defineProperty(exports, "parseListParam", { enumerable: true, get: function () { return helpers_2.parseListParam; } });
27
+ Object.defineProperty(exports, "parsePaginateParam", { enumerable: true, get: function () { return helpers_2.parsePaginateParam; } });
28
+ //* v5 B3: the copy was text-identical to the test-helper one (the root already used that); re-exported.
29
+ var test_helper_1 = require("../../common/test-helper");
30
+ Object.defineProperty(exports, "onlyDefined", { enumerable: true, get: function () { return test_helper_1.onlyDefined; } });
185
31
  //# sourceMappingURL=commons.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/extended/cores/commons.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commons.js","sourceRoot":"","sources":["../../../src/extended/cores/commons.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,uHAAuH;AACvH,0CAAoC;AAA3B,6FAAA,EAAE,OAAA;AACX,8GAA8G;AAC9G,0CAAoE;AAA3D,yGAAA,cAAc,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAC3C,wGAAwG;AACxG,wDAAuD;AAA9C,0GAAA,WAAW,OAAA"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * `fields-admin.ts`
3
+ * - v5 B4: the one verifier of the `GET /<type>/fields/admin` report.
4
+ * - used by the server's own self-check (`doGetAdminFields()`) and by every test or harness
5
+ * (vitest, express, jest, local server, deployed Lambda), so all of them check the same rules.
6
+ * - pure: no imports, so `lemon-core/dist/extended/cores/fields-admin` loads without the engine.
7
+ *
8
+ * @author Steve <steve@lemoncloud.io>
9
+ * @date 2026-10-28 v5 B4: `checkFieldsAdmin()` as the single verifier of `fields/admin`.
10
+ *
11
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
12
+ */
13
+ /**
14
+ * runtime of the report: tells the local harness from the deployed Lambda.
15
+ */
16
+ export interface FieldsAdminRuntime {
17
+ /** `$U.isLocalMode()` (`LOCAL_MODE=1` and not in Lambda) */
18
+ local: boolean;
19
+ /** the request has a `domain` (API-GW, ALB, URL, express) */
20
+ external: boolean;
21
+ /** `AWS_LAMBDA_FUNCTION_NAME`, or `null` outside Lambda */
22
+ lambda: string | null;
23
+ /** `process.version` */
24
+ node: string;
25
+ /** the `lemon-core` version of the service */
26
+ lemonCore: string;
27
+ }
28
+ /**
29
+ * the report of `GET /<type>/fields/admin`.
30
+ */
31
+ export interface FieldsAdminReport {
32
+ id: 'fields';
33
+ /** api type (ex: `tests`) */
34
+ type: string;
35
+ /** model type of the manager (ex: `test`) */
36
+ model: string;
37
+ /** L2 core fields: `fieldsOf(CoreModel)` */
38
+ core: string[];
39
+ /** the manager's `FIELDS` */
40
+ fields: string[];
41
+ /** `fields` minus `core`, in `fields` order */
42
+ extra: string[];
43
+ /** lengths of the three lists */
44
+ counts: {
45
+ core: number;
46
+ fields: number;
47
+ extra: number;
48
+ };
49
+ /** `class` if a model class was passed to the manager, else `list` */
50
+ source: 'class' | 'list';
51
+ /** `issues.length === 0` */
52
+ ok: boolean;
53
+ /** one short line per failed self-check */
54
+ issues: string[];
55
+ runtime: FieldsAdminRuntime;
56
+ }
57
+ /**
58
+ * optional expectations: only the given keys are checked.
59
+ * - `runtime.lambda`: `true` = any non-empty name, `false` = `null`, a string = exact name.
60
+ */
61
+ export interface FieldsAdminExpect {
62
+ type?: string;
63
+ model?: string;
64
+ source?: 'class' | 'list';
65
+ counts?: Partial<FieldsAdminReport['counts']>;
66
+ extra?: string[];
67
+ core?: string[];
68
+ lemonCore?: string;
69
+ runtime?: {
70
+ local?: boolean;
71
+ external?: boolean;
72
+ lambda?: boolean | string;
73
+ };
74
+ }
75
+ /**
76
+ * check a `fields/admin` report, and the optional expectations.
77
+ * - each failed check is one short line in `issues`; `ok = issues.length === 0`.
78
+ * - order: (a) structure, (b) content self-checks, (c) expectations.
79
+ * - the report's own non-empty `issues` add one line; (b) runs on the lists, so a tampered
80
+ * report with `ok: true` and `issues: []` still fails.
81
+ *
82
+ * ```ts
83
+ * const res = await request(app).get('/pets/fields/admin');
84
+ * const { ok, issues } = checkFieldsAdmin(res.body, { type: 'pets', source: 'class', runtime: { lambda: false } });
85
+ * if (!ok) console.error(issues.join('\n'));
86
+ * ```
87
+ */
88
+ export declare const checkFieldsAdmin: (report: any, expect?: FieldsAdminExpect) => {
89
+ ok: boolean;
90
+ issues: string[];
91
+ };
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /**
3
+ * `fields-admin.ts`
4
+ * - v5 B4: the one verifier of the `GET /<type>/fields/admin` report.
5
+ * - used by the server's own self-check (`doGetAdminFields()`) and by every test or harness
6
+ * (vitest, express, jest, local server, deployed Lambda), so all of them check the same rules.
7
+ * - pure: no imports, so `lemon-core/dist/extended/cores/fields-admin` loads without the engine.
8
+ *
9
+ * @author Steve <steve@lemoncloud.io>
10
+ * @date 2026-10-28 v5 B4: `checkFieldsAdmin()` as the single verifier of `fields/admin`.
11
+ *
12
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.checkFieldsAdmin = void 0;
16
+ //* the three list names, in report order.
17
+ const LISTS = ['core', 'fields', 'extra'];
18
+ //* true if the value is a plain (non-array) object.
19
+ const isObject = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
20
+ //* true if the value is an array of non-empty strings.
21
+ const isNames = (v) => Array.isArray(v) && v.every(k => typeof k === 'string' && k.length > 0);
22
+ //* names that appear more than once (each extra occurrence).
23
+ const dupsOf = (list) => list.filter((k, i) => list.indexOf(k) !== i);
24
+ //* short text of a value for a message.
25
+ const textOf = (v) => (Array.isArray(v) ? v.join(',') : v === undefined ? 'undefined' : `${v}`);
26
+ /**
27
+ * check a `fields/admin` report, and the optional expectations.
28
+ * - each failed check is one short line in `issues`; `ok = issues.length === 0`.
29
+ * - order: (a) structure, (b) content self-checks, (c) expectations.
30
+ * - the report's own non-empty `issues` add one line; (b) runs on the lists, so a tampered
31
+ * report with `ok: true` and `issues: []` still fails.
32
+ *
33
+ * ```ts
34
+ * const res = await request(app).get('/pets/fields/admin');
35
+ * const { ok, issues } = checkFieldsAdmin(res.body, { type: 'pets', source: 'class', runtime: { lambda: false } });
36
+ * if (!ok) console.error(issues.join('\n'));
37
+ * ```
38
+ */
39
+ const checkFieldsAdmin = (report, expect) => {
40
+ const issues = [];
41
+ const add = (line) => issues.push(line);
42
+ if (!isObject(report)) {
43
+ add('report is not an object');
44
+ return { ok: false, issues };
45
+ }
46
+ const R = report;
47
+ //* (a) structure: id, the three lists, counts, extra, source, issues/ok, runtime.
48
+ if (R.id !== 'fields')
49
+ add(`id is not fields: ${textOf(R.id)}`);
50
+ LISTS.forEach(k => !isNames(R[k]) && add(`${k} is not a list of names`));
51
+ const lists = isNames(R.core) && isNames(R.fields) && isNames(R.extra);
52
+ if (!isObject(R.counts))
53
+ add('counts is not an object');
54
+ else
55
+ LISTS.forEach(k => {
56
+ //* a broken list is already reported above.
57
+ if (Array.isArray(R[k]) && R.counts[k] !== R[k].length)
58
+ add(`counts.${k}=${textOf(R.counts[k])} but ${k} has ${R[k].length}`);
59
+ });
60
+ if (lists) {
61
+ const expected = R.fields.filter((k) => !R.core.includes(k));
62
+ if (expected.join(',') !== R.extra.join(','))
63
+ add(`extra=${R.extra.join(',')} but fields minus core=${expected.join(',')}`);
64
+ }
65
+ if (R.source !== 'class' && R.source !== 'list')
66
+ add(`source is not class|list: ${textOf(R.source)}`);
67
+ const own = Array.isArray(R.issues) && R.issues.every((s) => typeof s === 'string');
68
+ if (!own)
69
+ add('issues is not a list of strings');
70
+ else if (R.ok !== (R.issues.length === 0))
71
+ add(`ok=${textOf(R.ok)} but issues has ${R.issues.length}`);
72
+ const T = R.runtime;
73
+ if (!isObject(T))
74
+ add('runtime is not an object');
75
+ else {
76
+ ['local', 'external'].forEach(k => typeof T[k] !== 'boolean' && add(`runtime.${k} is not boolean`));
77
+ if (!(T.lambda === null || (typeof T.lambda === 'string' && T.lambda.length > 0)))
78
+ add(`runtime.lambda is not null or a name: ${textOf(T.lambda)}`);
79
+ if (!(typeof T.node === 'string' && /^v\d+\.\d+\.\d+/.test(T.node)))
80
+ add(`runtime.node is not a version: ${textOf(T.node)}`);
81
+ if (!(typeof T.lemonCore === 'string' && /^\d+\.\d+\.\d+/.test(T.lemonCore)))
82
+ add(`runtime.lemonCore is not a version: ${textOf(T.lemonCore)}`);
83
+ }
84
+ //* (b) content self-checks on the lists (the server's own `issues`).
85
+ const core = isNames(R.core) ? R.core : [];
86
+ const fields = isNames(R.fields) ? R.fields : [];
87
+ if (isNames(R.core)) {
88
+ if (core.length < 14)
89
+ add(`core has ${core.length} names (< 14)`);
90
+ ['id', '_id'].forEach(k => !core.includes(k) && add(`core misses ${k}`));
91
+ if (dupsOf(core).length)
92
+ add(`core has duplicates: ${dupsOf(core).join(',')}`);
93
+ }
94
+ if (isNames(R.fields)) {
95
+ if (!fields.length)
96
+ add('fields is empty');
97
+ if (dupsOf(fields).length)
98
+ add(`fields has duplicates: ${dupsOf(fields).join(',')}`);
99
+ }
100
+ //* a class-fed manager inherits all core fields; a list may filter some (ex: `$`, `_id`) by design.
101
+ if (lists && R.source === 'class') {
102
+ const missing = core.filter(k => !fields.includes(k));
103
+ if (missing.length)
104
+ add(`fields misses core: ${missing.join(',')}`);
105
+ }
106
+ //* the report's own issues, as one line.
107
+ if (own && R.issues.length)
108
+ add(`report has ${R.issues.length} issues: ${R.issues.join('; ')}`);
109
+ //* (c) expectations: only the given keys.
110
+ const E = expect ?? {};
111
+ const same = (name, want, got) => textOf(want) !== textOf(got) && add(`expected ${name}=${textOf(want)} got ${textOf(got)}`);
112
+ if (E.type !== undefined)
113
+ same('type', E.type, R.type);
114
+ if (E.model !== undefined)
115
+ same('model', E.model, R.model);
116
+ if (E.source !== undefined)
117
+ same('source', E.source, R.source);
118
+ if (E.counts)
119
+ LISTS.forEach(k => E.counts[k] !== undefined && same(`counts.${k}`, E.counts[k], R.counts?.[k]));
120
+ if (E.extra)
121
+ same('extra', E.extra, R.extra);
122
+ if (E.core)
123
+ same('core', E.core, R.core);
124
+ if (E.lemonCore !== undefined)
125
+ same('lemonCore', E.lemonCore, T?.lemonCore);
126
+ if (E.runtime?.local !== undefined)
127
+ same('runtime.local', E.runtime.local, T?.local);
128
+ if (E.runtime?.external !== undefined)
129
+ same('runtime.external', E.runtime.external, T?.external);
130
+ //* lambda: `true` = any name, `false` = null, a string = exact.
131
+ const lambda = E.runtime?.lambda;
132
+ const gotLambda = T?.lambda;
133
+ if (lambda === true && !(typeof gotLambda === 'string' && gotLambda.length > 0))
134
+ add(`expected runtime.lambda=<name> got ${textOf(gotLambda)}`);
135
+ if (lambda === false && gotLambda !== null)
136
+ add(`expected runtime.lambda=null got ${textOf(gotLambda)}`);
137
+ if (typeof lambda === 'string' && gotLambda !== lambda)
138
+ add(`expected runtime.lambda=${lambda} got ${textOf(gotLambda)}`);
139
+ return { ok: issues.length === 0, issues };
140
+ };
141
+ exports.checkFieldsAdmin = checkFieldsAdmin;
142
+ //# sourceMappingURL=fields-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields-admin.js","sourceRoot":"","sources":["../../../src/extended/cores/fields-admin.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * @author Steve <steve@lemoncloud.io>
6
6
  * @date 2022-06-21 optimized w/ `abstract-services`
7
+ * @date 2026-10-28 v5 B4: export `checkFieldsAdmin()` (`fields-admin`).
7
8
  *
8
9
  * @copyright (C) 2022 LemonCloud Co Ltd. - All Rights Reserved.
9
10
  * @origin `@lemoncloud/lemon-templates-api/cores`
@@ -13,3 +14,4 @@ export * from './commons';
13
14
  export * from './abstract-services';
14
15
  export * from './abstract-controllers';
15
16
  export * from './abstract-rest-apis';
17
+ export * from './fields-admin';
@@ -20,6 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  *
21
21
  * @author Steve <steve@lemoncloud.io>
22
22
  * @date 2022-06-21 optimized w/ `abstract-services`
23
+ * @date 2026-10-28 v5 B4: export `checkFieldsAdmin()` (`fields-admin`).
23
24
  *
24
25
  * @copyright (C) 2022 LemonCloud Co Ltd. - All Rights Reserved.
25
26
  * @origin `@lemoncloud/lemon-templates-api/cores`
@@ -29,4 +30,5 @@ __exportStar(require("./commons"), exports);
29
30
  __exportStar(require("./abstract-services"), exports);
30
31
  __exportStar(require("./abstract-controllers"), exports);
31
32
  __exportStar(require("./abstract-rest-apis"), exports);
33
+ __exportStar(require("./fields-admin"), exports);
32
34
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extended/cores/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,0CAAwB;AACxB,4CAA0B;AAC1B,sDAAoC;AACpC,yDAAuC;AACvC,uDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extended/cores/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;;GAUG;AACH,0CAAwB;AACxB,4CAA0B;AAC1B,sDAAoC;AACpC,yDAAuC;AACvC,uDAAqC;AACrC,iDAA+B"}