pacc 10.2.0 → 10.4.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.
- package/README.md +2 -2
- package/package.json +1 -1
- package/src/common-attributes.mjs +10 -2
- package/src/extract.mjs +41 -0
- package/src/module.mjs +1 -0
- package/src/multiple.mjs +12 -12
- package/src/types.mjs +12 -6
- package/types/common-attributes.d.mts +13 -9
- package/types/extract.d.mts +1 -0
- package/types/module.d.mts +1 -0
- package/types/types.d.mts +2 -1
package/README.md
CHANGED
|
@@ -287,11 +287,11 @@ Type: [Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Globa
|
|
|
287
287
|
* `writable` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** can this attribute be modified
|
|
288
288
|
* `mandatory` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** 
|
|
289
289
|
* `collection` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** are we a collection (set, map, array, object)
|
|
290
|
-
* `owner` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** are we the owner of the value
|
|
291
|
-
* `constructor` **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)?** (collection) constructor
|
|
292
290
|
* `private` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** should the value be shown
|
|
293
291
|
* `credential` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** any type of credential
|
|
294
292
|
* `persistent` **[boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** should we be stored (especially critical for credentials)
|
|
293
|
+
* `backpointer` **[AttributeDefinition](#attributedefinition)?** 
|
|
294
|
+
* `constructor` **[Function](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function)?** (collection) constructor
|
|
295
295
|
* `depends` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** name of an attribute we depend on
|
|
296
296
|
* `description` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** human readable
|
|
297
297
|
* `default` **any?** the default value
|
package/package.json
CHANGED
|
@@ -9,11 +9,11 @@ import { types } from "./types.mjs";
|
|
|
9
9
|
* @property {boolean} writable can this attribute be modified
|
|
10
10
|
* @property {boolean} mandatory
|
|
11
11
|
* @property {boolean} collection are we a collection (set, map, array, object)
|
|
12
|
-
* @property {AttributeDefinition} [backpointer]
|
|
13
|
-
* @property {Function} [constructor] (collection) constructor
|
|
14
12
|
* @property {boolean} [private] should the value be shown
|
|
15
13
|
* @property {boolean} [credential] any type of credential
|
|
16
14
|
* @property {boolean} [persistent] should we be stored (especially critical for credentials)
|
|
15
|
+
* @property {AttributeDefinition} [backpointer]
|
|
16
|
+
* @property {Function} [constructor] (collection) constructor
|
|
17
17
|
* @property {string} [depends] name of an attribute we depend on
|
|
18
18
|
* @property {string} [description] human readable
|
|
19
19
|
* @property {any} [default] the default value
|
|
@@ -51,6 +51,14 @@ export const default_attribute_writable = {
|
|
|
51
51
|
writable: true
|
|
52
52
|
};
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
* @type {AttributeDefinition}
|
|
56
|
+
*/
|
|
57
|
+
export const default_collection_attribute = {
|
|
58
|
+
...default_attribute,
|
|
59
|
+
collection: true
|
|
60
|
+
};
|
|
61
|
+
|
|
54
62
|
/**
|
|
55
63
|
* @type {AttributeDefinition}
|
|
56
64
|
*/
|
package/src/extract.mjs
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { extendingAttributeIterator } from "pacc";
|
|
2
|
+
|
|
3
|
+
export function extract(object, type = object.constructor) {
|
|
4
|
+
const result = {};
|
|
5
|
+
for (const [path, attribute] of extendingAttributeIterator(
|
|
6
|
+
type,
|
|
7
|
+
attribute => !attribute.private
|
|
8
|
+
)) {
|
|
9
|
+
const name = path.join(".");
|
|
10
|
+
const value = object[name];
|
|
11
|
+
|
|
12
|
+
if (value !== undefined) {
|
|
13
|
+
if (attribute.type.primitive) {
|
|
14
|
+
if (attribute.collection) {
|
|
15
|
+
if ((value.size ?? value.length) > 0) {
|
|
16
|
+
result[name] = [...value.values()];
|
|
17
|
+
}
|
|
18
|
+
} else {
|
|
19
|
+
result[name] = value;
|
|
20
|
+
}
|
|
21
|
+
} else {
|
|
22
|
+
if (attribute.backpointer) {
|
|
23
|
+
if (attribute.collection) {
|
|
24
|
+
if ((value.size ?? value.length) > 0) {
|
|
25
|
+
result[name] = Object.fromEntries(
|
|
26
|
+
[...value.values()].map(v => [v[v.constructor.key], extract(v)])
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
result[name] = extract(value);
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
const key = value.constructor.key;
|
|
34
|
+
result[name] = { [key]: value[key], type: value.constructor.name };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return result;
|
|
41
|
+
}
|
package/src/module.mjs
CHANGED
package/src/multiple.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { setAttribute, getAttribute } from "./settergetter.mjs";
|
|
2
2
|
import { attributeIterator, toExternal } from "./attributes.mjs";
|
|
3
3
|
import { default_attribute } from "./common-attributes.mjs";
|
|
4
|
+
|
|
4
5
|
/**
|
|
5
6
|
* Copies attribute values from a source object into a destination object.
|
|
6
7
|
* @param {Object} object target object to be modified
|
|
@@ -9,25 +10,25 @@ import { default_attribute } from "./common-attributes.mjs";
|
|
|
9
10
|
* @param {function?} cb callback to be executed for each copied value
|
|
10
11
|
*/
|
|
11
12
|
export function setAttributes(object, source, definitions, cb) {
|
|
12
|
-
for (const [path,
|
|
13
|
+
for (const [path, attribute] of attributeIterator(definitions)) {
|
|
13
14
|
const name = path.join(".");
|
|
14
15
|
|
|
15
16
|
let value = getAttribute(source, name);
|
|
16
17
|
|
|
17
18
|
if (value === undefined) {
|
|
18
19
|
if (
|
|
19
|
-
|
|
20
|
+
attribute.default === undefined ||
|
|
20
21
|
getAttribute(object, name) !== undefined
|
|
21
22
|
) {
|
|
22
23
|
continue;
|
|
23
24
|
}
|
|
24
|
-
value =
|
|
25
|
+
value = attribute.default;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
setAttribute(object, name, value,
|
|
28
|
+
setAttribute(object, name, value, attribute);
|
|
28
29
|
|
|
29
30
|
if (cb) {
|
|
30
|
-
cb(
|
|
31
|
+
cb(attribute, name, value);
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
}
|
|
@@ -42,12 +43,11 @@ export function setAttributes(object, source, definitions, cb) {
|
|
|
42
43
|
export function getAttributes(object, definitions, filter) {
|
|
43
44
|
const result = {};
|
|
44
45
|
|
|
45
|
-
for (const [path,
|
|
46
|
+
for (const [path, attribute] of attributeIterator(definitions, filter)) {
|
|
46
47
|
const name = path.join(".");
|
|
47
|
-
|
|
48
|
-
const value = getAttribute(object, name, def);
|
|
48
|
+
const value = getAttribute(object, name, attribute);
|
|
49
49
|
if (value !== undefined) {
|
|
50
|
-
setAttribute(result, name, value,
|
|
50
|
+
setAttribute(result, name, value, attribute);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
return result;
|
|
@@ -63,16 +63,16 @@ export function getAttributes(object, definitions, filter) {
|
|
|
63
63
|
export function getAttributesJSON(object, definitions, filter) {
|
|
64
64
|
const result = {};
|
|
65
65
|
|
|
66
|
-
for (const [path,
|
|
66
|
+
for (const [path, attribute] of attributeIterator(definitions, filter)) {
|
|
67
67
|
const name = path.join(".");
|
|
68
68
|
|
|
69
|
-
let value = getAttribute(object, name,
|
|
69
|
+
let value = getAttribute(object, name, attribute);
|
|
70
70
|
if (value !== undefined) {
|
|
71
71
|
value = toExternal(value);
|
|
72
72
|
if (value instanceof Set) {
|
|
73
73
|
value = [...value];
|
|
74
74
|
}
|
|
75
|
-
setAttribute(result,
|
|
75
|
+
setAttribute(result, attribute.externalName ?? name, value, default_attribute);
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
return result;
|
package/src/types.mjs
CHANGED
|
@@ -98,8 +98,8 @@ export const types = {
|
|
|
98
98
|
},
|
|
99
99
|
url: {
|
|
100
100
|
name: "url",
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
primitive: true,
|
|
102
|
+
toInternal: emptyStringIsUndefined
|
|
103
103
|
},
|
|
104
104
|
object: { name: "object", primitive: false }
|
|
105
105
|
};
|
|
@@ -193,11 +193,17 @@ export function resolveTypeLinks() {
|
|
|
193
193
|
type.owners = type.owners.map(owner => raiseOnUnknownType(owner, type));
|
|
194
194
|
}
|
|
195
195
|
|
|
196
|
-
for (const [path, attribute] of attributeIterator(
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
196
|
+
for (const [path, attribute] of attributeIterator(
|
|
197
|
+
type.attributes,
|
|
198
|
+
attribute => typeof attribute.type === "string"
|
|
199
|
+
)) {
|
|
200
|
+
attribute.type = oneOfType(attribute.type);
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
203
|
}
|
|
203
204
|
|
|
205
|
+
export function create(type, owner, data) {
|
|
206
|
+
const factory = type.factoryFor?.(owner, data) || type;
|
|
207
|
+
return new factory(data);
|
|
208
|
+
}
|
|
209
|
+
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
* @property {boolean} writable can this attribute be modified
|
|
8
8
|
* @property {boolean} mandatory
|
|
9
9
|
* @property {boolean} collection are we a collection (set, map, array, object)
|
|
10
|
-
* @property {AttributeDefinition} [backpointer]
|
|
11
|
-
* @property {Function} [constructor] (collection) constructor
|
|
12
10
|
* @property {boolean} [private] should the value be shown
|
|
13
11
|
* @property {boolean} [credential] any type of credential
|
|
14
12
|
* @property {boolean} [persistent] should we be stored (especially critical for credentials)
|
|
13
|
+
* @property {AttributeDefinition} [backpointer]
|
|
14
|
+
* @property {Function} [constructor] (collection) constructor
|
|
15
15
|
* @property {string} [depends] name of an attribute we depend on
|
|
16
16
|
* @property {string} [description] human readable
|
|
17
17
|
* @property {any} [default] the default value
|
|
@@ -34,6 +34,10 @@ export const default_attribute: AttributeDefinition;
|
|
|
34
34
|
* @type {AttributeDefinition}
|
|
35
35
|
*/
|
|
36
36
|
export const default_attribute_writable: AttributeDefinition;
|
|
37
|
+
/**
|
|
38
|
+
* @type {AttributeDefinition}
|
|
39
|
+
*/
|
|
40
|
+
export const default_collection_attribute: AttributeDefinition;
|
|
37
41
|
/**
|
|
38
42
|
* @type {AttributeDefinition}
|
|
39
43
|
*/
|
|
@@ -130,12 +134,12 @@ export namespace yesno_attribute_writable {
|
|
|
130
134
|
export let key: boolean;
|
|
131
135
|
export let mandatory: boolean;
|
|
132
136
|
export let collection: boolean;
|
|
133
|
-
export let backpointer: AttributeDefinition | undefined;
|
|
134
|
-
export let constructor: Function | undefined;
|
|
135
137
|
let _private: boolean | undefined;
|
|
136
138
|
export { _private as private };
|
|
137
139
|
export let credential: boolean | undefined;
|
|
138
140
|
export let persistent: boolean | undefined;
|
|
141
|
+
export let backpointer: AttributeDefinition | undefined;
|
|
142
|
+
export let constructor: Function | undefined;
|
|
139
143
|
export let depends: string | undefined;
|
|
140
144
|
export let description: string | undefined;
|
|
141
145
|
let _default: any;
|
|
@@ -300,11 +304,6 @@ export type AttributeDefinition = {
|
|
|
300
304
|
* are we a collection (set, map, array, object)
|
|
301
305
|
*/
|
|
302
306
|
collection: boolean;
|
|
303
|
-
backpointer?: AttributeDefinition | undefined;
|
|
304
|
-
/**
|
|
305
|
-
* (collection) constructor
|
|
306
|
-
*/
|
|
307
|
-
constructor?: Function | undefined;
|
|
308
307
|
/**
|
|
309
308
|
* should the value be shown
|
|
310
309
|
*/
|
|
@@ -317,6 +316,11 @@ export type AttributeDefinition = {
|
|
|
317
316
|
* should we be stored (especially critical for credentials)
|
|
318
317
|
*/
|
|
319
318
|
persistent?: boolean | undefined;
|
|
319
|
+
backpointer?: AttributeDefinition | undefined;
|
|
320
|
+
/**
|
|
321
|
+
* (collection) constructor
|
|
322
|
+
*/
|
|
323
|
+
constructor?: Function | undefined;
|
|
320
324
|
/**
|
|
321
325
|
* name of an attribute we depend on
|
|
322
326
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function extract(object: any, type?: any): {};
|
package/types/module.d.mts
CHANGED
package/types/types.d.mts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export function addType(type: any): any;
|
|
2
2
|
export function oneOfType(definition: any): any;
|
|
3
3
|
export function resolveTypeLinks(): void;
|
|
4
|
+
export function create(type: any, owner: any, data: any): any;
|
|
4
5
|
export const types: {
|
|
5
6
|
string: {
|
|
6
7
|
name: string;
|
|
@@ -52,8 +53,8 @@ export const types: {
|
|
|
52
53
|
};
|
|
53
54
|
url: {
|
|
54
55
|
name: string;
|
|
55
|
-
toInternal: (value: any) => any;
|
|
56
56
|
primitive: boolean;
|
|
57
|
+
toInternal: (value: any) => any;
|
|
57
58
|
};
|
|
58
59
|
object: {
|
|
59
60
|
name: string;
|