lemon-model 1.5.1 → 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.
- package/README.md +23 -0
- package/dist/esm/fields/index.js +108 -0
- package/dist/esm/fields/index.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types/core-storage.js +87 -17
- package/dist/esm/types/core-storage.js.map +1 -1
- package/dist/esm/types/core-types.js +1 -0
- package/dist/esm/types/core-types.js.map +1 -1
- package/dist/fields/index.d.ts +55 -0
- package/dist/fields/index.js +114 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/types/core-storage.d.ts +12 -13
- package/dist/types/core-storage.js +90 -19
- package/dist/types/core-storage.js.map +1 -1
- package/dist/types/core-types.d.ts +38 -0
- package/dist/types/core-types.js +1 -0
- package/dist/types/core-types.js.map +1 -1
- package/package.json +1 -1
- package/dist/esm/sync/network.js +0 -273
- package/dist/esm/sync/network.js.map +0 -1
- package/dist/socket/client/index.d.ts +0 -9
- package/dist/socket/client/index.js +0 -26
- package/dist/socket/client/index.js.map +0 -1
- package/dist/socket/client/keep-alive-controller.d.ts +0 -35
- package/dist/socket/client/keep-alive-controller.js +0 -101
- package/dist/socket/client/keep-alive-controller.js.map +0 -1
- package/dist/socket/client/message-router.d.ts +0 -15
- package/dist/socket/client/message-router.js +0 -52
- package/dist/socket/client/message-router.js.map +0 -1
- package/dist/socket/client/pending-request-store.d.ts +0 -24
- package/dist/socket/client/pending-request-store.js +0 -78
- package/dist/socket/client/pending-request-store.js.map +0 -1
- package/dist/socket/client/reconnect-controller.d.ts +0 -56
- package/dist/socket/client/reconnect-controller.js +0 -177
- package/dist/socket/client/reconnect-controller.js.map +0 -1
- package/dist/socket/client/rotation-controller.d.ts +0 -32
- package/dist/socket/client/rotation-controller.js +0 -76
- package/dist/socket/client/rotation-controller.js.map +0 -1
- package/dist/socket/client/shared-timer-scheduler.d.ts +0 -17
- package/dist/socket/client/shared-timer-scheduler.js +0 -77
- package/dist/socket/client/shared-timer-scheduler.js.map +0 -1
- package/dist/socket/client/socket-client.d.ts +0 -2
- package/dist/socket/client/socket-client.js +0 -219
- package/dist/socket/client/socket-client.js.map +0 -1
- package/dist/socket/client/types.d.ts +0 -101
- package/dist/socket/client/types.js +0 -3
- package/dist/socket/client/types.js.map +0 -1
- package/dist/socket/client/websocket-client-transport.d.ts +0 -23
- package/dist/socket/client/websocket-client-transport.js +0 -152
- package/dist/socket/client/websocket-client-transport.js.map +0 -1
- package/dist/sync/network.d.ts +0 -38
- package/dist/sync/network.js +0 -278
- package/dist/sync/network.js.map +0 -1
package/README.md
CHANGED
|
@@ -31,6 +31,7 @@ Frontend bundlers use the ESM build. Existing Node `require()` consumers use the
|
|
|
31
31
|
| --- | --- | --- |
|
|
32
32
|
| `types` | Shared request, identity, storage, and service shapes | Source types |
|
|
33
33
|
| `cores` | Small shared transform helpers | Source tests |
|
|
34
|
+
| `fields` | `@field()` annotations and `fieldsOf()` for model classes | `## Fields` below |
|
|
34
35
|
| `socket` | Peer socket, network contract, WebSocket bridge, JSON chunk transport | `src/socket/README.md` |
|
|
35
36
|
| `buffer` | Provider-neutral GenAI stream buffering and network adapters | `src/buffer/README.md` |
|
|
36
37
|
| `genai` | Gemini-like `generateContent()` adapter over Lemon agents APIs | `src/genai/README.md` |
|
|
@@ -92,6 +93,28 @@ The network adapter can send `GenAIStreamEvent` over the shared socket/json-tran
|
|
|
92
93
|
|
|
93
94
|
Provider probe tools are available under `tools/`, but provider SDKs are not part of the runtime package contract. Install the matching SDK in the workspace where you run a probe.
|
|
94
95
|
|
|
96
|
+
## Fields
|
|
97
|
+
|
|
98
|
+
`@field()` marks the stored fields of a model class; `fieldsOf()` lists them (since 5.0.0).
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { CoreModel, field, fieldsOf } from 'lemon-model';
|
|
102
|
+
|
|
103
|
+
class PetModel extends CoreModel<'pet'> {
|
|
104
|
+
@field({ group: 'head' }) name?: string;
|
|
105
|
+
@field() age?: number;
|
|
106
|
+
}
|
|
107
|
+
fieldsOf(PetModel); // 16 CoreModel fields, then 'name', 'age'
|
|
108
|
+
fieldsOf(PetModel, { group: 'head' }); // ['name']
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
- Order: declaration order, parent first. A redeclared field (`@field({ group: 'head' }) declare name?: string;`) keeps the parent position; options merge, child wins per key.
|
|
112
|
+
- Options: `kind` (`data` default, `view`, `internal`), `group` (string or string[]). `specsOf(cls)` returns `{ name, kind, group, own }`.
|
|
113
|
+
- `CORE_FIELDS` = `fieldsOf(CoreModel, { kinds: ['view', 'data'] })` (14). `fieldsOf(CoreModel)` adds `id`, `_id` (16).
|
|
114
|
+
- Modes: legacy decorators (`experimentalDecorators: true`) and TS 5 standard decorators both work. The `fields` module sets `Symbol.metadata ??= Symbol.for('Symbol.metadata')` once for standard mode.
|
|
115
|
+
- Storage: the list lives on the class under `Symbol.for('lemon-model:fields:v1')` (`FIELDS_KEY`), so the CJS and the ESM build read each other's lists. No `reflect-metadata`.
|
|
116
|
+
- Compare field lists as sets in tests, not by order.
|
|
117
|
+
|
|
95
118
|
## Build Formats
|
|
96
119
|
|
|
97
120
|
- CommonJS entry: `dist/index.js`
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
var _a;
|
|
2
|
+
var _b;
|
|
3
|
+
/**
|
|
4
|
+
* `fields/index.ts`
|
|
5
|
+
* - field annotations of a model class: `@field()`, `fieldsOf()`, `specsOf()`.
|
|
6
|
+
* - `field()` is dual-mode: legacy `(prototype, key)` (experimentalDecorators) and standard `(undefined, context)`.
|
|
7
|
+
* - the field list is attached to the class itself under a `Symbol.for` key (never a module-level map),
|
|
8
|
+
* so the CJS and the ESM copy of this module read the same list.
|
|
9
|
+
*
|
|
10
|
+
* @author Steve Jung <steve@lemoncloud.io>
|
|
11
|
+
* @date 2026-10-28 initial version (lemon-core v5 B4)
|
|
12
|
+
*
|
|
13
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
14
|
+
*/
|
|
15
|
+
// polyfill: standard decorators need `Symbol.metadata` (missing on Node 24); `Symbol.for` keeps every copy on one symbol.
|
|
16
|
+
(_a = (_b = Symbol).metadata) !== null && _a !== void 0 ? _a : (_b.metadata = Symbol.for('Symbol.metadata'));
|
|
17
|
+
/** key of the own field list on a class (legacy) or on its metadata object (standard), shared by every module copy */
|
|
18
|
+
export const FIELDS_KEY = Symbol.for('lemon-model:fields:v1');
|
|
19
|
+
/** own (non-inherited) declaration list of a holder; created non-enumerable on first write */
|
|
20
|
+
const ownDecls = (holder) => {
|
|
21
|
+
if (Object.prototype.hasOwnProperty.call(holder, FIELDS_KEY))
|
|
22
|
+
return holder[FIELDS_KEY];
|
|
23
|
+
const list = [];
|
|
24
|
+
Object.defineProperty(holder, FIELDS_KEY, { value: list, enumerable: false, configurable: true });
|
|
25
|
+
return list;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* decorator factory of a model field (dual-mode).
|
|
29
|
+
* - legacy: `@field() name?: string;` with `experimentalDecorators: true`.
|
|
30
|
+
* - standard: same syntax with TS 5 standard decorators (needs `Symbol.metadata`, polyfilled above).
|
|
31
|
+
*
|
|
32
|
+
* @param opts field options (`kind`, `group`)
|
|
33
|
+
*/
|
|
34
|
+
export const field = (opts = {}) => (target, context) => {
|
|
35
|
+
// standard call: (undefined, context) - store on the class metadata object
|
|
36
|
+
if (context && typeof context === 'object' && typeof context.kind === 'string') {
|
|
37
|
+
if (context.kind !== 'field')
|
|
38
|
+
throw new Error(`@field() supports class fields only (got ${context.kind})`);
|
|
39
|
+
if (context.static)
|
|
40
|
+
throw new Error(`@field() does not support static fields (${String(context.name)})`);
|
|
41
|
+
if (!context.metadata)
|
|
42
|
+
throw new Error(`@field() needs Symbol.metadata - ${String(context.name)}`);
|
|
43
|
+
ownDecls(context.metadata).push({ name: String(context.name), opts: Object.assign({}, opts) });
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
// legacy call: (prototype, key) - store on the class (constructor)
|
|
47
|
+
if (typeof target === 'function')
|
|
48
|
+
throw new Error(`@field() does not support static fields (${String(context)})`);
|
|
49
|
+
ownDecls(target.constructor).push({ name: String(context), opts: Object.assign({}, opts) });
|
|
50
|
+
return undefined;
|
|
51
|
+
};
|
|
52
|
+
/** constructor chain of `cls`, ordered root -> leaf */
|
|
53
|
+
const chainOf = (cls) => {
|
|
54
|
+
const out = [];
|
|
55
|
+
for (let c = cls; c && c !== Function.prototype; c = Object.getPrototypeOf(c))
|
|
56
|
+
out.unshift(c);
|
|
57
|
+
return out;
|
|
58
|
+
};
|
|
59
|
+
/** own declarations of one constructor from both stores (legacy first, then standard metadata) */
|
|
60
|
+
const declsOf = (ctor) => {
|
|
61
|
+
const res = [];
|
|
62
|
+
// legacy store: own property of the constructor
|
|
63
|
+
if (Object.prototype.hasOwnProperty.call(ctor, FIELDS_KEY))
|
|
64
|
+
res.push(...ctor[FIELDS_KEY]);
|
|
65
|
+
// standard store: own list in the constructor's own metadata object
|
|
66
|
+
const msym = Symbol.metadata;
|
|
67
|
+
const meta = msym && Object.prototype.hasOwnProperty.call(ctor, msym) ? ctor[msym] : undefined;
|
|
68
|
+
if (meta && Object.prototype.hasOwnProperty.call(meta, FIELDS_KEY))
|
|
69
|
+
res.push(...meta[FIELDS_KEY]);
|
|
70
|
+
return res;
|
|
71
|
+
};
|
|
72
|
+
/** normalize `group` option into a list */
|
|
73
|
+
const asGroups = (group) => group === undefined ? [] : Array.isArray(group) ? [...group] : [group];
|
|
74
|
+
/**
|
|
75
|
+
* merged field specs of a model class.
|
|
76
|
+
* - walks the chain root -> leaf; parent fields come first in declaration order.
|
|
77
|
+
* - a redeclared name keeps the parent position, options merge as `{ ...parent, ...child }`.
|
|
78
|
+
*
|
|
79
|
+
* @param cls model class
|
|
80
|
+
*/
|
|
81
|
+
export const specsOf = (cls) => {
|
|
82
|
+
const merged = new Map();
|
|
83
|
+
// Map.set() on an existing key keeps its first (parent) position
|
|
84
|
+
chainOf(cls).forEach(ctor => declsOf(ctor).forEach(d => {
|
|
85
|
+
const prev = merged.get(d.name);
|
|
86
|
+
merged.set(d.name, { opts: Object.assign(Object.assign({}, (prev ? prev.opts : {})), d.opts), own: ctor === cls });
|
|
87
|
+
}));
|
|
88
|
+
return [...merged.entries()].map(([name, { opts, own }]) => {
|
|
89
|
+
var _a;
|
|
90
|
+
return ({
|
|
91
|
+
name,
|
|
92
|
+
kind: (_a = opts.kind) !== null && _a !== void 0 ? _a : 'data',
|
|
93
|
+
group: asGroups(opts.group),
|
|
94
|
+
own,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* field names of a model class, filtered by query.
|
|
100
|
+
*
|
|
101
|
+
* @param cls model class
|
|
102
|
+
* @param query optional `group` and `kinds` filter
|
|
103
|
+
*/
|
|
104
|
+
export const fieldsOf = (cls, query = {}) => specsOf(cls)
|
|
105
|
+
.filter(s => (query.group ? s.group.includes(query.group) : true))
|
|
106
|
+
.filter(s => (query.kinds ? query.kinds.includes(s.kind) : true))
|
|
107
|
+
.map(s => s.name);
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fields/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -16,4 +16,6 @@ export * from './buffer/index.js';
|
|
|
16
16
|
export * from './sync/index.js';
|
|
17
17
|
export * from './progress/index.js';
|
|
18
18
|
export * from './logtrace/index.js';
|
|
19
|
+
// field annotations: `field`, `fieldsOf`, `specsOf`, `FIELDS_KEY` (lemon-core v5 B4)
|
|
20
|
+
export * from './fields/index.js';
|
|
19
21
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,qFAAqF;AACrF,cAAc,UAAU,CAAC"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
1
10
|
/**
|
|
2
11
|
* `core-storage.ts`
|
|
3
12
|
* - common types for core storage
|
|
@@ -7,24 +16,85 @@
|
|
|
7
16
|
* @date 2019-11-20 initial version
|
|
8
17
|
* @date 2020-01-03 support cognito-identity
|
|
9
18
|
* @date 2021-12-07 support SearchBody
|
|
19
|
+
* @date 2026-10-28 `CoreModel` as a class with `@field()` annotations (lemon-core v5 B4)
|
|
10
20
|
*
|
|
11
21
|
* @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
|
|
12
22
|
*/
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
'
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
// field annotations for the `CoreModel` class
|
|
24
|
+
import { field, fieldsOf } from '../fields/index.js';
|
|
25
|
+
/**
|
|
26
|
+
* class: `CoreModel`
|
|
27
|
+
* - general model out of base Model to support the common usage
|
|
28
|
+
* - a class (not an interface) since 5.0.0: the fields carry `@field()` so `fieldsOf(CoreModel)` lists them.
|
|
29
|
+
* - keep public optional fields only (no methods, no private members): object literals and
|
|
30
|
+
* `interface X extends CoreModel` must keep compiling.
|
|
31
|
+
*/
|
|
32
|
+
export class CoreModel {
|
|
33
|
+
}
|
|
34
|
+
__decorate([
|
|
35
|
+
field({ kind: 'view' }),
|
|
36
|
+
__metadata("design:type", Object)
|
|
37
|
+
], CoreModel.prototype, "$", void 0);
|
|
38
|
+
__decorate([
|
|
39
|
+
field(),
|
|
40
|
+
__metadata("design:type", String)
|
|
41
|
+
], CoreModel.prototype, "ns", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
field(),
|
|
44
|
+
__metadata("design:type", String)
|
|
45
|
+
], CoreModel.prototype, "type", void 0);
|
|
46
|
+
__decorate([
|
|
47
|
+
field(),
|
|
48
|
+
__metadata("design:type", String)
|
|
49
|
+
], CoreModel.prototype, "stereo", void 0);
|
|
50
|
+
__decorate([
|
|
51
|
+
field(),
|
|
52
|
+
__metadata("design:type", String)
|
|
53
|
+
], CoreModel.prototype, "sid", void 0);
|
|
54
|
+
__decorate([
|
|
55
|
+
field(),
|
|
56
|
+
__metadata("design:type", String)
|
|
57
|
+
], CoreModel.prototype, "uid", void 0);
|
|
58
|
+
__decorate([
|
|
59
|
+
field(),
|
|
60
|
+
__metadata("design:type", String)
|
|
61
|
+
], CoreModel.prototype, "gid", void 0);
|
|
62
|
+
__decorate([
|
|
63
|
+
field(),
|
|
64
|
+
__metadata("design:type", Number)
|
|
65
|
+
], CoreModel.prototype, "lock", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
field(),
|
|
68
|
+
__metadata("design:type", Number)
|
|
69
|
+
], CoreModel.prototype, "next", void 0);
|
|
70
|
+
__decorate([
|
|
71
|
+
field(),
|
|
72
|
+
__metadata("design:type", Object)
|
|
73
|
+
], CoreModel.prototype, "meta", void 0);
|
|
74
|
+
__decorate([
|
|
75
|
+
field(),
|
|
76
|
+
__metadata("design:type", Number)
|
|
77
|
+
], CoreModel.prototype, "createdAt", void 0);
|
|
78
|
+
__decorate([
|
|
79
|
+
field(),
|
|
80
|
+
__metadata("design:type", Number)
|
|
81
|
+
], CoreModel.prototype, "updatedAt", void 0);
|
|
82
|
+
__decorate([
|
|
83
|
+
field(),
|
|
84
|
+
__metadata("design:type", Number)
|
|
85
|
+
], CoreModel.prototype, "deletedAt", void 0);
|
|
86
|
+
__decorate([
|
|
87
|
+
field(),
|
|
88
|
+
__metadata("design:type", String)
|
|
89
|
+
], CoreModel.prototype, "error", void 0);
|
|
90
|
+
__decorate([
|
|
91
|
+
field({ kind: 'internal' }),
|
|
92
|
+
__metadata("design:type", String)
|
|
93
|
+
], CoreModel.prototype, "id", void 0);
|
|
94
|
+
__decorate([
|
|
95
|
+
field({ kind: 'internal' }),
|
|
96
|
+
__metadata("design:type", String)
|
|
97
|
+
], CoreModel.prototype, "_id", void 0);
|
|
98
|
+
// L1 core fields: view + data kinds of `CoreModel` (14, same order as the former literal list)
|
|
99
|
+
export const CORE_FIELDS = fieldsOf(CoreModel, { kinds: ['view', 'data'] });
|
|
30
100
|
//# sourceMappingURL=core-storage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-storage.js","sourceRoot":"","sources":["../../../src/types/core-storage.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"core-storage.js","sourceRoot":"","sources":["../../../src/types/core-storage.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;;;;;;;GAYG;AACH,8CAA8C;AAC9C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAwD5C;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;CAuFrB;AAhFG;IADC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oCACE;AAO1B;IADC,KAAK,EAAE;;qCACI;AAKZ;IADC,KAAK,EAAE;;uCACS;AAKjB;IADC,KAAK,EAAE;;yCACQ;AAKhB;IADC,KAAK,EAAE;;sCACK;AAKb;IADC,KAAK,EAAE;;sCACK;AAKb;IADC,KAAK,EAAE;;sCACK;AAKb;IADC,KAAK,EAAE;;uCACM;AAKd;IADC,KAAK,EAAE;;uCACM;AAKd;IADC,KAAK,EAAE;;uCACY;AAKpB;IADC,KAAK,EAAE;;4CACW;AAKnB;IADC,KAAK,EAAE;;4CACW;AAKnB;IADC,KAAK,EAAE;;4CACW;AAKnB;IADC,KAAK,EAAE;;wCACO;AAOf;IADC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;qCAChB;AAKZ;IADC,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;sCACf;AAGjB,+FAA+F;AAC/F,MAAM,CAAC,MAAM,WAAW,GAAa,QAAQ,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* @date 2024-12-20 optimized `NextIdentityCognito`
|
|
11
11
|
* @date 2025-05-13 optimized `NextContext` with `Authorization` header
|
|
12
12
|
* @date 2025-06-12 optimized `SearchBody` with `knn` support
|
|
13
|
+
* @date 2026-10-30 v5 B13: `NextContext.channel` and `NextContext.trace` (`NextTrace`).
|
|
13
14
|
*
|
|
14
15
|
* @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
|
|
15
16
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-types.js","sourceRoot":"","sources":["../../../src/types/core-types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"core-types.js","sourceRoot":"","sources":["../../../src/types/core-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** key of the own field list on a class (legacy) or on its metadata object (standard), shared by every module copy */
|
|
2
|
+
export declare const FIELDS_KEY: unique symbol;
|
|
3
|
+
/** kind of a field: `data` (default, stored), `view` (read-only view like `$`), `internal` (keys like `id`, `_id`) */
|
|
4
|
+
export declare type FieldKind = 'data' | 'view' | 'internal';
|
|
5
|
+
/** options of `@field()` */
|
|
6
|
+
export interface FieldOptions {
|
|
7
|
+
/** field kind (default `data`) */
|
|
8
|
+
kind?: FieldKind;
|
|
9
|
+
/** projection group(s) (ex: `head`) */
|
|
10
|
+
group?: string | string[];
|
|
11
|
+
}
|
|
12
|
+
/** one merged field spec (see `specsOf()`) */
|
|
13
|
+
export interface FieldSpec {
|
|
14
|
+
/** field name */
|
|
15
|
+
name: string;
|
|
16
|
+
/** field kind after merge (default `data`) */
|
|
17
|
+
kind: FieldKind;
|
|
18
|
+
/** projection groups after merge */
|
|
19
|
+
group: string[];
|
|
20
|
+
/** true if the queried class itself declares this field */
|
|
21
|
+
own: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** query of `fieldsOf()` */
|
|
24
|
+
export interface FieldQuery {
|
|
25
|
+
/** only fields whose groups include this group */
|
|
26
|
+
group?: string;
|
|
27
|
+
/** only fields of these kinds */
|
|
28
|
+
kinds?: FieldKind[];
|
|
29
|
+
}
|
|
30
|
+
/** a class (abstract or not) that may carry field annotations */
|
|
31
|
+
declare type FieldHost = abstract new (...args: any[]) => any;
|
|
32
|
+
/**
|
|
33
|
+
* decorator factory of a model field (dual-mode).
|
|
34
|
+
* - legacy: `@field() name?: string;` with `experimentalDecorators: true`.
|
|
35
|
+
* - standard: same syntax with TS 5 standard decorators (needs `Symbol.metadata`, polyfilled above).
|
|
36
|
+
*
|
|
37
|
+
* @param opts field options (`kind`, `group`)
|
|
38
|
+
*/
|
|
39
|
+
export declare const field: (opts?: FieldOptions) => (target: any, context: any) => any;
|
|
40
|
+
/**
|
|
41
|
+
* merged field specs of a model class.
|
|
42
|
+
* - walks the chain root -> leaf; parent fields come first in declaration order.
|
|
43
|
+
* - a redeclared name keeps the parent position, options merge as `{ ...parent, ...child }`.
|
|
44
|
+
*
|
|
45
|
+
* @param cls model class
|
|
46
|
+
*/
|
|
47
|
+
export declare const specsOf: (cls: FieldHost) => FieldSpec[];
|
|
48
|
+
/**
|
|
49
|
+
* field names of a model class, filtered by query.
|
|
50
|
+
*
|
|
51
|
+
* @param cls model class
|
|
52
|
+
* @param query optional `group` and `kinds` filter
|
|
53
|
+
*/
|
|
54
|
+
export declare const fieldsOf: (cls: FieldHost, query?: FieldQuery) => string[];
|
|
55
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
var _b;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.fieldsOf = exports.specsOf = exports.field = exports.FIELDS_KEY = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* `fields/index.ts`
|
|
8
|
+
* - field annotations of a model class: `@field()`, `fieldsOf()`, `specsOf()`.
|
|
9
|
+
* - `field()` is dual-mode: legacy `(prototype, key)` (experimentalDecorators) and standard `(undefined, context)`.
|
|
10
|
+
* - the field list is attached to the class itself under a `Symbol.for` key (never a module-level map),
|
|
11
|
+
* so the CJS and the ESM copy of this module read the same list.
|
|
12
|
+
*
|
|
13
|
+
* @author Steve Jung <steve@lemoncloud.io>
|
|
14
|
+
* @date 2026-10-28 initial version (lemon-core v5 B4)
|
|
15
|
+
*
|
|
16
|
+
* @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
|
|
17
|
+
*/
|
|
18
|
+
// polyfill: standard decorators need `Symbol.metadata` (missing on Node 24); `Symbol.for` keeps every copy on one symbol.
|
|
19
|
+
(_a = (_b = Symbol).metadata) !== null && _a !== void 0 ? _a : (_b.metadata = Symbol.for('Symbol.metadata'));
|
|
20
|
+
/** key of the own field list on a class (legacy) or on its metadata object (standard), shared by every module copy */
|
|
21
|
+
exports.FIELDS_KEY = Symbol.for('lemon-model:fields:v1');
|
|
22
|
+
/** own (non-inherited) declaration list of a holder; created non-enumerable on first write */
|
|
23
|
+
const ownDecls = (holder) => {
|
|
24
|
+
if (Object.prototype.hasOwnProperty.call(holder, exports.FIELDS_KEY))
|
|
25
|
+
return holder[exports.FIELDS_KEY];
|
|
26
|
+
const list = [];
|
|
27
|
+
Object.defineProperty(holder, exports.FIELDS_KEY, { value: list, enumerable: false, configurable: true });
|
|
28
|
+
return list;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* decorator factory of a model field (dual-mode).
|
|
32
|
+
* - legacy: `@field() name?: string;` with `experimentalDecorators: true`.
|
|
33
|
+
* - standard: same syntax with TS 5 standard decorators (needs `Symbol.metadata`, polyfilled above).
|
|
34
|
+
*
|
|
35
|
+
* @param opts field options (`kind`, `group`)
|
|
36
|
+
*/
|
|
37
|
+
const field = (opts = {}) => (target, context) => {
|
|
38
|
+
// standard call: (undefined, context) - store on the class metadata object
|
|
39
|
+
if (context && typeof context === 'object' && typeof context.kind === 'string') {
|
|
40
|
+
if (context.kind !== 'field')
|
|
41
|
+
throw new Error(`@field() supports class fields only (got ${context.kind})`);
|
|
42
|
+
if (context.static)
|
|
43
|
+
throw new Error(`@field() does not support static fields (${String(context.name)})`);
|
|
44
|
+
if (!context.metadata)
|
|
45
|
+
throw new Error(`@field() needs Symbol.metadata - ${String(context.name)}`);
|
|
46
|
+
ownDecls(context.metadata).push({ name: String(context.name), opts: Object.assign({}, opts) });
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
// legacy call: (prototype, key) - store on the class (constructor)
|
|
50
|
+
if (typeof target === 'function')
|
|
51
|
+
throw new Error(`@field() does not support static fields (${String(context)})`);
|
|
52
|
+
ownDecls(target.constructor).push({ name: String(context), opts: Object.assign({}, opts) });
|
|
53
|
+
return undefined;
|
|
54
|
+
};
|
|
55
|
+
exports.field = field;
|
|
56
|
+
/** constructor chain of `cls`, ordered root -> leaf */
|
|
57
|
+
const chainOf = (cls) => {
|
|
58
|
+
const out = [];
|
|
59
|
+
for (let c = cls; c && c !== Function.prototype; c = Object.getPrototypeOf(c))
|
|
60
|
+
out.unshift(c);
|
|
61
|
+
return out;
|
|
62
|
+
};
|
|
63
|
+
/** own declarations of one constructor from both stores (legacy first, then standard metadata) */
|
|
64
|
+
const declsOf = (ctor) => {
|
|
65
|
+
const res = [];
|
|
66
|
+
// legacy store: own property of the constructor
|
|
67
|
+
if (Object.prototype.hasOwnProperty.call(ctor, exports.FIELDS_KEY))
|
|
68
|
+
res.push(...ctor[exports.FIELDS_KEY]);
|
|
69
|
+
// standard store: own list in the constructor's own metadata object
|
|
70
|
+
const msym = Symbol.metadata;
|
|
71
|
+
const meta = msym && Object.prototype.hasOwnProperty.call(ctor, msym) ? ctor[msym] : undefined;
|
|
72
|
+
if (meta && Object.prototype.hasOwnProperty.call(meta, exports.FIELDS_KEY))
|
|
73
|
+
res.push(...meta[exports.FIELDS_KEY]);
|
|
74
|
+
return res;
|
|
75
|
+
};
|
|
76
|
+
/** normalize `group` option into a list */
|
|
77
|
+
const asGroups = (group) => group === undefined ? [] : Array.isArray(group) ? [...group] : [group];
|
|
78
|
+
/**
|
|
79
|
+
* merged field specs of a model class.
|
|
80
|
+
* - walks the chain root -> leaf; parent fields come first in declaration order.
|
|
81
|
+
* - a redeclared name keeps the parent position, options merge as `{ ...parent, ...child }`.
|
|
82
|
+
*
|
|
83
|
+
* @param cls model class
|
|
84
|
+
*/
|
|
85
|
+
const specsOf = (cls) => {
|
|
86
|
+
const merged = new Map();
|
|
87
|
+
// Map.set() on an existing key keeps its first (parent) position
|
|
88
|
+
chainOf(cls).forEach(ctor => declsOf(ctor).forEach(d => {
|
|
89
|
+
const prev = merged.get(d.name);
|
|
90
|
+
merged.set(d.name, { opts: Object.assign(Object.assign({}, (prev ? prev.opts : {})), d.opts), own: ctor === cls });
|
|
91
|
+
}));
|
|
92
|
+
return [...merged.entries()].map(([name, { opts, own }]) => {
|
|
93
|
+
var _a;
|
|
94
|
+
return ({
|
|
95
|
+
name,
|
|
96
|
+
kind: (_a = opts.kind) !== null && _a !== void 0 ? _a : 'data',
|
|
97
|
+
group: asGroups(opts.group),
|
|
98
|
+
own,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
exports.specsOf = specsOf;
|
|
103
|
+
/**
|
|
104
|
+
* field names of a model class, filtered by query.
|
|
105
|
+
*
|
|
106
|
+
* @param cls model class
|
|
107
|
+
* @param query optional `group` and `kinds` filter
|
|
108
|
+
*/
|
|
109
|
+
const fieldsOf = (cls, query = {}) => (0, exports.specsOf)(cls)
|
|
110
|
+
.filter(s => (query.group ? s.group.includes(query.group) : true))
|
|
111
|
+
.filter(s => (query.kinds ? query.kinds.includes(s.kind) : true))
|
|
112
|
+
.map(s => s.name);
|
|
113
|
+
exports.fieldsOf = fieldsOf;
|
|
114
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -32,4 +32,6 @@ __exportStar(require("./buffer"), exports);
|
|
|
32
32
|
__exportStar(require("./sync"), exports);
|
|
33
33
|
__exportStar(require("./progress"), exports);
|
|
34
34
|
__exportStar(require("./logtrace"), exports);
|
|
35
|
+
// field annotations: `field`, `fieldsOf`, `specsOf`, `FIELDS_KEY` (lemon-core v5 B4)
|
|
36
|
+
__exportStar(require("./fields"), exports);
|
|
35
37
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,0CAAwB;AACxB,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,2CAAyB;AACzB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,0CAAwB;AACxB,0CAAwB;AACxB,2CAAyB;AACzB,0CAAwB;AACxB,2CAAyB;AACzB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,qFAAqF;AACrF,2CAAyB"}
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `core-storage.ts`
|
|
3
|
-
* - common types for core storage
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* @author Steve Jung <steve@lemoncloud.io>
|
|
7
|
-
* @date 2019-11-20 initial version
|
|
8
|
-
* @date 2020-01-03 support cognito-identity
|
|
9
|
-
* @date 2021-12-07 support SearchBody
|
|
10
|
-
*
|
|
11
|
-
* @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
|
|
12
|
-
*/
|
|
13
1
|
/**
|
|
14
2
|
* only for type information for internal partition-key.
|
|
15
3
|
*/
|
|
@@ -63,8 +51,11 @@ export interface InternalModel extends CoreModifier {
|
|
|
63
51
|
/**
|
|
64
52
|
* class: `CoreModel`
|
|
65
53
|
* - general model out of base Model to support the common usage
|
|
54
|
+
* - a class (not an interface) since 5.0.0: the fields carry `@field()` so `fieldsOf(CoreModel)` lists them.
|
|
55
|
+
* - keep public optional fields only (no methods, no private members): object literals and
|
|
56
|
+
* `interface X extends CoreModel` must keep compiling.
|
|
66
57
|
*/
|
|
67
|
-
export
|
|
58
|
+
export declare class CoreModel<ModelType extends string = string> implements StorageModel, InternalModel {
|
|
68
59
|
/**
|
|
69
60
|
* the last modifier info
|
|
70
61
|
* - set automatically when model is created/updated/deleted.
|
|
@@ -122,5 +113,13 @@ export interface CoreModel<ModelType extends string = string> extends StorageMod
|
|
|
122
113
|
* error message will be set if error occurred
|
|
123
114
|
*/
|
|
124
115
|
error?: string;
|
|
116
|
+
/**
|
|
117
|
+
* unique id value. (from `StorageModel`)
|
|
118
|
+
*/
|
|
119
|
+
id?: string;
|
|
120
|
+
/**
|
|
121
|
+
* internal partition-key (from `InternalKey`)
|
|
122
|
+
*/
|
|
123
|
+
_id?: string;
|
|
125
124
|
}
|
|
126
125
|
export declare const CORE_FIELDS: string[];
|