node-type-registry 0.48.0 → 0.49.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 CHANGED
@@ -135,6 +135,17 @@ Common issues and solutions for pgpm, PostgreSQL, and testing.
135
135
 
136
136
  * [constructive-skills](https://github.com/constructive-io/constructive-skills): **📖 Platform documentation and AI agent skills** — feature catalog, blueprint reference, SDK guides (i18n, billing, limits, events, uploads, security, entities, search, AI), and deployment guides.
137
137
 
138
+ Install skills for AI coding agents:
139
+
140
+ ```bash
141
+ # All platform skills (security, blueprints, codegen, billing, etc.)
142
+ npx skills add constructive-io/constructive-skills
143
+
144
+ # Individual repo skills (pgpm, testing, CLI, search, etc.)
145
+ npx skills add https://github.com/constructive-io/constructive --skill pgpm
146
+ npx skills add https://github.com/constructive-io/constructive --skill constructive-testing
147
+ ```
148
+
138
149
  ## Credits
139
150
 
140
151
  **🛠 Built by the [Constructive](https://constructive.io) team — creators of modular Postgres tooling for secure, composable backends. If you like our work, contribute on [GitHub](https://github.com/constructive-io).**
@@ -0,0 +1,2 @@
1
+ import type { NodeTypeDefinition } from '../types';
2
+ export declare const DataDenormalized: NodeTypeDefinition;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataDenormalized = void 0;
4
+ exports.DataDenormalized = {
5
+ name: 'DataDenormalized',
6
+ slug: 'data_denormalized',
7
+ category: 'data',
8
+ display_name: 'Denormalized Field',
9
+ description: 'Creates INSERT and UPDATE triggers that copy field values from a referenced (parent) table into the current table whenever the FK changes. Used to denormalize frequently-read columns (e.g. database_id on junction tables) so that RLS and queries can filter locally without joining.',
10
+ parameter_schema: {
11
+ type: 'object',
12
+ properties: {
13
+ field: {
14
+ type: 'string',
15
+ format: 'column-ref',
16
+ description: 'FK field on this table that references the parent row (e.g. view_id)'
17
+ },
18
+ set_fields: {
19
+ type: 'array',
20
+ items: {
21
+ type: 'string',
22
+ format: 'column-ref'
23
+ },
24
+ description: 'Field names on this table to be populated from the parent (e.g. ["database_id"])'
25
+ },
26
+ ref_field: {
27
+ type: 'string',
28
+ format: 'column-ref',
29
+ description: 'Field on the parent table that is the FK target (e.g. id)'
30
+ },
31
+ ref_fields: {
32
+ type: 'array',
33
+ items: {
34
+ type: 'string',
35
+ format: 'column-ref'
36
+ },
37
+ description: 'Field names on the parent table to copy from (e.g. ["database_id"])'
38
+ },
39
+ use_updates: {
40
+ type: 'boolean',
41
+ description: 'If true, also creates an UPDATE trigger so changes to the FK re-copy values',
42
+ default: true
43
+ },
44
+ update_defaults: {
45
+ type: 'boolean',
46
+ description: 'If true, sets the default value of set_fields to uuid_nil() so they are populated by the trigger',
47
+ default: true
48
+ },
49
+ func_name: {
50
+ type: 'string',
51
+ description: 'Custom function name suffix (defaults to the FK field name)'
52
+ },
53
+ func_order: {
54
+ type: 'integer',
55
+ description: 'Trigger ordering (0-padded). Lower numbers fire first',
56
+ default: 0
57
+ }
58
+ },
59
+ required: [
60
+ 'field',
61
+ 'set_fields',
62
+ 'ref_field',
63
+ 'ref_fields'
64
+ ]
65
+ },
66
+ tags: [
67
+ 'trigger',
68
+ 'denormalization',
69
+ 'schema'
70
+ ]
71
+ };
package/data/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { CheckLessThan } from './check-less-than';
3
3
  export { CheckNotEqual } from './check-not-equal';
4
4
  export { CheckOneOf } from './check-one-of';
5
5
  export { DataBulk } from './data-bulk';
6
+ export { DataDenormalized } from './data-denormalized';
6
7
  export { DataCompositeField } from './data-composite-field';
7
8
  export { DataDirectOwner } from './data-direct-owner';
8
9
  export { DataEntityMembership } from './data-entity-membership';
package/data/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TableUserSettings = exports.TableUserProfiles = exports.TableOrganizationSettings = exports.SearchVector = exports.SearchUnified = exports.SearchTrgm = exports.SearchSpatialAggregate = exports.SearchSpatial = exports.SearchFullText = exports.SearchBm25 = exports.DataTimestamps = exports.DataTags = exports.DataStatusField = exports.DataSoftDelete = exports.DataSlug = exports.DataRealtime = exports.DataPublishable = exports.DataPeoplestamps = exports.DataOwnershipInEntity = exports.DataOwnedFields = exports.DataMemberOwner = exports.DataJsonb = exports.DataInheritFromParent = exports.DataInflection = exports.DataImmutableFields = exports.DataId = exports.DataI18n = exports.DataForceCurrentUser = exports.DataEntityMembership = exports.DataDirectOwner = exports.DataCompositeField = exports.DataBulk = exports.CheckOneOf = exports.CheckNotEqual = exports.CheckLessThan = exports.CheckGreaterThan = void 0;
3
+ exports.TableUserSettings = exports.TableUserProfiles = exports.TableOrganizationSettings = exports.SearchVector = exports.SearchUnified = exports.SearchTrgm = exports.SearchSpatialAggregate = exports.SearchSpatial = exports.SearchFullText = exports.SearchBm25 = exports.DataTimestamps = exports.DataTags = exports.DataStatusField = exports.DataSoftDelete = exports.DataSlug = exports.DataRealtime = exports.DataPublishable = exports.DataPeoplestamps = exports.DataOwnershipInEntity = exports.DataOwnedFields = exports.DataMemberOwner = exports.DataJsonb = exports.DataInheritFromParent = exports.DataInflection = exports.DataImmutableFields = exports.DataId = exports.DataI18n = exports.DataForceCurrentUser = exports.DataEntityMembership = exports.DataDirectOwner = exports.DataCompositeField = exports.DataDenormalized = exports.DataBulk = exports.CheckOneOf = exports.CheckNotEqual = exports.CheckLessThan = exports.CheckGreaterThan = void 0;
4
4
  var check_greater_than_1 = require("./check-greater-than");
5
5
  Object.defineProperty(exports, "CheckGreaterThan", { enumerable: true, get: function () { return check_greater_than_1.CheckGreaterThan; } });
6
6
  var check_less_than_1 = require("./check-less-than");
@@ -11,6 +11,8 @@ var check_one_of_1 = require("./check-one-of");
11
11
  Object.defineProperty(exports, "CheckOneOf", { enumerable: true, get: function () { return check_one_of_1.CheckOneOf; } });
12
12
  var data_bulk_1 = require("./data-bulk");
13
13
  Object.defineProperty(exports, "DataBulk", { enumerable: true, get: function () { return data_bulk_1.DataBulk; } });
14
+ var data_denormalized_1 = require("./data-denormalized");
15
+ Object.defineProperty(exports, "DataDenormalized", { enumerable: true, get: function () { return data_denormalized_1.DataDenormalized; } });
14
16
  var data_composite_field_1 = require("./data-composite-field");
15
17
  Object.defineProperty(exports, "DataCompositeField", { enumerable: true, get: function () { return data_composite_field_1.DataCompositeField; } });
16
18
  var data_direct_owner_1 = require("./data-direct-owner");
@@ -0,0 +1,2 @@
1
+ import type { NodeTypeDefinition } from '../types';
2
+ export declare const DataDenormalized: NodeTypeDefinition;
@@ -0,0 +1,68 @@
1
+ export const DataDenormalized = {
2
+ name: 'DataDenormalized',
3
+ slug: 'data_denormalized',
4
+ category: 'data',
5
+ display_name: 'Denormalized Field',
6
+ description: 'Creates INSERT and UPDATE triggers that copy field values from a referenced (parent) table into the current table whenever the FK changes. Used to denormalize frequently-read columns (e.g. database_id on junction tables) so that RLS and queries can filter locally without joining.',
7
+ parameter_schema: {
8
+ type: 'object',
9
+ properties: {
10
+ field: {
11
+ type: 'string',
12
+ format: 'column-ref',
13
+ description: 'FK field on this table that references the parent row (e.g. view_id)'
14
+ },
15
+ set_fields: {
16
+ type: 'array',
17
+ items: {
18
+ type: 'string',
19
+ format: 'column-ref'
20
+ },
21
+ description: 'Field names on this table to be populated from the parent (e.g. ["database_id"])'
22
+ },
23
+ ref_field: {
24
+ type: 'string',
25
+ format: 'column-ref',
26
+ description: 'Field on the parent table that is the FK target (e.g. id)'
27
+ },
28
+ ref_fields: {
29
+ type: 'array',
30
+ items: {
31
+ type: 'string',
32
+ format: 'column-ref'
33
+ },
34
+ description: 'Field names on the parent table to copy from (e.g. ["database_id"])'
35
+ },
36
+ use_updates: {
37
+ type: 'boolean',
38
+ description: 'If true, also creates an UPDATE trigger so changes to the FK re-copy values',
39
+ default: true
40
+ },
41
+ update_defaults: {
42
+ type: 'boolean',
43
+ description: 'If true, sets the default value of set_fields to uuid_nil() so they are populated by the trigger',
44
+ default: true
45
+ },
46
+ func_name: {
47
+ type: 'string',
48
+ description: 'Custom function name suffix (defaults to the FK field name)'
49
+ },
50
+ func_order: {
51
+ type: 'integer',
52
+ description: 'Trigger ordering (0-padded). Lower numbers fire first',
53
+ default: 0
54
+ }
55
+ },
56
+ required: [
57
+ 'field',
58
+ 'set_fields',
59
+ 'ref_field',
60
+ 'ref_fields'
61
+ ]
62
+ },
63
+ tags: [
64
+ 'trigger',
65
+ 'denormalization',
66
+ 'schema'
67
+ ]
68
+ };
@@ -3,6 +3,7 @@ export { CheckLessThan } from './check-less-than';
3
3
  export { CheckNotEqual } from './check-not-equal';
4
4
  export { CheckOneOf } from './check-one-of';
5
5
  export { DataBulk } from './data-bulk';
6
+ export { DataDenormalized } from './data-denormalized';
6
7
  export { DataCompositeField } from './data-composite-field';
7
8
  export { DataDirectOwner } from './data-direct-owner';
8
9
  export { DataEntityMembership } from './data-entity-membership';
package/esm/data/index.js CHANGED
@@ -3,6 +3,7 @@ export { CheckLessThan } from './check-less-than';
3
3
  export { CheckNotEqual } from './check-not-equal';
4
4
  export { CheckOneOf } from './check-one-of';
5
5
  export { DataBulk } from './data-bulk';
6
+ export { DataDenormalized } from './data-denormalized';
6
7
  export { DataCompositeField } from './data-composite-field';
7
8
  export { DataDirectOwner } from './data-direct-owner';
8
9
  export { DataEntityMembership } from './data-entity-membership';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-type-registry",
3
- "version": "0.48.0",
3
+ "version": "0.49.0",
4
4
  "description": "Node type definitions for the Constructive blueprint system. Single source of truth for all Authz*, Data*, Relation*, and View* node types.",
5
5
  "author": "Constructive <developers@constructive.io>",
6
6
  "main": "index.js",
@@ -47,5 +47,5 @@
47
47
  "registry",
48
48
  "graphile"
49
49
  ],
50
- "gitHead": "d6a34a51d5e889443c2345c80ccfcea050875bda"
50
+ "gitHead": "6d810d1b800a6e70ef25749415b69de17b066e50"
51
51
  }