node-type-registry 0.18.1 → 0.20.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/authz/authz-allow-all.js +10 -10
- package/authz/authz-composite.js +28 -28
- package/authz/authz-deny-all.js +10 -10
- package/authz/authz-direct-owner-any.js +19 -18
- package/authz/authz-direct-owner.js +17 -16
- package/authz/authz-entity-membership.js +39 -38
- package/authz/authz-member-list.js +17 -16
- package/authz/authz-membership-check.js +34 -34
- package/authz/authz-not-read-only.js +23 -22
- package/authz/authz-org-hierarchy.js +33 -31
- package/authz/authz-peer-ownership.js +40 -39
- package/authz/authz-publishable.js +26 -24
- package/authz/authz-related-entity-membership.js +57 -55
- package/authz/authz-related-member-list.js +35 -32
- package/authz/authz-related-peer-ownership.js +62 -59
- package/authz/authz-temporal.js +32 -30
- package/authz/index.d.ts +9 -9
- package/authz/index.js +19 -19
- package/blueprint-types.generated.d.ts +10 -17
- package/blueprint-types.generated.js +1 -1
- package/codegen/generate-types.js +10 -21
- package/data/data-composite-field.js +27 -25
- package/data/data-direct-owner.js +24 -23
- package/data/data-entity-membership.js +24 -23
- package/data/data-force-current-user.js +17 -16
- package/data/data-id.js +16 -15
- package/data/data-immutable-fields.js +20 -19
- package/data/data-inflection.js +33 -32
- package/data/data-inherit-from-parent.js +31 -29
- package/data/data-job-trigger.js +87 -84
- package/data/data-jsonb.js +27 -26
- package/data/data-owned-fields.js +25 -23
- package/data/data-ownership-in-entity.js +21 -21
- package/data/data-peoplestamps.js +19 -19
- package/data/data-publishable.js +16 -16
- package/data/data-slug.js +21 -19
- package/data/data-soft-delete.js +14 -14
- package/data/data-status-field.js +32 -31
- package/data/data-tags.js +23 -22
- package/data/data-timestamps.js +15 -15
- package/data/index.d.ts +17 -17
- package/data/index.js +35 -35
- package/data/search-bm25.js +34 -33
- package/data/search-full-text.js +49 -47
- package/data/search-spatial-aggregate.js +77 -74
- package/data/search-spatial.js +51 -50
- package/data/search-trgm.js +20 -19
- package/data/search-unified.js +170 -162
- package/data/search-vector.js +104 -101
- package/data/table-organization-settings.js +13 -13
- package/data/table-user-profiles.js +13 -13
- package/data/table-user-settings.js +13 -13
- package/esm/authz/authz-allow-all.js +10 -10
- package/esm/authz/authz-composite.js +28 -28
- package/esm/authz/authz-deny-all.js +10 -10
- package/esm/authz/authz-direct-owner-any.js +19 -18
- package/esm/authz/authz-direct-owner.js +17 -16
- package/esm/authz/authz-entity-membership.js +39 -38
- package/esm/authz/authz-member-list.js +17 -16
- package/esm/authz/authz-membership-check.js +34 -34
- package/esm/authz/authz-not-read-only.js +23 -22
- package/esm/authz/authz-org-hierarchy.js +33 -31
- package/esm/authz/authz-peer-ownership.js +40 -39
- package/esm/authz/authz-publishable.js +26 -24
- package/esm/authz/authz-related-entity-membership.js +57 -55
- package/esm/authz/authz-related-member-list.js +35 -32
- package/esm/authz/authz-related-peer-ownership.js +62 -59
- package/esm/authz/authz-temporal.js +32 -30
- package/esm/authz/index.d.ts +9 -9
- package/esm/authz/index.js +9 -9
- package/esm/blueprint-types.generated.d.ts +10 -17
- package/esm/blueprint-types.generated.js +1 -1
- package/esm/codegen/generate-types.js +10 -21
- package/esm/data/data-composite-field.js +27 -25
- package/esm/data/data-direct-owner.js +24 -23
- package/esm/data/data-entity-membership.js +24 -23
- package/esm/data/data-force-current-user.js +17 -16
- package/esm/data/data-id.js +16 -15
- package/esm/data/data-immutable-fields.js +20 -19
- package/esm/data/data-inflection.js +33 -32
- package/esm/data/data-inherit-from-parent.js +31 -29
- package/esm/data/data-job-trigger.js +87 -84
- package/esm/data/data-jsonb.js +27 -26
- package/esm/data/data-owned-fields.js +25 -23
- package/esm/data/data-ownership-in-entity.js +21 -21
- package/esm/data/data-peoplestamps.js +19 -19
- package/esm/data/data-publishable.js +16 -16
- package/esm/data/data-slug.js +21 -19
- package/esm/data/data-soft-delete.js +14 -14
- package/esm/data/data-status-field.js +32 -31
- package/esm/data/data-tags.js +23 -22
- package/esm/data/data-timestamps.js +15 -15
- package/esm/data/index.d.ts +17 -17
- package/esm/data/index.js +17 -17
- package/esm/data/search-bm25.js +34 -33
- package/esm/data/search-full-text.js +49 -47
- package/esm/data/search-spatial-aggregate.js +77 -74
- package/esm/data/search-spatial.js +51 -50
- package/esm/data/search-trgm.js +20 -19
- package/esm/data/search-unified.js +170 -162
- package/esm/data/search-vector.js +104 -101
- package/esm/data/table-organization-settings.js +13 -13
- package/esm/data/table-user-profiles.js +13 -13
- package/esm/data/table-user-settings.js +13 -13
- package/esm/index.d.ts +3 -3
- package/esm/index.js +3 -3
- package/esm/module-presets/auth-email-magic.js +2 -2
- package/esm/module-presets/auth-email.js +8 -8
- package/esm/module-presets/auth-passkey.js +4 -4
- package/esm/module-presets/auth-sso.js +7 -7
- package/esm/module-presets/full.js +1 -1
- package/esm/module-presets/index.d.ts +5 -5
- package/esm/module-presets/index.js +4 -4
- package/esm/relation/index.d.ts +1 -1
- package/esm/relation/index.js +1 -1
- package/esm/relation/relation-belongs-to.js +41 -40
- package/esm/relation/relation-has-many.js +42 -41
- package/esm/relation/relation-has-one.js +42 -41
- package/esm/relation/relation-many-to-many.js +70 -68
- package/esm/relation/relation-spatial.js +54 -54
- package/esm/view/index.d.ts +3 -3
- package/esm/view/index.js +3 -3
- package/esm/view/view-aggregated.js +50 -48
- package/esm/view/view-composite.js +18 -18
- package/esm/view/view-filtered-table.js +37 -36
- package/esm/view/view-joined-tables.js +65 -61
- package/esm/view/view-table-projection.js +29 -28
- package/index.d.ts +3 -3
- package/index.js +3 -3
- package/module-presets/auth-email-magic.js +2 -2
- package/module-presets/auth-email.js +8 -8
- package/module-presets/auth-passkey.js +4 -4
- package/module-presets/auth-sso.js +7 -7
- package/module-presets/full.js +1 -1
- package/module-presets/index.d.ts +5 -5
- package/module-presets/index.js +7 -7
- package/package.json +2 -2
- package/relation/index.d.ts +1 -1
- package/relation/index.js +3 -3
- package/relation/relation-belongs-to.js +41 -40
- package/relation/relation-has-many.js +42 -41
- package/relation/relation-has-one.js +42 -41
- package/relation/relation-many-to-many.js +70 -68
- package/relation/relation-spatial.js +54 -54
- package/view/index.d.ts +3 -3
- package/view/index.js +7 -7
- package/view/view-aggregated.js +50 -48
- package/view/view-composite.js +18 -18
- package/view/view-filtered-table.js +37 -36
- package/view/view-joined-tables.js +65 -61
- package/view/view-table-projection.js +29 -28
package/view/view-aggregated.js
CHANGED
|
@@ -2,67 +2,69 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ViewAggregated = void 0;
|
|
4
4
|
exports.ViewAggregated = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
name: 'ViewAggregated',
|
|
6
|
+
slug: 'view_aggregated',
|
|
7
|
+
category: 'view',
|
|
8
|
+
display_name: 'Aggregated View',
|
|
9
|
+
description: 'View with GROUP BY and aggregate functions. Useful for summary/reporting views.',
|
|
10
|
+
parameter_schema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
source_table_id: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
format: 'uuid',
|
|
16
|
+
description: 'UUID of the source table'
|
|
17
17
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
group_by_fields: {
|
|
19
|
+
type: 'array',
|
|
20
|
+
items: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
format: 'column-ref'
|
|
22
23
|
},
|
|
23
|
-
|
|
24
|
+
description: 'Field names to group by'
|
|
24
25
|
},
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
aggregates: {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
function: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
enum: [
|
|
34
|
+
'COUNT',
|
|
35
|
+
'SUM',
|
|
36
|
+
'AVG',
|
|
37
|
+
'MIN',
|
|
38
|
+
'MAX'
|
|
38
39
|
]
|
|
39
40
|
},
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
field: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
format: 'column-ref',
|
|
44
|
+
description: 'Field to aggregate (or * for COUNT)'
|
|
43
45
|
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
alias: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Output column name'
|
|
47
49
|
}
|
|
48
50
|
},
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
required: [
|
|
52
|
+
'function',
|
|
53
|
+
'alias'
|
|
52
54
|
]
|
|
53
55
|
},
|
|
54
|
-
|
|
56
|
+
description: 'Array of aggregate specifications'
|
|
55
57
|
}
|
|
56
58
|
},
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
required: [
|
|
60
|
+
'source_table_id',
|
|
61
|
+
'group_by_fields',
|
|
62
|
+
'aggregates'
|
|
61
63
|
]
|
|
62
64
|
},
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
tags: [
|
|
66
|
+
'view',
|
|
67
|
+
'aggregate',
|
|
68
|
+
'reporting'
|
|
67
69
|
]
|
|
68
70
|
};
|
package/view/view-composite.js
CHANGED
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ViewComposite = void 0;
|
|
4
4
|
exports.ViewComposite = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
name: 'ViewComposite',
|
|
6
|
+
slug: 'view_composite',
|
|
7
|
+
category: 'view',
|
|
8
|
+
display_name: 'Composite View',
|
|
9
|
+
description: 'Advanced view using composite AST for the query. Use when other node types are insufficient (CTEs, UNIONs, complex subqueries, etc.).',
|
|
10
|
+
parameter_schema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
query_ast: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
description: 'Composite SELECT query AST (JSONB)'
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
required: [
|
|
19
|
+
'query_ast'
|
|
20
20
|
]
|
|
21
21
|
},
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
tags: [
|
|
23
|
+
'view',
|
|
24
|
+
'advanced',
|
|
25
|
+
'composite',
|
|
26
|
+
'ast'
|
|
27
27
|
]
|
|
28
28
|
};
|
|
@@ -2,51 +2,52 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ViewFilteredTable = void 0;
|
|
4
4
|
exports.ViewFilteredTable = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
name: 'ViewFilteredTable',
|
|
6
|
+
slug: 'view_filtered_table',
|
|
7
|
+
category: 'view',
|
|
8
|
+
display_name: 'Filtered Table',
|
|
9
|
+
description: 'Table projection with an Authz* filter baked into the view definition. The view only returns records matching the filter.',
|
|
10
|
+
parameter_schema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
source_table_id: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
format: 'uuid',
|
|
16
|
+
description: 'UUID of the source table'
|
|
17
17
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
filter_type: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Authz* node type name (e.g., AuthzDirectOwner, AuthzPublishable)'
|
|
21
21
|
},
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
filter_data: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
description: 'Parameters for the Authz* filter type'
|
|
25
25
|
},
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
field_ids: {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
format: 'uuid'
|
|
31
31
|
},
|
|
32
|
-
|
|
32
|
+
description: 'Optional array of field UUIDs to include (alternative to field_names)'
|
|
33
33
|
},
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
field_names: {
|
|
35
|
+
type: 'array',
|
|
36
|
+
items: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
format: 'column-ref'
|
|
38
39
|
},
|
|
39
|
-
|
|
40
|
+
description: 'Optional array of field names to include (alternative to field_ids)'
|
|
40
41
|
}
|
|
41
42
|
},
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
required: [
|
|
44
|
+
'source_table_id',
|
|
45
|
+
'filter_type'
|
|
45
46
|
]
|
|
46
47
|
},
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
tags: [
|
|
49
|
+
'view',
|
|
50
|
+
'filter',
|
|
51
|
+
'authz'
|
|
51
52
|
]
|
|
52
53
|
};
|
|
@@ -2,85 +2,89 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ViewJoinedTables = void 0;
|
|
4
4
|
exports.ViewJoinedTables = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
name: 'ViewJoinedTables',
|
|
6
|
+
slug: 'view_joined_tables',
|
|
7
|
+
category: 'view',
|
|
8
|
+
display_name: 'Joined Tables',
|
|
9
|
+
description: 'View that joins multiple tables together. Supports INNER, LEFT, RIGHT, and FULL joins.',
|
|
10
|
+
parameter_schema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
primary_table_id: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
format: 'uuid',
|
|
16
|
+
description: 'UUID of the primary (left-most) table'
|
|
17
17
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
primary_columns: {
|
|
19
|
+
type: 'array',
|
|
20
|
+
items: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
format: 'column-ref'
|
|
22
23
|
},
|
|
23
|
-
|
|
24
|
+
description: 'Optional array of column names to include from the primary table'
|
|
24
25
|
},
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
joins: {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
table_id: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
format: 'uuid',
|
|
34
|
+
description: 'UUID of the joined table'
|
|
34
35
|
},
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
join_type: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
enum: [
|
|
39
|
+
'INNER',
|
|
40
|
+
'LEFT',
|
|
41
|
+
'RIGHT',
|
|
42
|
+
'FULL'
|
|
42
43
|
]
|
|
43
44
|
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
primary_field: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
format: 'column-ref',
|
|
48
|
+
description: 'Field on primary table'
|
|
47
49
|
},
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
50
|
+
join_field: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
format: 'column-ref',
|
|
53
|
+
description: 'Field on joined table'
|
|
51
54
|
},
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
columns: {
|
|
56
|
+
type: 'array',
|
|
57
|
+
items: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
format: 'column-ref'
|
|
56
60
|
},
|
|
57
|
-
|
|
61
|
+
description: 'Optional column names to include from this joined table'
|
|
58
62
|
}
|
|
59
63
|
},
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
required: [
|
|
65
|
+
'table_id',
|
|
66
|
+
'primary_field',
|
|
67
|
+
'join_field'
|
|
64
68
|
]
|
|
65
69
|
},
|
|
66
|
-
|
|
70
|
+
description: 'Array of join specifications'
|
|
67
71
|
},
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
field_ids: {
|
|
73
|
+
type: 'array',
|
|
74
|
+
items: {
|
|
75
|
+
type: 'string',
|
|
76
|
+
format: 'uuid'
|
|
73
77
|
},
|
|
74
|
-
|
|
78
|
+
description: 'Optional array of field UUIDs to include (alternative to per-table columns)'
|
|
75
79
|
}
|
|
76
80
|
},
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
required: [
|
|
82
|
+
'primary_table_id',
|
|
83
|
+
'joins'
|
|
80
84
|
]
|
|
81
85
|
},
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
tags: [
|
|
87
|
+
'view',
|
|
88
|
+
'join'
|
|
85
89
|
]
|
|
86
90
|
};
|
|
@@ -2,41 +2,42 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ViewTableProjection = void 0;
|
|
4
4
|
exports.ViewTableProjection = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
name: 'ViewTableProjection',
|
|
6
|
+
slug: 'view_table_projection',
|
|
7
|
+
category: 'view',
|
|
8
|
+
display_name: 'Table Projection',
|
|
9
|
+
description: 'Simple column selection from a single source table. Projects all or specific fields.',
|
|
10
|
+
parameter_schema: {
|
|
11
|
+
type: 'object',
|
|
12
|
+
properties: {
|
|
13
|
+
source_table_id: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
format: 'uuid',
|
|
16
|
+
description: 'UUID of the source table to project from'
|
|
17
17
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
field_ids: {
|
|
19
|
+
type: 'array',
|
|
20
|
+
items: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
format: 'uuid'
|
|
23
23
|
},
|
|
24
|
-
|
|
24
|
+
description: 'Optional array of field UUIDs to include (all fields if omitted)'
|
|
25
25
|
},
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
field_names: {
|
|
27
|
+
type: 'array',
|
|
28
|
+
items: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
format: 'column-ref'
|
|
30
31
|
},
|
|
31
|
-
|
|
32
|
+
description: 'Optional array of field names to include (alternative to field_ids)'
|
|
32
33
|
}
|
|
33
34
|
},
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
required: [
|
|
36
|
+
'source_table_id'
|
|
36
37
|
]
|
|
37
38
|
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
tags: [
|
|
40
|
+
'view',
|
|
41
|
+
'projection'
|
|
41
42
|
]
|
|
42
43
|
};
|