@tarangdb/generator 1.0.0-alpha.1
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 +36 -0
- package/dist/generate.d.ts +2 -0
- package/dist/generate.js +124 -0
- package/dist/generate.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/naming.d.ts +6 -0
- package/dist/naming.js +100 -0
- package/dist/naming.js.map +1 -0
- package/dist/schema.d.ts +42 -0
- package/dist/schema.js +3 -0
- package/dist/schema.js.map +1 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @tarangdb/generator
|
|
2
|
+
|
|
3
|
+
TarangDB JSON schema to TypeScript code generator.
|
|
4
|
+
|
|
5
|
+
This package is primarily used by `@tarangdb/cli`, but can be used directly by tools that already have a Tarang schema response.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @tarangdb/generator
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { generateTypeScript } from "@tarangdb/generator";
|
|
17
|
+
|
|
18
|
+
const source = await fetch("https://api.tarangdb.com/v1/projects/{projectId}/schema", {
|
|
19
|
+
headers: {
|
|
20
|
+
Authorization: `Bearer ${process.env.TARANG_API_KEY}`,
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const schema = await source.json();
|
|
25
|
+
const code = generateTypeScript(schema);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Generated output includes:
|
|
29
|
+
|
|
30
|
+
- row, insert, and update interfaces per table
|
|
31
|
+
- `TarangSchema` registry for `TarangClient<TarangSchema>`
|
|
32
|
+
- `tarangSchemaMetadata` with table and column mappings
|
|
33
|
+
|
|
34
|
+
## Status
|
|
35
|
+
|
|
36
|
+
This is an alpha release. The schema contract is versioned by `schemaVersion`.
|
package/dist/generate.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateTypeScript = generateTypeScript;
|
|
4
|
+
const naming_1 = require("./naming");
|
|
5
|
+
const TYPE_MAP = {
|
|
6
|
+
string: "string",
|
|
7
|
+
number: "number",
|
|
8
|
+
integer: "number",
|
|
9
|
+
boolean: "boolean",
|
|
10
|
+
date: "string",
|
|
11
|
+
datetime: "string",
|
|
12
|
+
email: "string",
|
|
13
|
+
url: "string",
|
|
14
|
+
json: "unknown",
|
|
15
|
+
relation: "string",
|
|
16
|
+
unknown: "unknown",
|
|
17
|
+
};
|
|
18
|
+
function generateTypeScript(schema) {
|
|
19
|
+
if (!schema || !Array.isArray(schema.tables)) {
|
|
20
|
+
throw new Error("Invalid TarangProjectSchemaResponse: expected a tables array.");
|
|
21
|
+
}
|
|
22
|
+
const tableSymbols = (0, naming_1.makeUniqueNames)(schema.tables.map((table) => (0, naming_1.ensureIdentifier)((0, naming_1.toPascalCase)(table.name || table.originalSheetName || "Table"))));
|
|
23
|
+
const generatedTables = schema.tables.map((table, index) => buildGeneratedTable(table, tableSymbols[index]));
|
|
24
|
+
const lines = [
|
|
25
|
+
"/* Auto-generated by @tarangdb/generator. Do not edit by hand. */",
|
|
26
|
+
"",
|
|
27
|
+
];
|
|
28
|
+
for (const generatedTable of generatedTables) {
|
|
29
|
+
lines.push(...renderTable(generatedTable));
|
|
30
|
+
}
|
|
31
|
+
lines.push(...renderSchemaRegistry(generatedTables));
|
|
32
|
+
lines.push(...renderSchemaMetadata(generatedTables));
|
|
33
|
+
return `${lines.join("\n")}\n`;
|
|
34
|
+
}
|
|
35
|
+
function buildGeneratedTable(table, symbol) {
|
|
36
|
+
const columns = buildColumns(table.columns);
|
|
37
|
+
return {
|
|
38
|
+
symbol,
|
|
39
|
+
columns,
|
|
40
|
+
table,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function buildColumns(columns) {
|
|
44
|
+
const normalizedWriteNames = (0, naming_1.makeUniqueNames)(columns.map((column) => (0, naming_1.ensureIdentifier)((0, naming_1.toCamelCase)(column.name || column.originalHeader || "value"))));
|
|
45
|
+
return columns.map((column, index) => ({
|
|
46
|
+
originalHeader: column.originalHeader,
|
|
47
|
+
rowProperty: normalizedWriteNames[index],
|
|
48
|
+
writeProperty: normalizedWriteNames[index],
|
|
49
|
+
type: TYPE_MAP[column.type],
|
|
50
|
+
required: column.required,
|
|
51
|
+
nullable: column.nullable,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
function renderTable(generatedTable) {
|
|
55
|
+
const { symbol, columns, table } = generatedTable;
|
|
56
|
+
const rowInterface = `${symbol}Row`;
|
|
57
|
+
const insertInterface = `${symbol}Insert`;
|
|
58
|
+
const updateInterface = `${symbol}Update`;
|
|
59
|
+
return [
|
|
60
|
+
`export interface ${rowInterface} {`,
|
|
61
|
+
...columns.map((column) => renderRowProperty(column)),
|
|
62
|
+
"}",
|
|
63
|
+
"",
|
|
64
|
+
`export interface ${insertInterface} {`,
|
|
65
|
+
...columns.map((column) => renderWriteProperty(column, false)),
|
|
66
|
+
"}",
|
|
67
|
+
"",
|
|
68
|
+
`export interface ${updateInterface} {`,
|
|
69
|
+
...columns.map((column) => renderWriteProperty(column, true)),
|
|
70
|
+
"}",
|
|
71
|
+
"",
|
|
72
|
+
];
|
|
73
|
+
}
|
|
74
|
+
function renderRowProperty(column) {
|
|
75
|
+
const type = column.nullable ? `${column.type} | null` : column.type;
|
|
76
|
+
const optional = column.required ? "" : "?";
|
|
77
|
+
return ` ${(0, naming_1.escapeStringLiteral)(column.rowProperty)}${optional}: ${type};`;
|
|
78
|
+
}
|
|
79
|
+
function renderWriteProperty(column, forceOptional) {
|
|
80
|
+
const type = column.nullable ? `${column.type} | null` : column.type;
|
|
81
|
+
const optional = forceOptional || !column.required ? "?" : "";
|
|
82
|
+
return ` ${column.writeProperty}${optional}: ${type};`;
|
|
83
|
+
}
|
|
84
|
+
function renderMetadataProperty(column) {
|
|
85
|
+
return [
|
|
86
|
+
" {",
|
|
87
|
+
` originalHeader: ${(0, naming_1.escapeStringLiteral)(column.originalHeader)},`,
|
|
88
|
+
` rowProperty: ${(0, naming_1.escapeStringLiteral)(column.rowProperty)},`,
|
|
89
|
+
` writeProperty: ${(0, naming_1.escapeStringLiteral)(column.writeProperty)},`,
|
|
90
|
+
` type: ${(0, naming_1.escapeStringLiteral)(column.type)},`,
|
|
91
|
+
` required: ${column.required},`,
|
|
92
|
+
` nullable: ${column.nullable},`,
|
|
93
|
+
" },",
|
|
94
|
+
].join("\n");
|
|
95
|
+
}
|
|
96
|
+
function renderSchemaRegistry(generatedTables) {
|
|
97
|
+
const lines = ["export interface TarangSchema {"];
|
|
98
|
+
for (const generatedTable of generatedTables) {
|
|
99
|
+
lines.push(` ${(0, naming_1.escapeStringLiteral)(generatedTable.table.name)}: {`);
|
|
100
|
+
lines.push(` row: ${generatedTable.symbol}Row;`);
|
|
101
|
+
lines.push(` insert: ${generatedTable.symbol}Insert;`);
|
|
102
|
+
lines.push(` update: ${generatedTable.symbol}Update;`);
|
|
103
|
+
lines.push(" };");
|
|
104
|
+
}
|
|
105
|
+
lines.push("}", "");
|
|
106
|
+
return lines;
|
|
107
|
+
}
|
|
108
|
+
function renderSchemaMetadata(generatedTables) {
|
|
109
|
+
const lines = ["export const tarangSchemaMetadata = {", " tables: {"];
|
|
110
|
+
for (const generatedTable of generatedTables) {
|
|
111
|
+
lines.push(` ${(0, naming_1.escapeStringLiteral)(generatedTable.table.name)}: {`);
|
|
112
|
+
lines.push(` tableName: ${(0, naming_1.escapeStringLiteral)(generatedTable.table.name)},`);
|
|
113
|
+
lines.push(` originalSheetName: ${(0, naming_1.escapeStringLiteral)(generatedTable.table.originalSheetName)},`);
|
|
114
|
+
lines.push(" columns: [");
|
|
115
|
+
for (const column of generatedTable.columns) {
|
|
116
|
+
lines.push(...renderMetadataProperty(column).split("\n"));
|
|
117
|
+
}
|
|
118
|
+
lines.push(" ],");
|
|
119
|
+
lines.push(" },");
|
|
120
|
+
}
|
|
121
|
+
lines.push(" },", "} as const;", "");
|
|
122
|
+
return lines;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./schema"), exports);
|
|
18
|
+
__exportStar(require("./generate"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,6CAA2B"}
|
package/dist/naming.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function toWords(value: string): string[];
|
|
2
|
+
export declare function toPascalCase(value: string): string;
|
|
3
|
+
export declare function toCamelCase(value: string): string;
|
|
4
|
+
export declare function ensureIdentifier(value: string): string;
|
|
5
|
+
export declare function makeUniqueNames(values: string[]): string[];
|
|
6
|
+
export declare function escapeStringLiteral(value: string): string;
|
package/dist/naming.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toWords = toWords;
|
|
4
|
+
exports.toPascalCase = toPascalCase;
|
|
5
|
+
exports.toCamelCase = toCamelCase;
|
|
6
|
+
exports.ensureIdentifier = ensureIdentifier;
|
|
7
|
+
exports.makeUniqueNames = makeUniqueNames;
|
|
8
|
+
exports.escapeStringLiteral = escapeStringLiteral;
|
|
9
|
+
const RESERVED_WORDS = new Set([
|
|
10
|
+
"break",
|
|
11
|
+
"case",
|
|
12
|
+
"catch",
|
|
13
|
+
"class",
|
|
14
|
+
"const",
|
|
15
|
+
"continue",
|
|
16
|
+
"debugger",
|
|
17
|
+
"default",
|
|
18
|
+
"delete",
|
|
19
|
+
"do",
|
|
20
|
+
"else",
|
|
21
|
+
"enum",
|
|
22
|
+
"export",
|
|
23
|
+
"extends",
|
|
24
|
+
"false",
|
|
25
|
+
"finally",
|
|
26
|
+
"for",
|
|
27
|
+
"function",
|
|
28
|
+
"if",
|
|
29
|
+
"import",
|
|
30
|
+
"in",
|
|
31
|
+
"instanceof",
|
|
32
|
+
"new",
|
|
33
|
+
"null",
|
|
34
|
+
"return",
|
|
35
|
+
"super",
|
|
36
|
+
"switch",
|
|
37
|
+
"this",
|
|
38
|
+
"throw",
|
|
39
|
+
"true",
|
|
40
|
+
"try",
|
|
41
|
+
"typeof",
|
|
42
|
+
"var",
|
|
43
|
+
"void",
|
|
44
|
+
"while",
|
|
45
|
+
"with",
|
|
46
|
+
"as",
|
|
47
|
+
"any",
|
|
48
|
+
"boolean",
|
|
49
|
+
"constructor",
|
|
50
|
+
"declare",
|
|
51
|
+
"get",
|
|
52
|
+
"module",
|
|
53
|
+
"namespace",
|
|
54
|
+
"require",
|
|
55
|
+
"number",
|
|
56
|
+
"set",
|
|
57
|
+
"string",
|
|
58
|
+
"symbol",
|
|
59
|
+
"type",
|
|
60
|
+
"from",
|
|
61
|
+
"of",
|
|
62
|
+
]);
|
|
63
|
+
function toWords(value) {
|
|
64
|
+
const cleaned = value
|
|
65
|
+
.normalize("NFKD")
|
|
66
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ")
|
|
67
|
+
.trim();
|
|
68
|
+
if (cleaned.length === 0) {
|
|
69
|
+
return ["value"];
|
|
70
|
+
}
|
|
71
|
+
return cleaned.split(/\s+/u).filter(Boolean);
|
|
72
|
+
}
|
|
73
|
+
function toPascalCase(value) {
|
|
74
|
+
return toWords(value)
|
|
75
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
76
|
+
.join("") || "Value";
|
|
77
|
+
}
|
|
78
|
+
function toCamelCase(value) {
|
|
79
|
+
const [firstWord, ...restWords] = toWords(value);
|
|
80
|
+
const firstSegment = firstWord.charAt(0).toLowerCase() + firstWord.slice(1);
|
|
81
|
+
return [firstSegment, ...restWords.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())].join("");
|
|
82
|
+
}
|
|
83
|
+
function ensureIdentifier(value) {
|
|
84
|
+
const safe = value.replace(/[^\p{L}\p{N}_$]/gu, "_");
|
|
85
|
+
const normalized = /^[\p{L}_$]/u.test(safe) ? safe : `_${safe}`;
|
|
86
|
+
return RESERVED_WORDS.has(normalized) ? `_${normalized}` : normalized;
|
|
87
|
+
}
|
|
88
|
+
function makeUniqueNames(values) {
|
|
89
|
+
const seen = new Map();
|
|
90
|
+
return values.map((value) => {
|
|
91
|
+
const current = seen.get(value) ?? 0;
|
|
92
|
+
const nextCount = current + 1;
|
|
93
|
+
seen.set(value, nextCount);
|
|
94
|
+
return current === 0 ? value : `${value}${nextCount}`;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
function escapeStringLiteral(value) {
|
|
98
|
+
return JSON.stringify(value);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface TarangProjectSchemaResponse {
|
|
2
|
+
schemaVersion: string;
|
|
3
|
+
project: {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
};
|
|
7
|
+
source: {
|
|
8
|
+
provider: "google_sheets";
|
|
9
|
+
spreadsheetId: string;
|
|
10
|
+
spreadsheetName?: string;
|
|
11
|
+
syncedAt: string;
|
|
12
|
+
};
|
|
13
|
+
tables: TarangTableSchema[];
|
|
14
|
+
}
|
|
15
|
+
export interface TarangTableSchema {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
originalSheetName: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
primaryKey?: string;
|
|
21
|
+
columns: TarangColumnSchema[];
|
|
22
|
+
permissions?: {
|
|
23
|
+
readable: boolean;
|
|
24
|
+
creatable: boolean;
|
|
25
|
+
updatable: boolean;
|
|
26
|
+
deletable: boolean;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface TarangColumnSchema {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
originalHeader: string;
|
|
33
|
+
type: TarangColumnType;
|
|
34
|
+
required: boolean;
|
|
35
|
+
nullable: boolean;
|
|
36
|
+
unique?: boolean;
|
|
37
|
+
description?: string;
|
|
38
|
+
examples?: unknown[];
|
|
39
|
+
format?: string;
|
|
40
|
+
enum?: string[];
|
|
41
|
+
}
|
|
42
|
+
export type TarangColumnType = "string" | "number" | "integer" | "boolean" | "date" | "datetime" | "email" | "url" | "json" | "relation" | "unknown";
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tarangdb/generator",
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
|
+
"description": "TarangDB JSON schema to TypeScript generator.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "commonjs",
|
|
7
|
+
"main": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"require": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"tarangdb",
|
|
29
|
+
"codegen",
|
|
30
|
+
"typescript",
|
|
31
|
+
"google-sheets",
|
|
32
|
+
"schema"
|
|
33
|
+
],
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/tarang-labs/tarang.git",
|
|
37
|
+
"directory": ".sdk/typescript/packages/generator"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.json",
|
|
41
|
+
"clean": "rm -rf dist",
|
|
42
|
+
"test": "npm run build && node --test test/golden.test.cjs"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^22.15.18",
|
|
46
|
+
"typescript": "^5.8.3"
|
|
47
|
+
}
|
|
48
|
+
}
|