@globaltypesystem/gts-ts 0.1.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 (81) hide show
  1. package/.eslintrc.json +16 -0
  2. package/.github/workflows/ci.yml +198 -0
  3. package/.gitmodules +3 -0
  4. package/.prettierrc +7 -0
  5. package/LICENSE +201 -0
  6. package/Makefile +64 -0
  7. package/README.md +298 -0
  8. package/dist/cast.d.ts +9 -0
  9. package/dist/cast.d.ts.map +1 -0
  10. package/dist/cast.js +153 -0
  11. package/dist/cast.js.map +1 -0
  12. package/dist/cli/index.d.ts +3 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +318 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/compatibility.d.ts +11 -0
  17. package/dist/compatibility.d.ts.map +1 -0
  18. package/dist/compatibility.js +176 -0
  19. package/dist/compatibility.js.map +1 -0
  20. package/dist/extract.d.ts +13 -0
  21. package/dist/extract.d.ts.map +1 -0
  22. package/dist/extract.js +194 -0
  23. package/dist/extract.js.map +1 -0
  24. package/dist/gts.d.ts +18 -0
  25. package/dist/gts.d.ts.map +1 -0
  26. package/dist/gts.js +472 -0
  27. package/dist/gts.js.map +1 -0
  28. package/dist/index.d.ts +29 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +97 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/query.d.ts +10 -0
  33. package/dist/query.d.ts.map +1 -0
  34. package/dist/query.js +171 -0
  35. package/dist/query.js.map +1 -0
  36. package/dist/relationships.d.ts +7 -0
  37. package/dist/relationships.d.ts.map +1 -0
  38. package/dist/relationships.js +80 -0
  39. package/dist/relationships.js.map +1 -0
  40. package/dist/server/index.d.ts +2 -0
  41. package/dist/server/index.d.ts.map +1 -0
  42. package/dist/server/index.js +132 -0
  43. package/dist/server/index.js.map +1 -0
  44. package/dist/server/server.d.ts +33 -0
  45. package/dist/server/server.d.ts.map +1 -0
  46. package/dist/server/server.js +678 -0
  47. package/dist/server/server.js.map +1 -0
  48. package/dist/server/types.d.ts +61 -0
  49. package/dist/server/types.d.ts.map +1 -0
  50. package/dist/server/types.js +3 -0
  51. package/dist/server/types.js.map +1 -0
  52. package/dist/store.d.ts +39 -0
  53. package/dist/store.d.ts.map +1 -0
  54. package/dist/store.js +1026 -0
  55. package/dist/store.js.map +1 -0
  56. package/dist/types.d.ts +111 -0
  57. package/dist/types.d.ts.map +1 -0
  58. package/dist/types.js +29 -0
  59. package/dist/types.js.map +1 -0
  60. package/dist/x-gts-ref.d.ts +35 -0
  61. package/dist/x-gts-ref.d.ts.map +1 -0
  62. package/dist/x-gts-ref.js +304 -0
  63. package/dist/x-gts-ref.js.map +1 -0
  64. package/jest.config.js +13 -0
  65. package/package.json +54 -0
  66. package/src/cast.ts +179 -0
  67. package/src/cli/index.ts +315 -0
  68. package/src/compatibility.ts +201 -0
  69. package/src/extract.ts +213 -0
  70. package/src/gts.ts +550 -0
  71. package/src/index.ts +97 -0
  72. package/src/query.ts +191 -0
  73. package/src/relationships.ts +91 -0
  74. package/src/server/index.ts +112 -0
  75. package/src/server/server.ts +771 -0
  76. package/src/server/types.ts +74 -0
  77. package/src/store.ts +1178 -0
  78. package/src/types.ts +138 -0
  79. package/src/x-gts-ref.ts +349 -0
  80. package/tests/gts.test.ts +525 -0
  81. package/tsconfig.json +32 -0
package/dist/query.js ADDED
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GtsQuery = void 0;
4
+ const gts_1 = require("./gts");
5
+ class GtsQuery {
6
+ static query(store, expression, limit = 100) {
7
+ try {
8
+ // Parse the query expression to extract base pattern and filters
9
+ const { basePattern, filters, error } = this.parseQueryExpression(expression);
10
+ if (error) {
11
+ return {
12
+ query: expression,
13
+ count: 0,
14
+ items: [],
15
+ error: error,
16
+ limit: limit,
17
+ };
18
+ }
19
+ const results = [];
20
+ // Iterate through all entities in the store
21
+ for (const [id, entity] of store['byId']) {
22
+ if (results.length >= limit)
23
+ break;
24
+ // Check if ID matches the pattern
25
+ if (!this.matchesIDPattern(id, basePattern)) {
26
+ continue;
27
+ }
28
+ // Check filters
29
+ if (!this.matchesFilters(entity.content, filters)) {
30
+ continue;
31
+ }
32
+ results.push(entity.content);
33
+ }
34
+ return {
35
+ query: expression,
36
+ count: results.length,
37
+ items: results,
38
+ limit: limit,
39
+ };
40
+ }
41
+ catch (error) {
42
+ return {
43
+ query: expression,
44
+ count: 0,
45
+ items: [],
46
+ error: error instanceof Error ? error.message : String(error),
47
+ limit: limit,
48
+ };
49
+ }
50
+ }
51
+ static parseQueryExpression(expr) {
52
+ // Split by '[' to separate base pattern from filters
53
+ const parts = expr.split('[');
54
+ const basePattern = parts[0].trim();
55
+ const filters = new Map();
56
+ if (parts.length > 1) {
57
+ // Extract filter string (remove trailing ])
58
+ let filterStr = parts[1].trim();
59
+ if (!filterStr.endsWith(']')) {
60
+ return {
61
+ basePattern,
62
+ filters,
63
+ error: "Invalid query: missing closing bracket ']'",
64
+ };
65
+ }
66
+ filterStr = filterStr.slice(0, -1);
67
+ // Check if base pattern ends with ~ or ~* (type ID/pattern) - filters not allowed on type queries
68
+ if (basePattern.endsWith('~') || basePattern.endsWith('~*')) {
69
+ return {
70
+ basePattern,
71
+ filters,
72
+ error: 'Invalid query: filters cannot be used with type patterns (ending with ~ or ~*)',
73
+ };
74
+ }
75
+ // Parse filters
76
+ const filterParts = filterStr.split(',');
77
+ for (const part of filterParts) {
78
+ const trimmed = part.trim();
79
+ if (trimmed.includes('=')) {
80
+ const [key, ...valueParts] = trimmed.split('=');
81
+ const value = valueParts
82
+ .join('=')
83
+ .trim()
84
+ .replace(/^["']|["']$/g, '');
85
+ filters.set(key.trim(), value);
86
+ }
87
+ }
88
+ }
89
+ // Validate the pattern
90
+ const isWildcard = basePattern.includes('*');
91
+ const validationError = this.validateQueryPattern(basePattern, isWildcard);
92
+ if (validationError) {
93
+ return {
94
+ basePattern,
95
+ filters,
96
+ error: validationError,
97
+ };
98
+ }
99
+ return { basePattern, filters };
100
+ }
101
+ static validateQueryPattern(basePattern, isWildcard) {
102
+ if (isWildcard) {
103
+ // Wildcard pattern must end with .* or ~*
104
+ if (!basePattern.endsWith('.*') && !basePattern.endsWith('~*')) {
105
+ return 'Invalid query: wildcard patterns must end with .* or ~*';
106
+ }
107
+ // Validate as wildcard pattern
108
+ try {
109
+ // Just check it's a valid pattern format
110
+ if (!basePattern.startsWith('gts.')) {
111
+ return "Invalid query: pattern must start with 'gts.'";
112
+ }
113
+ }
114
+ catch (err) {
115
+ return `Invalid query: ${err}`;
116
+ }
117
+ }
118
+ else {
119
+ // Non-wildcard pattern must be a complete valid GTS ID
120
+ try {
121
+ const result = gts_1.Gts.parseID(basePattern);
122
+ if (!result.ok) {
123
+ return `Invalid query: ${result.error}`;
124
+ }
125
+ // Check if pattern is incomplete (missing version or type)
126
+ // A complete GTS ID must end with a version (v1, v1.2) or ~ for types
127
+ const segments = result.segments || [];
128
+ if (segments.length === 0) {
129
+ return 'Invalid query: GTS ID has no valid segments';
130
+ }
131
+ const lastSeg = segments[segments.length - 1];
132
+ if (!lastSeg.isType && !lastSeg.verMajor) {
133
+ return 'Invalid query: incomplete GTS ID pattern';
134
+ }
135
+ }
136
+ catch (err) {
137
+ return `Invalid query: ${err}`;
138
+ }
139
+ }
140
+ return undefined;
141
+ }
142
+ static matchesIDPattern(entityID, basePattern) {
143
+ // Always use the proper matchIDPattern function which handles wildcards and version matching
144
+ const matchResult = gts_1.Gts.matchIDPattern(entityID, basePattern);
145
+ return matchResult.match;
146
+ }
147
+ static matchesFilters(entityContent, filters) {
148
+ if (filters.size === 0) {
149
+ return true;
150
+ }
151
+ if (!entityContent || typeof entityContent !== 'object') {
152
+ return false;
153
+ }
154
+ for (const [key, value] of filters) {
155
+ const entityValue = String(entityContent[key] ?? '');
156
+ // Support wildcard in filter values
157
+ if (value === '*') {
158
+ // Wildcard matches any non-empty value
159
+ if (!entityValue || entityValue === 'null' || entityValue === 'undefined') {
160
+ return false;
161
+ }
162
+ }
163
+ else if (entityValue !== value) {
164
+ return false;
165
+ }
166
+ }
167
+ return true;
168
+ }
169
+ }
170
+ exports.GtsQuery = GtsQuery;
171
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { RelationshipResult } from './types';
2
+ import { GtsStore } from './store';
3
+ export declare class GtsRelationships {
4
+ static resolveRelationships(store: GtsStore, gtsId: string): RelationshipResult;
5
+ private static findRelationships;
6
+ }
7
+ //# sourceMappingURL=relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnC,qBAAa,gBAAgB;IAC3B,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB;IAyC/E,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA4CjC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GtsRelationships = void 0;
4
+ const gts_1 = require("./gts");
5
+ class GtsRelationships {
6
+ static resolveRelationships(store, gtsId) {
7
+ try {
8
+ const entity = store.get(gtsId);
9
+ if (!entity) {
10
+ return {
11
+ id: gtsId,
12
+ relationships: [],
13
+ brokenReferences: [],
14
+ error: `Entity not found: ${gtsId}`,
15
+ };
16
+ }
17
+ const relationships = new Set();
18
+ const brokenReferences = new Set();
19
+ const visited = new Set();
20
+ this.findRelationships(store, entity.content, relationships, brokenReferences, visited);
21
+ if (entity.schemaId) {
22
+ relationships.add(entity.schemaId);
23
+ const schemaEntity = store.get(entity.schemaId);
24
+ if (!schemaEntity) {
25
+ brokenReferences.add(entity.schemaId);
26
+ }
27
+ }
28
+ return {
29
+ id: gtsId,
30
+ relationships: Array.from(relationships).sort(),
31
+ brokenReferences: Array.from(brokenReferences).sort(),
32
+ };
33
+ }
34
+ catch (error) {
35
+ return {
36
+ id: gtsId,
37
+ relationships: [],
38
+ brokenReferences: [],
39
+ error: error instanceof Error ? error.message : String(error),
40
+ };
41
+ }
42
+ }
43
+ static findRelationships(store, obj, relationships, brokenReferences, visited) {
44
+ if (!obj || typeof obj !== 'object' || visited.has(obj)) {
45
+ return;
46
+ }
47
+ visited.add(obj);
48
+ if ('$ref' in obj && typeof obj['$ref'] === 'string') {
49
+ const ref = obj['$ref'];
50
+ const normalized = ref.startsWith('gts://') ? ref.substring(6) : ref;
51
+ if (gts_1.Gts.isValidGtsID(normalized)) {
52
+ relationships.add(normalized);
53
+ if (!store.get(normalized)) {
54
+ brokenReferences.add(normalized);
55
+ }
56
+ }
57
+ }
58
+ if ('x-gts-ref' in obj && typeof obj['x-gts-ref'] === 'string') {
59
+ const ref = obj['x-gts-ref'];
60
+ if (gts_1.Gts.isValidGtsID(ref)) {
61
+ relationships.add(ref);
62
+ if (!store.get(ref)) {
63
+ brokenReferences.add(ref);
64
+ }
65
+ }
66
+ }
67
+ if (Array.isArray(obj)) {
68
+ for (const item of obj) {
69
+ this.findRelationships(store, item, relationships, brokenReferences, visited);
70
+ }
71
+ }
72
+ else {
73
+ for (const value of Object.values(obj)) {
74
+ this.findRelationships(store, value, relationships, brokenReferences, visited);
75
+ }
76
+ }
77
+ }
78
+ }
79
+ exports.GtsRelationships = GtsRelationships;
80
+ //# sourceMappingURL=relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationships.js","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const commander_1 = require("commander");
37
+ const server_1 = require("./server");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const index_1 = require("../index");
41
+ const program = new commander_1.Command();
42
+ program
43
+ .name('gts-server')
44
+ .description('GTS HTTP Server')
45
+ .version('0.1.0')
46
+ .option('-h, --host <host>', 'Host to bind to', '127.0.0.1')
47
+ .option('-p, --port <port>', 'Port to listen on', '8000')
48
+ .option('-v, --verbose <level>', 'Verbosity level (0=silent, 1=info, 2=debug)', '1')
49
+ .option('--path <path>', 'Path to JSON/schema files to preload')
50
+ .action(async (options) => {
51
+ const config = {
52
+ host: options.host,
53
+ port: parseInt(options.port, 10),
54
+ verbose: parseInt(options.verbose, 10),
55
+ path: options.path,
56
+ };
57
+ console.log(`Starting GTS server on http://${config.host}:${config.port}`);
58
+ const server = new server_1.GtsServer(config);
59
+ // Preload entities from path if provided
60
+ if (config.path) {
61
+ await loadEntitiesFromPath(server, config.path);
62
+ }
63
+ // Handle graceful shutdown
64
+ process.on('SIGINT', async () => {
65
+ console.log('\nShutting down server...');
66
+ await server.stop();
67
+ process.exit(0);
68
+ });
69
+ process.on('SIGTERM', async () => {
70
+ console.log('\nShutting down server...');
71
+ await server.stop();
72
+ process.exit(0);
73
+ });
74
+ // Start the server
75
+ await server.start();
76
+ });
77
+ async function loadEntitiesFromPath(server, dirPath) {
78
+ if (!fs.existsSync(dirPath)) {
79
+ console.warn(`Path does not exist: ${dirPath}`);
80
+ return;
81
+ }
82
+ const stats = fs.statSync(dirPath);
83
+ if (!stats.isDirectory()) {
84
+ console.warn(`Path is not a directory: ${dirPath}`);
85
+ return;
86
+ }
87
+ console.log(`Loading entities from: ${dirPath}`);
88
+ const files = fs.readdirSync(dirPath);
89
+ let loaded = 0;
90
+ let errors = 0;
91
+ for (const file of files) {
92
+ if (!file.endsWith('.json'))
93
+ continue;
94
+ const filePath = path.join(dirPath, file);
95
+ try {
96
+ const content = fs.readFileSync(filePath, 'utf-8');
97
+ const data = JSON.parse(content);
98
+ // Handle arrays of entities
99
+ const entities = Array.isArray(data) ? data : [data];
100
+ for (const entity of entities) {
101
+ try {
102
+ const gtsEntity = (0, index_1.createJsonEntity)(entity);
103
+ if (gtsEntity.id) {
104
+ server['store'].register(entity);
105
+ loaded++;
106
+ if (server['config'].verbose >= 2) {
107
+ console.log(` Loaded: ${gtsEntity.id}`);
108
+ }
109
+ }
110
+ }
111
+ catch (err) {
112
+ errors++;
113
+ if (server['config'].verbose >= 1) {
114
+ console.warn(` Failed to load entity from ${file}: ${err}`);
115
+ }
116
+ }
117
+ }
118
+ }
119
+ catch (err) {
120
+ errors++;
121
+ if (server['config'].verbose >= 1) {
122
+ console.warn(` Failed to read ${file}: ${err}`);
123
+ }
124
+ }
125
+ }
126
+ console.log(`Loaded ${loaded} entities (${errors} errors)`);
127
+ }
128
+ // Run the CLI if this is the main module
129
+ if (require.main === module) {
130
+ program.parse(process.argv);
131
+ }
132
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { ServerConfig } from './types';
2
+ export declare class GtsServer {
3
+ private fastify;
4
+ private store;
5
+ private config;
6
+ constructor(config: ServerConfig);
7
+ private setupMiddleware;
8
+ private registerRoutes;
9
+ private handleGetEntities;
10
+ private handleGetEntity;
11
+ private handleAddEntity;
12
+ private validateSchemaStrict;
13
+ private validateSchemaRefs;
14
+ private handleAddEntities;
15
+ private handleAddSchema;
16
+ private handleValidateID;
17
+ private handleExtractID;
18
+ private handleParseID;
19
+ private handleMatchIDPattern;
20
+ private handleUUID;
21
+ private handleValidateInstance;
22
+ private handleResolveRelationships;
23
+ private handleCompatibility;
24
+ private handleCast;
25
+ private handleQuery;
26
+ private handleAttribute;
27
+ private handleOpenAPI;
28
+ private getOpenAPIPaths;
29
+ private getOpenAPIComponents;
30
+ start(): Promise<void>;
31
+ stop(): Promise<void>;
32
+ }
33
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EAWb,MAAM,SAAS,CAAC;AAGjB,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,YAAY;IAiBhC,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,cAAc;YAoDR,iBAAiB;YAmBjB,eAAe;YAiBf,eAAe;IAwF7B,OAAO,CAAC,oBAAoB;IAyC5B,OAAO,CAAC,kBAAkB;YAwDZ,iBAAiB;YA4CjB,eAAe;YAKf,gBAAgB;YAgBhB,eAAe;YAMf,aAAa;YAwCb,oBAAoB;YAepB,UAAU;YAeV,sBAAsB;YAetB,0BAA0B;YAe1B,mBAAmB;YAgBnB,UAAU;YAaV,WAAW;YA4BX,eAAe;YAgCf,aAAa;IAmB3B,OAAO,CAAC,eAAe;IAiHvB,OAAO,CAAC,oBAAoB;IAmCf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAatB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAGnC"}