node-type-registry 0.2.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/LICENSE +23 -0
- package/README.md +87 -0
- package/authz/authz-allow-all.d.ts +2 -0
- package/authz/authz-allow-all.js +15 -0
- package/authz/authz-composite.d.ts +2 -0
- package/authz/authz-composite.js +39 -0
- package/authz/authz-deny-all.d.ts +2 -0
- package/authz/authz-deny-all.js +15 -0
- package/authz/authz-direct-owner-any.d.ts +2 -0
- package/authz/authz-direct-owner-any.js +26 -0
- package/authz/authz-direct-owner.d.ts +2 -0
- package/authz/authz-direct-owner.js +23 -0
- package/authz/authz-entity-membership.d.ts +2 -0
- package/authz/authz-entity-membership.js +49 -0
- package/authz/authz-member-list.d.ts +2 -0
- package/authz/authz-member-list.js +23 -0
- package/authz/authz-membership-check.d.ts +2 -0
- package/authz/authz-membership-check.js +45 -0
- package/authz/authz-org-hierarchy.d.ts +2 -0
- package/authz/authz-org-hierarchy.js +41 -0
- package/authz/authz-peer-ownership.d.ts +2 -0
- package/authz/authz-peer-ownership.js +49 -0
- package/authz/authz-publishable.d.ts +2 -0
- package/authz/authz-publishable.js +31 -0
- package/authz/authz-related-entity-membership.d.ts +2 -0
- package/authz/authz-related-entity-membership.js +71 -0
- package/authz/authz-related-member-list.d.ts +2 -0
- package/authz/authz-related-member-list.js +43 -0
- package/authz/authz-related-peer-ownership.d.ts +2 -0
- package/authz/authz-related-peer-ownership.js +75 -0
- package/authz/authz-temporal.d.ts +2 -0
- package/authz/authz-temporal.js +46 -0
- package/authz/index.d.ts +15 -0
- package/authz/index.js +33 -0
- package/codegen/generate-seed.d.ts +23 -0
- package/codegen/generate-seed.js +155 -0
- package/data/data-bm25.d.ts +2 -0
- package/data/data-bm25.js +43 -0
- package/data/data-direct-owner.d.ts +2 -0
- package/data/data-direct-owner.js +31 -0
- package/data/data-embedding.d.ts +2 -0
- package/data/data-embedding.js +82 -0
- package/data/data-entity-membership.d.ts +2 -0
- package/data/data-entity-membership.js +31 -0
- package/data/data-full-text-search.d.ts +2 -0
- package/data/data-full-text-search.js +61 -0
- package/data/data-id.d.ts +2 -0
- package/data/data-id.js +21 -0
- package/data/data-job-trigger.d.ts +2 -0
- package/data/data-job-trigger.js +111 -0
- package/data/data-jsonb.d.ts +2 -0
- package/data/data-jsonb.js +35 -0
- package/data/data-ownership-in-entity.d.ts +2 -0
- package/data/data-ownership-in-entity.js +26 -0
- package/data/data-peoplestamps.d.ts +2 -0
- package/data/data-peoplestamps.js +26 -0
- package/data/data-postgis-aggregate.d.ts +2 -0
- package/data/data-postgis-aggregate.js +94 -0
- package/data/data-postgis.d.ts +2 -0
- package/data/data-postgis.js +65 -0
- package/data/data-publishable.d.ts +2 -0
- package/data/data-publishable.js +21 -0
- package/data/data-search.d.ts +2 -0
- package/data/data-search.js +158 -0
- package/data/data-soft-delete.d.ts +2 -0
- package/data/data-soft-delete.js +21 -0
- package/data/data-status-field.d.ts +2 -0
- package/data/data-status-field.js +42 -0
- package/data/data-tags.d.ts +2 -0
- package/data/data-tags.js +30 -0
- package/data/data-timestamps.d.ts +2 -0
- package/data/data-timestamps.js +21 -0
- package/data/data-trgm.d.ts +2 -0
- package/data/data-trgm.js +26 -0
- package/data/index.d.ts +19 -0
- package/data/index.js +41 -0
- package/esm/authz/authz-allow-all.d.ts +2 -0
- package/esm/authz/authz-allow-all.js +12 -0
- package/esm/authz/authz-composite.d.ts +2 -0
- package/esm/authz/authz-composite.js +36 -0
- package/esm/authz/authz-deny-all.d.ts +2 -0
- package/esm/authz/authz-deny-all.js +12 -0
- package/esm/authz/authz-direct-owner-any.d.ts +2 -0
- package/esm/authz/authz-direct-owner-any.js +23 -0
- package/esm/authz/authz-direct-owner.d.ts +2 -0
- package/esm/authz/authz-direct-owner.js +20 -0
- package/esm/authz/authz-entity-membership.d.ts +2 -0
- package/esm/authz/authz-entity-membership.js +46 -0
- package/esm/authz/authz-member-list.d.ts +2 -0
- package/esm/authz/authz-member-list.js +20 -0
- package/esm/authz/authz-membership-check.d.ts +2 -0
- package/esm/authz/authz-membership-check.js +42 -0
- package/esm/authz/authz-org-hierarchy.d.ts +2 -0
- package/esm/authz/authz-org-hierarchy.js +38 -0
- package/esm/authz/authz-peer-ownership.d.ts +2 -0
- package/esm/authz/authz-peer-ownership.js +46 -0
- package/esm/authz/authz-publishable.d.ts +2 -0
- package/esm/authz/authz-publishable.js +28 -0
- package/esm/authz/authz-related-entity-membership.d.ts +2 -0
- package/esm/authz/authz-related-entity-membership.js +68 -0
- package/esm/authz/authz-related-member-list.d.ts +2 -0
- package/esm/authz/authz-related-member-list.js +40 -0
- package/esm/authz/authz-related-peer-ownership.d.ts +2 -0
- package/esm/authz/authz-related-peer-ownership.js +72 -0
- package/esm/authz/authz-temporal.d.ts +2 -0
- package/esm/authz/authz-temporal.js +43 -0
- package/esm/authz/index.d.ts +15 -0
- package/esm/authz/index.js +15 -0
- package/esm/codegen/generate-seed.d.ts +23 -0
- package/esm/codegen/generate-seed.js +153 -0
- package/esm/data/data-bm25.d.ts +2 -0
- package/esm/data/data-bm25.js +40 -0
- package/esm/data/data-direct-owner.d.ts +2 -0
- package/esm/data/data-direct-owner.js +28 -0
- package/esm/data/data-embedding.d.ts +2 -0
- package/esm/data/data-embedding.js +79 -0
- package/esm/data/data-entity-membership.d.ts +2 -0
- package/esm/data/data-entity-membership.js +28 -0
- package/esm/data/data-full-text-search.d.ts +2 -0
- package/esm/data/data-full-text-search.js +58 -0
- package/esm/data/data-id.d.ts +2 -0
- package/esm/data/data-id.js +18 -0
- package/esm/data/data-job-trigger.d.ts +2 -0
- package/esm/data/data-job-trigger.js +108 -0
- package/esm/data/data-jsonb.d.ts +2 -0
- package/esm/data/data-jsonb.js +32 -0
- package/esm/data/data-ownership-in-entity.d.ts +2 -0
- package/esm/data/data-ownership-in-entity.js +23 -0
- package/esm/data/data-peoplestamps.d.ts +2 -0
- package/esm/data/data-peoplestamps.js +23 -0
- package/esm/data/data-postgis-aggregate.d.ts +2 -0
- package/esm/data/data-postgis-aggregate.js +91 -0
- package/esm/data/data-postgis.d.ts +2 -0
- package/esm/data/data-postgis.js +62 -0
- package/esm/data/data-publishable.d.ts +2 -0
- package/esm/data/data-publishable.js +18 -0
- package/esm/data/data-search.d.ts +2 -0
- package/esm/data/data-search.js +155 -0
- package/esm/data/data-soft-delete.d.ts +2 -0
- package/esm/data/data-soft-delete.js +18 -0
- package/esm/data/data-status-field.d.ts +2 -0
- package/esm/data/data-status-field.js +39 -0
- package/esm/data/data-tags.d.ts +2 -0
- package/esm/data/data-tags.js +27 -0
- package/esm/data/data-timestamps.d.ts +2 -0
- package/esm/data/data-timestamps.js +18 -0
- package/esm/data/data-trgm.d.ts +2 -0
- package/esm/data/data-trgm.js +23 -0
- package/esm/data/index.d.ts +19 -0
- package/esm/data/index.js +19 -0
- package/esm/field/field-immutable.d.ts +2 -0
- package/esm/field/field-immutable.js +21 -0
- package/esm/field/field-inflection.d.ts +2 -0
- package/esm/field/field-inflection.js +29 -0
- package/esm/field/field-owned.d.ts +2 -0
- package/esm/field/field-owned.js +36 -0
- package/esm/field/field-slug.d.ts +2 -0
- package/esm/field/field-slug.js +26 -0
- package/esm/field/index.d.ts +4 -0
- package/esm/field/index.js +4 -0
- package/esm/index.d.ts +9 -0
- package/esm/index.js +21 -0
- package/esm/preset.d.ts +23 -0
- package/esm/preset.js +5 -0
- package/esm/relation/index.d.ts +4 -0
- package/esm/relation/index.js +4 -0
- package/esm/relation/relation-belongs-to.d.ts +2 -0
- package/esm/relation/relation-belongs-to.js +48 -0
- package/esm/relation/relation-has-many.d.ts +2 -0
- package/esm/relation/relation-has-many.js +48 -0
- package/esm/relation/relation-has-one.d.ts +2 -0
- package/esm/relation/relation-has-one.js +48 -0
- package/esm/relation/relation-many-to-many.d.ts +2 -0
- package/esm/relation/relation-many-to-many.js +92 -0
- package/esm/table/index.d.ts +3 -0
- package/esm/table/index.js +3 -0
- package/esm/table/table-organization-settings.d.ts +2 -0
- package/esm/table/table-organization-settings.js +12 -0
- package/esm/table/table-user-profiles.d.ts +2 -0
- package/esm/table/table-user-profiles.js +12 -0
- package/esm/table/table-user-settings.d.ts +2 -0
- package/esm/table/table-user-settings.js +12 -0
- package/esm/types.d.ts +61 -0
- package/esm/types.js +1 -0
- package/esm/view/index.d.ts +5 -0
- package/esm/view/index.js +5 -0
- package/esm/view/view-aggregated.d.ts +2 -0
- package/esm/view/view-aggregated.js +61 -0
- package/esm/view/view-composite.d.ts +2 -0
- package/esm/view/view-composite.js +20 -0
- package/esm/view/view-filtered-table.d.ts +2 -0
- package/esm/view/view-filtered-table.js +45 -0
- package/esm/view/view-joined-tables.d.ts +2 -0
- package/esm/view/view-joined-tables.js +80 -0
- package/esm/view/view-table-projection.d.ts +2 -0
- package/esm/view/view-table-projection.js +36 -0
- package/field/field-immutable.d.ts +2 -0
- package/field/field-immutable.js +24 -0
- package/field/field-inflection.d.ts +2 -0
- package/field/field-inflection.js +32 -0
- package/field/field-owned.d.ts +2 -0
- package/field/field-owned.js +39 -0
- package/field/field-slug.d.ts +2 -0
- package/field/field-slug.js +29 -0
- package/field/index.d.ts +4 -0
- package/field/index.js +11 -0
- package/index.d.ts +9 -0
- package/index.js +60 -0
- package/package.json +49 -0
- package/preset.d.ts +23 -0
- package/preset.js +8 -0
- package/relation/index.d.ts +4 -0
- package/relation/index.js +11 -0
- package/relation/relation-belongs-to.d.ts +2 -0
- package/relation/relation-belongs-to.js +51 -0
- package/relation/relation-has-many.d.ts +2 -0
- package/relation/relation-has-many.js +51 -0
- package/relation/relation-has-one.d.ts +2 -0
- package/relation/relation-has-one.js +51 -0
- package/relation/relation-many-to-many.d.ts +2 -0
- package/relation/relation-many-to-many.js +95 -0
- package/table/index.d.ts +3 -0
- package/table/index.js +9 -0
- package/table/table-organization-settings.d.ts +2 -0
- package/table/table-organization-settings.js +15 -0
- package/table/table-user-profiles.d.ts +2 -0
- package/table/table-user-profiles.js +15 -0
- package/table/table-user-settings.d.ts +2 -0
- package/table/table-user-settings.js +15 -0
- package/types.d.ts +61 -0
- package/types.js +2 -0
- package/view/index.d.ts +5 -0
- package/view/index.js +13 -0
- package/view/view-aggregated.d.ts +2 -0
- package/view/view-aggregated.js +64 -0
- package/view/view-composite.d.ts +2 -0
- package/view/view-composite.js +23 -0
- package/view/view-filtered-table.d.ts +2 -0
- package/view/view-filtered-table.js +48 -0
- package/view/view-joined-tables.d.ts +2 -0
- package/view/view-joined-tables.js +83 -0
- package/view/view-table-projection.d.ts +2 -0
- package/view/view-table-projection.js +39 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const AuthzRelatedMemberList = {
|
|
2
|
+
name: 'AuthzRelatedMemberList',
|
|
3
|
+
slug: 'authz_related_member_list',
|
|
4
|
+
category: 'authz',
|
|
5
|
+
display_name: 'Related Member List',
|
|
6
|
+
description: 'Array membership check in a related table.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"owned_schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Schema of the related table"
|
|
13
|
+
},
|
|
14
|
+
"owned_table": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Name of the related table"
|
|
17
|
+
},
|
|
18
|
+
"owned_table_key": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "Array column in related table"
|
|
21
|
+
},
|
|
22
|
+
"owned_table_ref_key": {
|
|
23
|
+
"type": "string",
|
|
24
|
+
"description": "FK column in related table"
|
|
25
|
+
},
|
|
26
|
+
"this_object_key": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "PK column in protected table"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"required": [
|
|
32
|
+
"owned_schema",
|
|
33
|
+
"owned_table",
|
|
34
|
+
"owned_table_key",
|
|
35
|
+
"owned_table_ref_key",
|
|
36
|
+
"this_object_key"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
tags: ['ownership', 'authz'],
|
|
40
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export const AuthzRelatedPeerOwnership = {
|
|
2
|
+
name: 'AuthzRelatedPeerOwnership',
|
|
3
|
+
slug: 'authz_related_peer_ownership',
|
|
4
|
+
category: 'authz',
|
|
5
|
+
display_name: 'Related Peer Ownership',
|
|
6
|
+
description: 'Peer visibility through shared entity membership via a related table. Like AuthzPeerOwnership but the owning user is resolved through a FK JOIN to a related table. Combines SPRT self-join with object table JOIN.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"entity_field": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Column name on protected table referencing the related table (e.g., message_id)"
|
|
13
|
+
},
|
|
14
|
+
"membership_type": {
|
|
15
|
+
"type": [
|
|
16
|
+
"integer",
|
|
17
|
+
"string"
|
|
18
|
+
],
|
|
19
|
+
"description": "Scope: 1=app, 2=org, 3=group (or string name resolved via membership_types_module)"
|
|
20
|
+
},
|
|
21
|
+
"obj_table_id": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"format": "uuid",
|
|
24
|
+
"description": "UUID of the related table (alternative to obj_schema/obj_table)"
|
|
25
|
+
},
|
|
26
|
+
"obj_schema": {
|
|
27
|
+
"type": "string",
|
|
28
|
+
"description": "Schema of the related table (or use obj_table_id)"
|
|
29
|
+
},
|
|
30
|
+
"obj_table": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Name of the related table (or use obj_table_id)"
|
|
33
|
+
},
|
|
34
|
+
"obj_field_id": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"format": "uuid",
|
|
37
|
+
"description": "UUID of field on related table containing the owner user ID (alternative to obj_field)"
|
|
38
|
+
},
|
|
39
|
+
"obj_field": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Field name on related table containing the owner user ID (e.g., sender_id)"
|
|
42
|
+
},
|
|
43
|
+
"obj_ref_field": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Field on related table to select for matching entity_field (defaults to id)"
|
|
46
|
+
},
|
|
47
|
+
"permission": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"description": "Single permission name to check on the current user membership (resolved to bitstring mask)"
|
|
50
|
+
},
|
|
51
|
+
"permissions": {
|
|
52
|
+
"type": "array",
|
|
53
|
+
"items": {
|
|
54
|
+
"type": "string"
|
|
55
|
+
},
|
|
56
|
+
"description": "Multiple permission names to check on the current user membership (ORed together into mask)"
|
|
57
|
+
},
|
|
58
|
+
"is_admin": {
|
|
59
|
+
"type": "boolean",
|
|
60
|
+
"description": "If true, require is_admin flag on current user membership"
|
|
61
|
+
},
|
|
62
|
+
"is_owner": {
|
|
63
|
+
"type": "boolean",
|
|
64
|
+
"description": "If true, require is_owner flag on current user membership"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"required": [
|
|
68
|
+
"entity_field"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
tags: ['membership', 'peer', 'authz'],
|
|
72
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export const AuthzTemporal = {
|
|
2
|
+
name: 'AuthzTemporal',
|
|
3
|
+
slug: 'authz_temporal',
|
|
4
|
+
category: 'authz',
|
|
5
|
+
display_name: 'Temporal Access',
|
|
6
|
+
description: 'Time-window based access control. Restricts access based on valid_from and/or valid_until timestamps. At least one of valid_from_field or valid_until_field must be provided.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"valid_from_field": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Column for start time (at least one of valid_from_field or valid_until_field required)"
|
|
13
|
+
},
|
|
14
|
+
"valid_until_field": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Column for end time (at least one of valid_from_field or valid_until_field required)"
|
|
17
|
+
},
|
|
18
|
+
"valid_from_inclusive": {
|
|
19
|
+
"type": "boolean",
|
|
20
|
+
"description": "Include start boundary",
|
|
21
|
+
"default": true
|
|
22
|
+
},
|
|
23
|
+
"valid_until_inclusive": {
|
|
24
|
+
"type": "boolean",
|
|
25
|
+
"description": "Include end boundary",
|
|
26
|
+
"default": false
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"anyOf": [
|
|
30
|
+
{
|
|
31
|
+
"required": [
|
|
32
|
+
"valid_from_field"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"required": [
|
|
37
|
+
"valid_until_field"
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
tags: ['temporal', 'authz'],
|
|
43
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { AuthzDirectOwner } from './authz-direct-owner';
|
|
2
|
+
export { AuthzDirectOwnerAny } from './authz-direct-owner-any';
|
|
3
|
+
export { AuthzMembership } from './authz-membership-check';
|
|
4
|
+
export { AuthzEntityMembership } from './authz-entity-membership';
|
|
5
|
+
export { AuthzRelatedEntityMembership } from './authz-related-entity-membership';
|
|
6
|
+
export { AuthzOrgHierarchy } from './authz-org-hierarchy';
|
|
7
|
+
export { AuthzTemporal } from './authz-temporal';
|
|
8
|
+
export { AuthzPublishable } from './authz-publishable';
|
|
9
|
+
export { AuthzMemberList } from './authz-member-list';
|
|
10
|
+
export { AuthzRelatedMemberList } from './authz-related-member-list';
|
|
11
|
+
export { AuthzAllowAll } from './authz-allow-all';
|
|
12
|
+
export { AuthzDenyAll } from './authz-deny-all';
|
|
13
|
+
export { AuthzComposite } from './authz-composite';
|
|
14
|
+
export { AuthzPeerOwnership } from './authz-peer-ownership';
|
|
15
|
+
export { AuthzRelatedPeerOwnership } from './authz-related-peer-ownership';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { AuthzDirectOwner } from './authz-direct-owner';
|
|
2
|
+
export { AuthzDirectOwnerAny } from './authz-direct-owner-any';
|
|
3
|
+
export { AuthzMembership } from './authz-membership-check';
|
|
4
|
+
export { AuthzEntityMembership } from './authz-entity-membership';
|
|
5
|
+
export { AuthzRelatedEntityMembership } from './authz-related-entity-membership';
|
|
6
|
+
export { AuthzOrgHierarchy } from './authz-org-hierarchy';
|
|
7
|
+
export { AuthzTemporal } from './authz-temporal';
|
|
8
|
+
export { AuthzPublishable } from './authz-publishable';
|
|
9
|
+
export { AuthzMemberList } from './authz-member-list';
|
|
10
|
+
export { AuthzRelatedMemberList } from './authz-related-member-list';
|
|
11
|
+
export { AuthzAllowAll } from './authz-allow-all';
|
|
12
|
+
export { AuthzDenyAll } from './authz-deny-all';
|
|
13
|
+
export { AuthzComposite } from './authz-composite';
|
|
14
|
+
export { AuthzPeerOwnership } from './authz-peer-ownership';
|
|
15
|
+
export { AuthzRelatedPeerOwnership } from './authz-related-peer-ownership';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate SQL seed scripts from TypeScript node type definitions.
|
|
3
|
+
*
|
|
4
|
+
* Uses pgsql-deparser to produce individual INSERT statements per node type,
|
|
5
|
+
* suitable for use as separate pgpm migration files.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx ts-node src/codegen/generate-seed.ts [--outdir <dir>] [--single]
|
|
9
|
+
*
|
|
10
|
+
* --outdir <dir> Directory to write individual SQL files (default: stdout)
|
|
11
|
+
* --single Emit a single combined seed.sql instead of per-node files
|
|
12
|
+
*
|
|
13
|
+
* Examples:
|
|
14
|
+
* # Print all INSERT statements to stdout
|
|
15
|
+
* npx ts-node src/codegen/generate-seed.ts
|
|
16
|
+
*
|
|
17
|
+
* # Generate individual migration files
|
|
18
|
+
* npx ts-node src/codegen/generate-seed.ts --outdir ./deploy/seed
|
|
19
|
+
*
|
|
20
|
+
* # Generate a single combined seed file
|
|
21
|
+
* npx ts-node src/codegen/generate-seed.ts --single --outdir ./deploy
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate SQL seed scripts from TypeScript node type definitions.
|
|
3
|
+
*
|
|
4
|
+
* Uses pgsql-deparser to produce individual INSERT statements per node type,
|
|
5
|
+
* suitable for use as separate pgpm migration files.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* npx ts-node src/codegen/generate-seed.ts [--outdir <dir>] [--single]
|
|
9
|
+
*
|
|
10
|
+
* --outdir <dir> Directory to write individual SQL files (default: stdout)
|
|
11
|
+
* --single Emit a single combined seed.sql instead of per-node files
|
|
12
|
+
*
|
|
13
|
+
* Examples:
|
|
14
|
+
* # Print all INSERT statements to stdout
|
|
15
|
+
* npx ts-node src/codegen/generate-seed.ts
|
|
16
|
+
*
|
|
17
|
+
* # Generate individual migration files
|
|
18
|
+
* npx ts-node src/codegen/generate-seed.ts --outdir ./deploy/seed
|
|
19
|
+
*
|
|
20
|
+
* # Generate a single combined seed file
|
|
21
|
+
* npx ts-node src/codegen/generate-seed.ts --single --outdir ./deploy
|
|
22
|
+
*/
|
|
23
|
+
import { writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
24
|
+
import { join } from 'path';
|
|
25
|
+
import { deparse } from 'pgsql-deparser';
|
|
26
|
+
import { ast, nodes } from '@pgsql/utils';
|
|
27
|
+
import { allNodeTypes } from '../index';
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// AST helpers
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
const astr = (val) => nodes.aConst({ sval: ast.string({ sval: val }) });
|
|
32
|
+
const makeCast = (arg, typeName) => ({
|
|
33
|
+
TypeCast: {
|
|
34
|
+
arg,
|
|
35
|
+
typeName: {
|
|
36
|
+
names: [{ String: { sval: typeName } }],
|
|
37
|
+
typemod: -1,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const makeArrayExpr = (elements) => ({
|
|
42
|
+
A_ArrayExpr: { elements },
|
|
43
|
+
});
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Build a single INSERT statement for one node type
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
function buildInsertStmt(nt) {
|
|
48
|
+
const cols = [
|
|
49
|
+
'name',
|
|
50
|
+
'slug',
|
|
51
|
+
'category',
|
|
52
|
+
'display_name',
|
|
53
|
+
'description',
|
|
54
|
+
'parameter_schema',
|
|
55
|
+
'tags',
|
|
56
|
+
];
|
|
57
|
+
const vals = [
|
|
58
|
+
astr(nt.name),
|
|
59
|
+
astr(nt.slug),
|
|
60
|
+
astr(nt.category),
|
|
61
|
+
astr(nt.display_name),
|
|
62
|
+
astr(nt.description),
|
|
63
|
+
makeCast(astr(JSON.stringify(nt.parameter_schema)), 'jsonb'),
|
|
64
|
+
makeArrayExpr(nt.tags.map((t) => astr(t))),
|
|
65
|
+
];
|
|
66
|
+
return {
|
|
67
|
+
RawStmt: {
|
|
68
|
+
stmt: {
|
|
69
|
+
InsertStmt: {
|
|
70
|
+
relation: {
|
|
71
|
+
schemaname: 'metaschema_public',
|
|
72
|
+
relname: 'node_type_registry',
|
|
73
|
+
inh: true,
|
|
74
|
+
relpersistence: 'p',
|
|
75
|
+
},
|
|
76
|
+
cols: cols.map((name) => nodes.resTarget({ name })),
|
|
77
|
+
selectStmt: {
|
|
78
|
+
SelectStmt: {
|
|
79
|
+
valuesLists: [
|
|
80
|
+
{
|
|
81
|
+
List: { items: vals },
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
op: 'SETOP_NONE',
|
|
85
|
+
limitOption: 'LIMIT_OPTION_DEFAULT',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
onConflictClause: {
|
|
89
|
+
action: 'ONCONFLICT_NOTHING',
|
|
90
|
+
infer: {
|
|
91
|
+
indexElems: [
|
|
92
|
+
{
|
|
93
|
+
IndexElem: {
|
|
94
|
+
name: 'slug',
|
|
95
|
+
ordering: 'SORTBY_DEFAULT',
|
|
96
|
+
nulls_ordering: 'SORTBY_NULLS_DEFAULT',
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
override: 'OVERRIDING_NOT_SET',
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
stmt_len: 1,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// CLI
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
function main() {
|
|
113
|
+
const args = process.argv.slice(2);
|
|
114
|
+
const outdirIdx = args.indexOf('--outdir');
|
|
115
|
+
const outdir = outdirIdx !== -1 ? args[outdirIdx + 1] : undefined;
|
|
116
|
+
const single = args.includes('--single');
|
|
117
|
+
if (single) {
|
|
118
|
+
// Emit all INSERT statements as a single SQL string
|
|
119
|
+
const stmts = allNodeTypes.map(buildInsertStmt);
|
|
120
|
+
const sql = deparse(stmts);
|
|
121
|
+
if (outdir) {
|
|
122
|
+
if (!existsSync(outdir))
|
|
123
|
+
mkdirSync(outdir, { recursive: true });
|
|
124
|
+
writeFileSync(join(outdir, 'seed.sql'), sql + '\n');
|
|
125
|
+
console.log(`Wrote ${allNodeTypes.length} node types to ${join(outdir, 'seed.sql')}`);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
process.stdout.write(sql + '\n');
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Emit individual SQL files per node type
|
|
133
|
+
const stmts = allNodeTypes.map((nt) => ({
|
|
134
|
+
nt,
|
|
135
|
+
sql: deparse([buildInsertStmt(nt)]),
|
|
136
|
+
}));
|
|
137
|
+
if (outdir) {
|
|
138
|
+
if (!existsSync(outdir))
|
|
139
|
+
mkdirSync(outdir, { recursive: true });
|
|
140
|
+
for (const { nt, sql } of stmts) {
|
|
141
|
+
const filename = `${nt.slug}.sql`;
|
|
142
|
+
writeFileSync(join(outdir, filename), sql + '\n');
|
|
143
|
+
}
|
|
144
|
+
console.log(`Wrote ${stmts.length} individual migration files to ${outdir}/`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
for (const { nt, sql } of stmts) {
|
|
148
|
+
console.log(`-- ${nt.name} (${nt.slug})`);
|
|
149
|
+
console.log(sql + ';\n');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
main();
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const DataBm25 = {
|
|
2
|
+
name: 'DataBm25',
|
|
3
|
+
slug: 'data_bm25',
|
|
4
|
+
category: 'data',
|
|
5
|
+
display_name: 'BM25 Search',
|
|
6
|
+
description: 'Creates a BM25 index on an existing text column using pg_textsearch. Enables statistical relevance ranking with configurable k1 and b parameters. The BM25 index is auto-detected by graphile-search.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"field_name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Name of existing text column to index with BM25"
|
|
13
|
+
},
|
|
14
|
+
"text_config": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "PostgreSQL text search configuration for BM25",
|
|
17
|
+
"default": "english"
|
|
18
|
+
},
|
|
19
|
+
"k1": {
|
|
20
|
+
"type": "number",
|
|
21
|
+
"description": "BM25 k1 parameter: term frequency saturation (typical: 1.2-2.0)",
|
|
22
|
+
"default": null
|
|
23
|
+
},
|
|
24
|
+
"b": {
|
|
25
|
+
"type": "number",
|
|
26
|
+
"description": "BM25 b parameter: document length normalization (0=none, 1=full, typical: 0.75)",
|
|
27
|
+
"default": null
|
|
28
|
+
},
|
|
29
|
+
"search_score_weight": {
|
|
30
|
+
"type": "number",
|
|
31
|
+
"description": "Weight for this algorithm in composite searchScore",
|
|
32
|
+
"default": 1
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"required": [
|
|
36
|
+
"field_name"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
tags: ['search', 'bm25', 'schema'],
|
|
40
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const DataDirectOwner = {
|
|
2
|
+
name: 'DataDirectOwner',
|
|
3
|
+
slug: 'data_direct_owner',
|
|
4
|
+
category: 'data',
|
|
5
|
+
display_name: 'Ownership',
|
|
6
|
+
description: 'Adds ownership column for direct user ownership. Enables AuthzDirectOwner authorization.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"owner_field_name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Column name for owner ID",
|
|
13
|
+
"default": "owner_id"
|
|
14
|
+
},
|
|
15
|
+
"include_id": {
|
|
16
|
+
"type": "boolean",
|
|
17
|
+
"description": "If true, also adds a UUID primary key column with auto-generation",
|
|
18
|
+
"default": true
|
|
19
|
+
},
|
|
20
|
+
"include_user_fk": {
|
|
21
|
+
"type": "boolean",
|
|
22
|
+
"description": "If true, adds a foreign key constraint from owner_id to the users table",
|
|
23
|
+
"default": true
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
tags: ['ownership', 'schema'],
|
|
28
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const DataEmbedding = {
|
|
2
|
+
name: 'DataEmbedding',
|
|
3
|
+
slug: 'data_embedding',
|
|
4
|
+
category: 'data',
|
|
5
|
+
display_name: 'Embedding',
|
|
6
|
+
description: 'Adds a vector embedding column with HNSW or IVFFlat index for similarity search. Supports configurable dimensions, distance metrics (cosine, l2, ip), stale tracking strategies (column, null, hash), and automatic job enqueue triggers for embedding generation.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"field_name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Name of the vector column",
|
|
13
|
+
"default": "embedding"
|
|
14
|
+
},
|
|
15
|
+
"dimensions": {
|
|
16
|
+
"type": "integer",
|
|
17
|
+
"description": "Vector dimensions (e.g. 384, 768, 1536, 3072)",
|
|
18
|
+
"default": 768
|
|
19
|
+
},
|
|
20
|
+
"index_method": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"enum": [
|
|
23
|
+
"hnsw",
|
|
24
|
+
"ivfflat"
|
|
25
|
+
],
|
|
26
|
+
"description": "Index type for similarity search",
|
|
27
|
+
"default": "hnsw"
|
|
28
|
+
},
|
|
29
|
+
"metric": {
|
|
30
|
+
"type": "string",
|
|
31
|
+
"enum": [
|
|
32
|
+
"cosine",
|
|
33
|
+
"l2",
|
|
34
|
+
"ip"
|
|
35
|
+
],
|
|
36
|
+
"description": "Distance metric (cosine, l2, ip)",
|
|
37
|
+
"default": "cosine"
|
|
38
|
+
},
|
|
39
|
+
"index_options": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"description": "Index-specific options. HNSW: {m, ef_construction}. IVFFlat: {lists}.",
|
|
42
|
+
"default": {}
|
|
43
|
+
},
|
|
44
|
+
"include_stale_field": {
|
|
45
|
+
"type": "boolean",
|
|
46
|
+
"description": "When stale_strategy is column, adds an embedding_stale boolean field",
|
|
47
|
+
"default": true
|
|
48
|
+
},
|
|
49
|
+
"source_fields": {
|
|
50
|
+
"type": "array",
|
|
51
|
+
"items": {
|
|
52
|
+
"type": "string"
|
|
53
|
+
},
|
|
54
|
+
"description": "Column names that feed the embedding. Used by stale trigger to detect content changes."
|
|
55
|
+
},
|
|
56
|
+
"enqueue_job": {
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"description": "Auto-create trigger that enqueues embedding generation jobs",
|
|
59
|
+
"default": true
|
|
60
|
+
},
|
|
61
|
+
"job_task_name": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"description": "Task identifier for the job queue",
|
|
64
|
+
"default": "generate_embedding"
|
|
65
|
+
},
|
|
66
|
+
"stale_strategy": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"enum": [
|
|
69
|
+
"column",
|
|
70
|
+
"null",
|
|
71
|
+
"hash"
|
|
72
|
+
],
|
|
73
|
+
"description": "Strategy for tracking embedding staleness. column: embedding_stale boolean. null: set embedding to NULL. hash: md5 hash of source fields.",
|
|
74
|
+
"default": "column"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
tags: ['embedding', 'vector', 'ai', 'schema'],
|
|
79
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export const DataEntityMembership = {
|
|
2
|
+
name: 'DataEntityMembership',
|
|
3
|
+
slug: 'data_entity_membership',
|
|
4
|
+
category: 'data',
|
|
5
|
+
display_name: 'Entity Membership',
|
|
6
|
+
description: 'Adds entity reference for organization/group scoping. Enables AuthzEntityMembership, AuthzMembership, AuthzOrgHierarchy authorization.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"entity_field_name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Column name for entity ID",
|
|
13
|
+
"default": "entity_id"
|
|
14
|
+
},
|
|
15
|
+
"include_id": {
|
|
16
|
+
"type": "boolean",
|
|
17
|
+
"description": "If true, also adds a UUID primary key column with auto-generation",
|
|
18
|
+
"default": true
|
|
19
|
+
},
|
|
20
|
+
"include_user_fk": {
|
|
21
|
+
"type": "boolean",
|
|
22
|
+
"description": "If true, adds a foreign key constraint from entity_id to the users table",
|
|
23
|
+
"default": true
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
tags: ['membership', 'schema'],
|
|
28
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const DataFullTextSearch = {
|
|
2
|
+
name: 'DataFullTextSearch',
|
|
3
|
+
slug: 'data_full_text_search',
|
|
4
|
+
category: 'data',
|
|
5
|
+
display_name: 'Full-Text Search',
|
|
6
|
+
description: 'Adds a tsvector column with GIN index and automatic trigger population from source fields. Enables PostgreSQL full-text search with configurable weights and language support. Leverages the existing metaschema full_text_search infrastructure.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"field_name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Name of the tsvector column",
|
|
13
|
+
"default": "search"
|
|
14
|
+
},
|
|
15
|
+
"source_fields": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"items": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"field": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"description": "Name of the source column"
|
|
23
|
+
},
|
|
24
|
+
"weight": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"enum": [
|
|
27
|
+
"A",
|
|
28
|
+
"B",
|
|
29
|
+
"C",
|
|
30
|
+
"D"
|
|
31
|
+
],
|
|
32
|
+
"description": "tsvector weight class (A=highest, D=lowest)",
|
|
33
|
+
"default": "D"
|
|
34
|
+
},
|
|
35
|
+
"lang": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "PostgreSQL text search configuration",
|
|
38
|
+
"default": "english"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"required": [
|
|
42
|
+
"field"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"description": "Source columns that feed the tsvector. Each has a field name, weight (A-D), and language config."
|
|
46
|
+
},
|
|
47
|
+
"search_score_weight": {
|
|
48
|
+
"type": "number",
|
|
49
|
+
"description": "Weight for this algorithm in composite searchScore",
|
|
50
|
+
"default": 1
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"required": [
|
|
54
|
+
"source_fields"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
tags: ['search', 'fts', 'tsvector', 'schema'],
|
|
58
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const DataId = {
|
|
2
|
+
name: 'DataId',
|
|
3
|
+
slug: 'data_id',
|
|
4
|
+
category: 'data',
|
|
5
|
+
display_name: 'Primary Key ID',
|
|
6
|
+
description: 'Adds a UUID primary key column with auto-generation default (uuidv7). This is the standard primary key pattern for all tables.',
|
|
7
|
+
parameter_schema: {
|
|
8
|
+
"type": "object",
|
|
9
|
+
"properties": {
|
|
10
|
+
"field_name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Column name for the primary key",
|
|
13
|
+
"default": "id"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
tags: ['primary_key', 'schema'],
|
|
18
|
+
};
|