@happyvertical/smrt-core 0.42.6 → 0.43.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.
Files changed (134) hide show
  1. package/AGENTS.md +39 -43
  2. package/agents/collection-reads.md +40 -0
  3. package/agents/data-query.md +21 -0
  4. package/agents/latest-related.md +35 -0
  5. package/agents/memory.md +16 -0
  6. package/agents/schema-paths.md +29 -15
  7. package/dist/browser.js +2 -2
  8. package/dist/cascade.d.ts +7 -6
  9. package/dist/cascade.d.ts.map +1 -1
  10. package/dist/cascade.js +19 -21
  11. package/dist/cascade.js.map +1 -1
  12. package/dist/class.d.ts +17 -0
  13. package/dist/class.d.ts.map +1 -1
  14. package/dist/class.js +30 -0
  15. package/dist/class.js.map +1 -1
  16. package/dist/collection.d.ts +164 -3
  17. package/dist/collection.d.ts.map +1 -1
  18. package/dist/collection.js +345 -10
  19. package/dist/collection.js.map +1 -1
  20. package/dist/decorators/index.d.ts +33 -15
  21. package/dist/decorators/index.d.ts.map +1 -1
  22. package/dist/decorators/index.js +16 -11
  23. package/dist/decorators/index.js.map +1 -1
  24. package/dist/generators/rest.d.ts.map +1 -1
  25. package/dist/generators/rest.js +10 -2
  26. package/dist/generators/rest.js.map +1 -1
  27. package/dist/generators/tool-schema.d.ts +14 -0
  28. package/dist/generators/tool-schema.d.ts.map +1 -1
  29. package/dist/generators/tool-schema.js +13 -1
  30. package/dist/generators/tool-schema.js.map +1 -1
  31. package/dist/index.d.ts +1 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +3 -2
  34. package/dist/interceptors.d.ts +2 -1
  35. package/dist/interceptors.d.ts.map +1 -1
  36. package/dist/interceptors.js.map +1 -1
  37. package/dist/manifest/static-manifest.d.ts.map +1 -1
  38. package/dist/manifest/static-manifest.js +53 -1
  39. package/dist/manifest/static-manifest.js.map +1 -1
  40. package/dist/manifest/store.js +1 -1
  41. package/dist/manifest/store.js.map +1 -1
  42. package/dist/manifest.json +62 -1
  43. package/dist/migrations/differ.d.ts +2 -0
  44. package/dist/migrations/differ.d.ts.map +1 -1
  45. package/dist/migrations/differ.js +75 -0
  46. package/dist/migrations/differ.js.map +1 -1
  47. package/dist/migrations/generator.d.ts.map +1 -1
  48. package/dist/migrations/generator.js +19 -2
  49. package/dist/migrations/generator.js.map +1 -1
  50. package/dist/migrations/orchestrate.d.ts.map +1 -1
  51. package/dist/migrations/orchestrate.js +4 -1
  52. package/dist/migrations/orchestrate.js.map +1 -1
  53. package/dist/object.d.ts +4 -4
  54. package/dist/object.js +4 -4
  55. package/dist/object.js.map +1 -1
  56. package/dist/prebuild/index.d.ts.map +1 -1
  57. package/dist/prebuild/index.js +9 -0
  58. package/dist/prebuild/index.js.map +1 -1
  59. package/dist/registry/schema-builder.d.ts +6 -0
  60. package/dist/registry/schema-builder.d.ts.map +1 -1
  61. package/dist/registry/schema-builder.js +78 -8
  62. package/dist/registry/schema-builder.js.map +1 -1
  63. package/dist/registry.d.ts +5 -7
  64. package/dist/registry.d.ts.map +1 -1
  65. package/dist/registry.js +6 -8
  66. package/dist/registry.js.map +1 -1
  67. package/dist/runtime/types.d.ts +2 -2
  68. package/dist/runtime/types.d.ts.map +1 -1
  69. package/dist/scanner/manifest-generator.d.ts.map +1 -1
  70. package/dist/scanner/manifest-generator.js +62 -18
  71. package/dist/scanner/manifest-generator.js.map +1 -1
  72. package/dist/scanner/types.d.ts +5 -1
  73. package/dist/scanner/types.d.ts.map +1 -1
  74. package/dist/scanner/types.js.map +1 -1
  75. package/dist/schema/ddl/base-strategy.d.ts.map +1 -1
  76. package/dist/schema/ddl/base-strategy.js +2 -0
  77. package/dist/schema/ddl/base-strategy.js.map +1 -1
  78. package/dist/schema/ddl/duckdb-strategy.d.ts +1 -0
  79. package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
  80. package/dist/schema/ddl/duckdb-strategy.js +17 -1
  81. package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
  82. package/dist/schema/ddl/postgres-strategy.js +1 -1
  83. package/dist/schema/foreign-key-ddl.d.ts +9 -0
  84. package/dist/schema/foreign-key-ddl.d.ts.map +1 -0
  85. package/dist/schema/foreign-key-ddl.js +53 -0
  86. package/dist/schema/foreign-key-ddl.js.map +1 -0
  87. package/dist/schema/foreign-key-planner.d.ts +18 -0
  88. package/dist/schema/foreign-key-planner.d.ts.map +1 -0
  89. package/dist/schema/foreign-key-planner.js +109 -0
  90. package/dist/schema/foreign-key-planner.js.map +1 -0
  91. package/dist/schema/foreign-key-policy.d.ts +21 -0
  92. package/dist/schema/foreign-key-policy.d.ts.map +1 -0
  93. package/dist/schema/foreign-key-policy.js +41 -0
  94. package/dist/schema/foreign-key-policy.js.map +1 -0
  95. package/dist/schema/generator.d.ts +3 -0
  96. package/dist/schema/generator.d.ts.map +1 -1
  97. package/dist/schema/generator.js +54 -10
  98. package/dist/schema/generator.js.map +1 -1
  99. package/dist/schema/index.d.ts +3 -0
  100. package/dist/schema/index.d.ts.map +1 -1
  101. package/dist/schema/index.js +4 -1
  102. package/dist/schema/manifest-schema.d.ts.map +1 -1
  103. package/dist/schema/manifest-schema.js +20 -3
  104. package/dist/schema/manifest-schema.js.map +1 -1
  105. package/dist/schema/schema-aggregator.d.ts +7 -1
  106. package/dist/schema/schema-aggregator.d.ts.map +1 -1
  107. package/dist/schema/schema-aggregator.js +54 -9
  108. package/dist/schema/schema-aggregator.js.map +1 -1
  109. package/dist/schema/schema-manager.d.ts +1 -6
  110. package/dist/schema/schema-manager.d.ts.map +1 -1
  111. package/dist/schema/schema-manager.js +26 -30
  112. package/dist/schema/schema-manager.js.map +1 -1
  113. package/dist/schema/types.d.ts +8 -5
  114. package/dist/schema/types.d.ts.map +1 -1
  115. package/dist/schema/utils.d.ts.map +1 -1
  116. package/dist/schema/utils.js +14 -1
  117. package/dist/schema/utils.js.map +1 -1
  118. package/dist/schema.js +4 -1
  119. package/dist/smrt-knowledge.json +63 -8
  120. package/dist/testing/database.d.ts +11 -1
  121. package/dist/testing/database.d.ts.map +1 -1
  122. package/dist/testing/database.js +80 -9
  123. package/dist/testing/database.js.map +1 -1
  124. package/dist/vite-plugin/index.d.ts.map +1 -1
  125. package/dist/vite-plugin/index.js +12 -3
  126. package/dist/vite-plugin/index.js.map +1 -1
  127. package/dist/vite-plugin/sveltekit-generator.d.ts.map +1 -1
  128. package/dist/vite-plugin/sveltekit-generator.js +24 -3
  129. package/dist/vite-plugin/sveltekit-generator.js.map +1 -1
  130. package/dist/vite-plugin/web-collections.d.ts +3 -1
  131. package/dist/vite-plugin/web-collections.d.ts.map +1 -1
  132. package/dist/vite-plugin/web-collections.js +24 -4
  133. package/dist/vite-plugin/web-collections.js.map +1 -1
  134. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreign-key-policy.d.ts","sourceRoot":"","sources":["../../src/schema/foreign-key-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD,mEAAmE;AACnE,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,gBAAgB,GAAG,SAAS,CAM9B;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GACd,gBAAgB,CAQlB;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,EAAE;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAelD"}
@@ -0,0 +1,41 @@
1
+ //#region src/schema/foreign-key-policy.ts
2
+ var FOREIGN_KEY_ACTIONS = /* @__PURE__ */ new Set([
3
+ "CASCADE",
4
+ "SET NULL",
5
+ "RESTRICT",
6
+ "NO ACTION"
7
+ ]);
8
+ /** Normalize decorator action spelling into the SQL vocabulary. */
9
+ function normalizeForeignKeyAction(value) {
10
+ if (typeof value !== "string") return void 0;
11
+ const normalized = value.trim().toUpperCase().replace(/_/g, " ");
12
+ return FOREIGN_KEY_ACTIONS.has(normalized) ? normalized : void 0;
13
+ }
14
+ /** Validate an externally supplied action rather than interpolating raw SQL. */
15
+ function requireForeignKeyAction(value, context) {
16
+ const normalized = normalizeForeignKeyAction(value);
17
+ if (!normalized) throw new Error(`Invalid foreign-key action ${JSON.stringify(value)} for ${context}. Expected CASCADE, SET NULL, RESTRICT, or NO ACTION.`);
18
+ return normalized;
19
+ }
20
+ /**
21
+ * Resolve the one delete policy shared by app-side cascade and database DDL.
22
+ *
23
+ * A same-package reference that identifies the referencing row defaults to
24
+ * CASCADE. Tenant ids are scope markers rather than ownership edges, and all
25
+ * other references default to SQL NO ACTION.
26
+ */
27
+ function resolveForeignKeyDeleteAction(options) {
28
+ const declaredAction = options.declared === void 0 ? void 0 : requireForeignKeyAction(options.declared, "ON DELETE");
29
+ if (declaredAction) return {
30
+ action: declaredAction,
31
+ declared: true
32
+ };
33
+ return {
34
+ action: !options.isTenantIdField && options.isConflictColumn ? "CASCADE" : "NO ACTION",
35
+ declared: false
36
+ };
37
+ }
38
+ //#endregion
39
+ export { normalizeForeignKeyAction, requireForeignKeyAction, resolveForeignKeyDeleteAction };
40
+
41
+ //# sourceMappingURL=foreign-key-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreign-key-policy.js","names":[],"sources":["../../src/schema/foreign-key-policy.ts"],"sourcesContent":["import type { ForeignKeyAction } from './types.js';\n\nconst FOREIGN_KEY_ACTIONS = new Set<ForeignKeyAction>([\n 'CASCADE',\n 'SET NULL',\n 'RESTRICT',\n 'NO ACTION',\n]);\n\n/** Normalize decorator action spelling into the SQL vocabulary. */\nexport function normalizeForeignKeyAction(\n value: unknown,\n): ForeignKeyAction | undefined {\n if (typeof value !== 'string') return undefined;\n const normalized = value.trim().toUpperCase().replace(/_/g, ' ');\n return FOREIGN_KEY_ACTIONS.has(normalized as ForeignKeyAction)\n ? (normalized as ForeignKeyAction)\n : undefined;\n}\n\n/** Validate an externally supplied action rather than interpolating raw SQL. */\nexport function requireForeignKeyAction(\n value: unknown,\n context: string,\n): ForeignKeyAction {\n const normalized = normalizeForeignKeyAction(value);\n if (!normalized) {\n throw new Error(\n `Invalid foreign-key action ${JSON.stringify(value)} for ${context}. Expected CASCADE, SET NULL, RESTRICT, or NO ACTION.`,\n );\n }\n return normalized;\n}\n\n/**\n * Resolve the one delete policy shared by app-side cascade and database DDL.\n *\n * A same-package reference that identifies the referencing row defaults to\n * CASCADE. Tenant ids are scope markers rather than ownership edges, and all\n * other references default to SQL NO ACTION.\n */\nexport function resolveForeignKeyDeleteAction(options: {\n declared?: unknown;\n isConflictColumn: boolean;\n isTenantIdField: boolean;\n}): { action: ForeignKeyAction; declared: boolean } {\n const declaredAction =\n options.declared === undefined\n ? undefined\n : requireForeignKeyAction(options.declared, 'ON DELETE');\n if (declaredAction) {\n return { action: declaredAction, declared: true };\n }\n return {\n action:\n !options.isTenantIdField && options.isConflictColumn\n ? 'CASCADE'\n : 'NO ACTION',\n declared: false,\n };\n}\n"],"mappings":";AAEA,IAAM,sCAAsB,IAAI,IAAsB;CACpD;CACA;CACA;CACA;AACF,CAAC;;AAGD,SAAgB,0BACd,OAC8B;CAC9B,IAAI,OAAO,UAAU,UAAU,OAAO,KAAA;CACtC,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,MAAM,GAAG;CAC/D,OAAO,oBAAoB,IAAI,UAA8B,IACxD,aACD,KAAA;AACN;;AAGA,SAAgB,wBACd,OACA,SACkB;CAClB,MAAM,aAAa,0BAA0B,KAAK;CAClD,IAAI,CAAC,YACH,MAAM,IAAI,MACR,8BAA8B,KAAK,UAAU,KAAK,EAAE,OAAO,QAAQ,sDACrE;CAEF,OAAO;AACT;;;;;;;;AASA,SAAgB,8BAA8B,SAIM;CAClD,MAAM,iBACJ,QAAQ,aAAa,KAAA,IACjB,KAAA,IACA,wBAAwB,QAAQ,UAAU,WAAW;CAC3D,IAAI,gBACF,OAAO;EAAE,QAAQ;EAAgB,UAAU;CAAK;CAElD,OAAO;EACL,QACE,CAAC,QAAQ,mBAAmB,QAAQ,mBAChC,YACA;EACN,UAAU;CACZ;AACF"}
@@ -57,7 +57,9 @@ type SchemaGeneratorConfig = {
57
57
  };
58
58
  getDescendants(baseClassName: string): string[];
59
59
  getAllFields(className: string): Promise<Map<string, RegistryField>>;
60
+ getFields?(className: string): Map<string, RegistryField>;
60
61
  getSTIBase?(className: string): string | null;
62
+ getTableName?(className: string): string | undefined;
61
63
  };
62
64
  };
63
65
  export declare class SchemaGenerator {
@@ -71,6 +73,7 @@ export declare class SchemaGenerator {
71
73
  private shouldEmitDefault;
72
74
  private getRegistryTargetIdColumnType;
73
75
  private reconcileRegistryForeignKeyColumnTypes;
76
+ private applyRegistryForeignKeys;
74
77
  /**
75
78
  * Whether an existing index already leads with `leadingColumns`, in order.
76
79
  *
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/schema/generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/schema/generator.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { resolveForeignKeyDeleteAction } from "./foreign-key-policy.js";
1
2
  import { classnameToTablename } from "../utils/naming.js";
2
3
  import { formatDefaultValue, quoteIdentifier, quoteStringLiteral } from "./sql-identifiers.js";
3
4
  import { assertIdentifierFits, enforceIdentifierLimits } from "./index-utils.js";
@@ -67,6 +68,44 @@ var SchemaGenerator = class {
67
68
  };
68
69
  }
69
70
  }
71
+ applyRegistryForeignKeys(columns, fields, conflictColumns, registry) {
72
+ const conflictSet = new Set(conflictColumns);
73
+ for (const [fieldName, field] of fields.entries()) {
74
+ if (field.type !== "foreignKey" || !field.related) continue;
75
+ const columnName = this.toSnakeCase(fieldName);
76
+ const column = columns[columnName];
77
+ if (!column) continue;
78
+ if (field._meta?.constraint === false) {
79
+ column.foreignKey = void 0;
80
+ continue;
81
+ }
82
+ const isTenantIdField = field.__tenancy?.isTenantIdField === true || field._meta?.__tenancy?.isTenantIdField === true;
83
+ if (isTenantIdField) {
84
+ column.foreignKey = void 0;
85
+ continue;
86
+ }
87
+ const [targetName, declaredTargetColumn] = field.related.split(".");
88
+ const targetBase = registry?.getSTIBase?.(targetName) || targetName;
89
+ const registeredTargetTable = registry?.getTableName?.(targetBase);
90
+ if (registry && !registeredTargetTable) {
91
+ column.foreignKey = void 0;
92
+ continue;
93
+ }
94
+ const targetColumn = declaredTargetColumn || Array.from(registry?.getFields?.(targetBase)?.entries() || []).find(([, targetField]) => targetField._meta?.primaryKey === true)?.[0] || "id";
95
+ const targetTable = registeredTargetTable || this.classNameToTableName(targetBase);
96
+ const { action } = resolveForeignKeyDeleteAction({
97
+ declared: field._meta?.onDelete,
98
+ isConflictColumn: conflictSet.has(columnName),
99
+ isTenantIdField
100
+ });
101
+ column.foreignKey = {
102
+ table: targetTable,
103
+ column: this.toSnakeCase(targetColumn),
104
+ onDelete: action,
105
+ onUpdate: "CASCADE"
106
+ };
107
+ }
108
+ }
70
109
  /**
71
110
  * Whether an existing index already leads with `leadingColumns`, in order.
72
111
  *
@@ -570,7 +609,7 @@ var SchemaGenerator = class {
570
609
  description: field._meta?.description
571
610
  };
572
611
  if (field._meta?.default !== void 0 && this.shouldEmitDefault(field, field._meta.default)) columnDef.defaultValue = field._meta.default;
573
- if (field.type === "foreignKey") {
612
+ if (field.type === "foreignKey" && field._meta?.constraint !== false && field._meta?.__tenancy?.isTenantIdField !== true) {
574
613
  const relatedName = field.related;
575
614
  const onDeleteAction = field._meta?.onDelete;
576
615
  if (relatedName) columnDef.foreignKey = {
@@ -596,9 +635,11 @@ var SchemaGenerator = class {
596
635
  description: "Last update timestamp"
597
636
  };
598
637
  this.reconcileRegistryForeignKeyColumnTypes(columns, fields, config?.registry);
638
+ const resolvedConflict = this.resolveConflictTarget("cti", columns, config);
639
+ this.applyRegistryForeignKeys(columns, fields, resolvedConflict.conflictColumns, config?.registry);
599
640
  const indexes = [];
600
641
  if (!hasCustomPK) {
601
- const { conflictColumns, tenantColumn } = this.resolveConflictTarget("cti", columns, config);
642
+ const { conflictColumns, tenantColumn } = resolvedConflict;
602
643
  if (!this.conflictColumnsArePrimaryKey(conflictColumns, columns)) indexes.push({
603
644
  name: conflictIndexName(tableName, conflictColumns, tenantColumn),
604
645
  columns: conflictColumns,
@@ -623,7 +664,7 @@ var SchemaGenerator = class {
623
664
  indexes,
624
665
  triggers: [],
625
666
  foreignKeys: this.extractForeignKeys(columns),
626
- dependencies: [],
667
+ dependencies: this.extractForeignKeys(columns).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
627
668
  version: createHash("sha256").update(JSON.stringify(columns)).digest("hex").substring(0, 8),
628
669
  packageName: "runtime",
629
670
  baseClass: "SmrtObject"
@@ -755,7 +796,7 @@ var SchemaGenerator = class {
755
796
  description: field._meta?.description
756
797
  };
757
798
  if (field._meta?.default !== void 0 && this.shouldEmitDefault(field, field._meta.default)) columnDef.defaultValue = field._meta.default;
758
- if (field.type === "foreignKey") {
799
+ if (field.type === "foreignKey" && field._meta?.constraint !== false && field._meta?.__tenancy?.isTenantIdField !== true) {
759
800
  const relatedName = field.related;
760
801
  const onDeleteAction = field._meta?.onDelete;
761
802
  if (relatedName) columnDef.foreignKey = {
@@ -781,9 +822,11 @@ var SchemaGenerator = class {
781
822
  defaultValue: "current_timestamp",
782
823
  description: "Last update timestamp"
783
824
  };
825
+ const resolvedConflict = this.resolveConflictTarget("sti", columns, config);
784
826
  for (const className of allClassNames) {
785
827
  const classFields = await ObjectRegistry.getAllFields(className);
786
828
  this.reconcileRegistryForeignKeyColumnTypes(columns, classFields, ObjectRegistry);
829
+ this.applyRegistryForeignKeys(columns, classFields, resolvedConflict.conflictColumns, ObjectRegistry);
787
830
  }
788
831
  const indexes = [];
789
832
  this.emitStiConflictIndex(indexes, columns, tableName, config);
@@ -819,7 +862,7 @@ var SchemaGenerator = class {
819
862
  indexes,
820
863
  triggers: [],
821
864
  foreignKeys: this.extractForeignKeys(columns),
822
- dependencies: [],
865
+ dependencies: this.extractForeignKeys(columns).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
823
866
  version: createHash("sha256").update(JSON.stringify({
824
867
  columns,
825
868
  baseClassName,
@@ -949,8 +992,8 @@ var SchemaGenerator = class {
949
992
  jsonPath: idx.jsonPath
950
993
  })),
951
994
  triggers: [],
952
- foreignKeys: [],
953
- dependencies: [],
995
+ foreignKeys: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)),
996
+ dependencies: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
954
997
  version: "",
955
998
  packageName: ""
956
999
  };
@@ -1046,8 +1089,8 @@ var SchemaGenerator = class {
1046
1089
  jsonPath: idx.jsonPath
1047
1090
  })),
1048
1091
  triggers: [],
1049
- foreignKeys: [],
1050
- dependencies: [],
1092
+ foreignKeys: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)),
1093
+ dependencies: this.extractForeignKeys(this.convertManifestColumnsToSchemaColumns(columns)).map((foreignKey) => foreignKey.referencesTable).filter((dependency) => dependency !== tableName),
1051
1094
  version: "",
1052
1095
  packageName: ""
1053
1096
  };
@@ -1108,7 +1151,8 @@ var SchemaGenerator = class {
1108
1151
  referenceKind: col.referenceKind,
1109
1152
  notNull: col.notNull,
1110
1153
  unique: col.unique,
1111
- defaultValue: col.default
1154
+ defaultValue: col.default,
1155
+ foreignKey: col.foreignKey ? { ...col.foreignKey } : void 0
1112
1156
  };
1113
1157
  return columns;
1114
1158
  }