@mostajs/orm-adapter 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.
Files changed (44) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/LICENSE +29 -0
  3. package/README.md +182 -0
  4. package/dist/adapters/native.adapter.d.ts +36 -0
  5. package/dist/adapters/native.adapter.d.ts.map +1 -0
  6. package/dist/adapters/native.adapter.js +83 -0
  7. package/dist/adapters/native.adapter.js.map +1 -0
  8. package/dist/adapters/prisma.adapter.d.ts +48 -0
  9. package/dist/adapters/prisma.adapter.d.ts.map +1 -0
  10. package/dist/adapters/prisma.adapter.js +400 -0
  11. package/dist/adapters/prisma.adapter.js.map +1 -0
  12. package/dist/core/abstract.adapter.d.ts +39 -0
  13. package/dist/core/abstract.adapter.d.ts.map +1 -0
  14. package/dist/core/abstract.adapter.js +130 -0
  15. package/dist/core/abstract.adapter.js.map +1 -0
  16. package/dist/core/errors.d.ts +21 -0
  17. package/dist/core/errors.d.ts.map +1 -0
  18. package/dist/core/errors.js +37 -0
  19. package/dist/core/errors.js.map +1 -0
  20. package/dist/core/registry.d.ts +25 -0
  21. package/dist/core/registry.d.ts.map +1 -0
  22. package/dist/core/registry.js +68 -0
  23. package/dist/core/registry.js.map +1 -0
  24. package/dist/core/types.d.ts +76 -0
  25. package/dist/core/types.d.ts.map +1 -0
  26. package/dist/core/types.js +21 -0
  27. package/dist/core/types.js.map +1 -0
  28. package/dist/index.d.ts +18 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +32 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/utils/prisma-ast-helpers.d.ts +43 -0
  33. package/dist/utils/prisma-ast-helpers.d.ts.map +1 -0
  34. package/dist/utils/prisma-ast-helpers.js +155 -0
  35. package/dist/utils/prisma-ast-helpers.js.map +1 -0
  36. package/dist/utils/prisma-default-mapper.d.ts +29 -0
  37. package/dist/utils/prisma-default-mapper.d.ts.map +1 -0
  38. package/dist/utils/prisma-default-mapper.js +124 -0
  39. package/dist/utils/prisma-default-mapper.js.map +1 -0
  40. package/dist/utils/prisma-type-mapper.d.ts +32 -0
  41. package/dist/utils/prisma-type-mapper.d.ts.map +1 -0
  42. package/dist/utils/prisma-type-mapper.js +95 -0
  43. package/dist/utils/prisma-type-mapper.js.map +1 -0
  44. package/package.json +90 -0
@@ -0,0 +1,400 @@
1
+ // prisma.adapter.ts
2
+ // Converts Prisma schema (.prisma) to EntitySchema[] for @mostajs/orm.
3
+ // Parser: @mrleebo/prisma-ast (pure TypeScript, no Rust binary).
4
+ // Author: Dr Hamid MADANI drmdh@msn.com
5
+ // License: AGPL-3.0-or-later
6
+ import { getSchema } from '@mrleebo/prisma-ast';
7
+ import { AbstractAdapter } from '../core/abstract.adapter.js';
8
+ import { WarningCode } from '../core/types.js';
9
+ import { InvalidSchemaError } from '../core/errors.js';
10
+ import { getModels, buildEnumMap, buildModelNameSet, getFields, getBlockAttributes, hasFieldAttribute, getFieldAttribute, getDbAttribute, getArgValue, getKeyValueArg, getPositionalArgs, getFieldTypeName, isUnsupportedType, } from '../utils/prisma-ast-helpers.js';
11
+ import { mapPrismaScalar, extractDbMetadata } from '../utils/prisma-type-mapper.js';
12
+ import { mapPrismaDefault } from '../utils/prisma-default-mapper.js';
13
+ /**
14
+ * PrismaAdapter — converts .prisma files to EntitySchema[].
15
+ *
16
+ * Supports (MVP v0.2.0):
17
+ * - All scalar types (String, Int, BigInt, Float, Decimal, Boolean, DateTime, Json, Bytes)
18
+ * - Modifiers (?, [])
19
+ * - @id, @unique, @default, @map, @updatedAt
20
+ * - @@id, @@unique, @@index, @@map
21
+ * - @db.VarChar(N), @db.Decimal(p,s) (metadata extraction)
22
+ * - Enums (as FieldDef.enum)
23
+ * - Relations 1-1, 1-N, M-N (implicit & explicit)
24
+ * - Self-relations (named)
25
+ * - onDelete actions (Cascade, SetNull, Restrict, NoAction, SetDefault)
26
+ *
27
+ * Not yet supported (v0.3+):
28
+ * - Composite types (MongoDB embedded docs)
29
+ * - Views (preview)
30
+ * - Multi-schema
31
+ * - @@fulltext, specialized @@index(type: Gin)
32
+ */
33
+ export class PrismaAdapter extends AbstractAdapter {
34
+ name = 'prisma';
35
+ vendor = 'prisma.io';
36
+ version = '0.2.0';
37
+ canParse(input) {
38
+ if (typeof input !== 'string')
39
+ return false;
40
+ // Detect presence of Prisma schema block keywords
41
+ return /^\s*(datasource|generator|model|enum)\s+\w+\s*\{/m.test(input);
42
+ }
43
+ async toEntitySchema(input, opts) {
44
+ if (typeof input !== 'string') {
45
+ throw new InvalidSchemaError('PrismaAdapter expects a string (.prisma file contents)');
46
+ }
47
+ let ast;
48
+ try {
49
+ ast = getSchema(input);
50
+ }
51
+ catch (e) {
52
+ throw new InvalidSchemaError(`Failed to parse .prisma: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
53
+ }
54
+ const models = getModels(ast);
55
+ const enumMap = buildEnumMap(ast);
56
+ const modelNames = buildModelNameSet(ast);
57
+ // Emit a warning per preview feature detected in source (best-effort)
58
+ this.detectPreviewFeatures(input, opts);
59
+ // First pass : convert each model to EntitySchema (without M-N synthesis yet)
60
+ const entities = models.map(m => this.modelToEntity(m, enumMap, modelNames, opts));
61
+ // Second pass : detect implicit M-N relations and synthesize junction entries
62
+ this.synthesizeImplicitM2M(entities, models, modelNames, opts);
63
+ return entities;
64
+ }
65
+ // ============================================================
66
+ // Model -> Entity conversion
67
+ // ============================================================
68
+ modelToEntity(model, enumMap, modelNames, opts) {
69
+ const entity = {
70
+ name: model.name,
71
+ collection: this.resolveTableName(model),
72
+ fields: {},
73
+ relations: {},
74
+ indexes: [],
75
+ timestamps: false,
76
+ };
77
+ const fields = getFields(model);
78
+ // ---- Field-level : classify field vs relation ----
79
+ for (const field of fields) {
80
+ if (this.isRelationField(field, modelNames, enumMap)) {
81
+ const rel = this.fieldToRelation(field, model.name, opts);
82
+ if (rel)
83
+ entity.relations[field.name] = rel;
84
+ }
85
+ else {
86
+ const fd = this.fieldToFieldDef(field, model.name, enumMap, opts);
87
+ if (fd)
88
+ entity.fields[field.name] = fd;
89
+ }
90
+ }
91
+ // ---- Block-level : @@id, @@unique, @@index, @@map, @@schema ----
92
+ for (const attr of getBlockAttributes(model)) {
93
+ this.applyBlockAttribute(attr, entity, opts);
94
+ }
95
+ // ---- Detect timestamps convention (createdAt + updatedAt) ----
96
+ if (this.hasTimestampsConvention(fields)) {
97
+ entity.timestamps = true;
98
+ }
99
+ return entity;
100
+ }
101
+ resolveTableName(model) {
102
+ const mapAttr = getBlockAttributes(model).find(a => a.name === 'map');
103
+ if (mapAttr) {
104
+ const v = getArgValue(mapAttr);
105
+ if (typeof v === 'string')
106
+ return this.unquote(v);
107
+ }
108
+ return this.snakeCase(model.name);
109
+ }
110
+ // ============================================================
111
+ // Field classification
112
+ // ============================================================
113
+ isRelationField(field, modelNames, enumMap) {
114
+ // Relation = field whose type is another model (or array of a model)
115
+ // NOT an enum, NOT a scalar
116
+ if (isUnsupportedType(field))
117
+ return false;
118
+ const t = getFieldTypeName(field);
119
+ if (modelNames.has(t))
120
+ return true;
121
+ if (enumMap.has(t))
122
+ return false;
123
+ return false; // scalar or unknown
124
+ }
125
+ // ============================================================
126
+ // Field -> FieldDef
127
+ // ============================================================
128
+ fieldToFieldDef(field, entityName, enumMap, opts) {
129
+ const fieldName = field.name;
130
+ // Handle Unsupported("xxx") : not mappable
131
+ if (isUnsupportedType(field)) {
132
+ this.warn(opts, {
133
+ code: WarningCode.UNSUPPORTED_FEATURE,
134
+ message: `Unsupported type for "${fieldName}" — field ignored`,
135
+ entity: entityName,
136
+ field: fieldName,
137
+ });
138
+ return null;
139
+ }
140
+ const prismaType = getFieldTypeName(field);
141
+ // Check if type is an enum
142
+ if (enumMap.has(prismaType)) {
143
+ const values = enumMap.get(prismaType);
144
+ const fd = {
145
+ type: 'string',
146
+ required: !field.optional && !field.array,
147
+ enum: values,
148
+ };
149
+ this.applyFieldAttributes(field, fd, entityName, enumMap, opts);
150
+ return fd;
151
+ }
152
+ // Scalar type
153
+ const mapping = mapPrismaScalar(prismaType, fieldName, entityName, opts, w => this.warn(opts, w));
154
+ if (!mapping) {
155
+ this.warn(opts, {
156
+ code: WarningCode.UNSUPPORTED_FEATURE,
157
+ message: `Unknown type "${prismaType}" for field "${fieldName}"`,
158
+ entity: entityName,
159
+ field: fieldName,
160
+ });
161
+ return null;
162
+ }
163
+ const fd = {
164
+ type: mapping.type,
165
+ required: !field.optional && !field.array,
166
+ };
167
+ // Array modifier → arrayOf
168
+ if (field.array) {
169
+ fd.type = 'array';
170
+ fd.arrayOf = mapping.type;
171
+ }
172
+ this.applyFieldAttributes(field, fd, entityName, enumMap, opts);
173
+ return fd;
174
+ }
175
+ applyFieldAttributes(field, fd, entityName, enumMap, opts) {
176
+ // @unique
177
+ if (hasFieldAttribute(field, 'unique')) {
178
+ fd.unique = true;
179
+ }
180
+ // @default(...)
181
+ const defaultAttr = getFieldAttribute(field, 'default');
182
+ if (defaultAttr) {
183
+ const raw = getArgValue(defaultAttr);
184
+ const enumValues = enumMap.get(getFieldTypeName(field));
185
+ const mapped = mapPrismaDefault(raw, field.name, entityName, enumValues, opts, w => this.warn(opts, w));
186
+ if (mapped !== undefined)
187
+ fd.default = mapped;
188
+ }
189
+ // @db.VarChar(N), @db.Decimal(p,s) — extract metadata (not persisted in FieldDef,
190
+ // but can be attached via future meta field; for now, no-op)
191
+ const dbAttr = getDbAttribute(field);
192
+ if (dbAttr) {
193
+ const args = getPositionalArgs(dbAttr);
194
+ const meta = extractDbMetadata(dbAttr.name, args);
195
+ // TODO: persist meta if EntitySchema ever supports it
196
+ void meta;
197
+ }
198
+ }
199
+ // ============================================================
200
+ // Field -> RelationDef
201
+ // ============================================================
202
+ fieldToRelation(field, entityName, opts) {
203
+ const target = getFieldTypeName(field);
204
+ const isArray = !!field.array;
205
+ const isOptional = !!field.optional;
206
+ // Determine relation type :
207
+ // - field: Target[] -> one-to-many (or many-to-many, resolved in second pass)
208
+ // - field: Target -> many-to-one (child side of 1-N, or owning side of 1-1)
209
+ // - field: Target? -> one-to-one (nullable back-reference)
210
+ let type;
211
+ if (isArray) {
212
+ type = 'one-to-many'; // may be upgraded to 'many-to-many' in second pass
213
+ }
214
+ else {
215
+ // Check if there's a @relation with fields: — indicates owning side of 1-N or 1-1
216
+ type = 'many-to-one';
217
+ }
218
+ const rel = {
219
+ target,
220
+ type,
221
+ };
222
+ if (!isOptional && !isArray)
223
+ rel.required = true;
224
+ if (isOptional && !isArray)
225
+ rel.nullable = true;
226
+ // Parse @relation(...)
227
+ const relAttr = getFieldAttribute(field, 'relation');
228
+ if (relAttr) {
229
+ const fieldsList = getKeyValueArg(relAttr, 'fields');
230
+ const referencesList = getKeyValueArg(relAttr, 'references');
231
+ const onDelete = getKeyValueArg(relAttr, 'onDelete');
232
+ const nameArg = getPositionalArgs(relAttr)[0];
233
+ if (Array.isArray(fieldsList) && fieldsList.length > 0) {
234
+ rel.joinColumn = String(fieldsList[0]);
235
+ }
236
+ if (Array.isArray(referencesList) && referencesList.length > 0) {
237
+ // references[0] = PK of target; usually 'id'. We keep for reverse-engineering.
238
+ }
239
+ if (typeof onDelete === 'string') {
240
+ rel.onDelete = this.mapReferentialAction(onDelete, field.name, entityName, opts);
241
+ }
242
+ if (typeof nameArg === 'string') {
243
+ rel.mappedBy = this.unquote(nameArg); // self-relation disambiguation name
244
+ }
245
+ }
246
+ return rel;
247
+ }
248
+ mapReferentialAction(action, fieldName, entityName, opts) {
249
+ switch (action) {
250
+ case 'Cascade': return 'cascade';
251
+ case 'SetNull': return 'set-null';
252
+ case 'Restrict': return 'restrict';
253
+ case 'NoAction': return 'no-action';
254
+ case 'SetDefault':
255
+ this.warn(opts, {
256
+ code: WarningCode.UNSUPPORTED_FEATURE,
257
+ message: `onDelete: SetDefault on "${fieldName}" not portable; using set-null`,
258
+ entity: entityName,
259
+ field: fieldName,
260
+ });
261
+ return 'set-null';
262
+ default:
263
+ return 'no-action';
264
+ }
265
+ }
266
+ // ============================================================
267
+ // Block-level attributes (@@id, @@unique, @@index, @@map, @@schema)
268
+ // ============================================================
269
+ applyBlockAttribute(attr, entity, opts) {
270
+ switch (attr.name) {
271
+ case 'id': {
272
+ // @@id([a, b]) — composite primary key. EntitySchema has no composite PK,
273
+ // so we emit as composite unique index.
274
+ const fields = getPositionalArgs(attr)[0];
275
+ if (Array.isArray(fields)) {
276
+ const index = {
277
+ fields: Object.fromEntries(fields.map(f => [String(f), 'asc'])),
278
+ unique: true,
279
+ };
280
+ entity.indexes.push(index);
281
+ this.warn(opts, {
282
+ code: WarningCode.LOSSY_CONVERSION,
283
+ message: `@@id composite PK on ${entity.name} mapped to unique index; implicit _id still expected`,
284
+ entity: entity.name,
285
+ });
286
+ }
287
+ break;
288
+ }
289
+ case 'unique': {
290
+ const fields = getPositionalArgs(attr)[0];
291
+ if (Array.isArray(fields)) {
292
+ entity.indexes.push({
293
+ fields: Object.fromEntries(fields.map(f => [String(f), 'asc'])),
294
+ unique: true,
295
+ });
296
+ }
297
+ break;
298
+ }
299
+ case 'index': {
300
+ const fields = getPositionalArgs(attr)[0];
301
+ if (Array.isArray(fields)) {
302
+ entity.indexes.push({
303
+ fields: Object.fromEntries(fields.map(f => [String(f), 'asc'])),
304
+ });
305
+ }
306
+ break;
307
+ }
308
+ case 'map':
309
+ // Already handled in resolveTableName
310
+ break;
311
+ case 'schema':
312
+ this.warn(opts, {
313
+ code: WarningCode.PREVIEW_FEATURE,
314
+ message: `@@schema on ${entity.name} (multi-schema preview) not reflected in EntitySchema`,
315
+ entity: entity.name,
316
+ });
317
+ break;
318
+ case 'fulltext':
319
+ this.warn(opts, {
320
+ code: WarningCode.PREVIEW_FEATURE,
321
+ message: `@@fulltext on ${entity.name} mapped to regular index`,
322
+ entity: entity.name,
323
+ });
324
+ break;
325
+ case 'ignore':
326
+ this.warn(opts, {
327
+ code: WarningCode.UNSUPPORTED_FEATURE,
328
+ message: `@@ignore on ${entity.name} not represented in EntitySchema`,
329
+ entity: entity.name,
330
+ });
331
+ break;
332
+ }
333
+ }
334
+ // ============================================================
335
+ // Implicit M-N synthesis
336
+ // ============================================================
337
+ /**
338
+ * Prisma allows implicit M-N: `categories Category[]` on both sides with NO join
339
+ * table declared. The adapter detects these and upgrades one-to-many pairs to
340
+ * many-to-many, synthesizing `through` as `_${A}To${B}` (Prisma's convention).
341
+ */
342
+ synthesizeImplicitM2M(entities, models, modelNames, opts) {
343
+ // For each pair of DISTINCT models where both sides reference each other with []
344
+ // and neither side has a joinColumn (fields:), upgrade to many-to-many.
345
+ for (const entity of entities) {
346
+ for (const [relName, rel] of Object.entries(entity.relations)) {
347
+ if (rel.type !== 'one-to-many')
348
+ continue;
349
+ // Skip self-relations — they are 1-N hierarchies (parent/children), not M-N
350
+ if (rel.target === entity.name)
351
+ continue;
352
+ const otherEntity = entities.find(e => e.name === rel.target);
353
+ if (!otherEntity)
354
+ continue;
355
+ // Find the reverse relation on the other side
356
+ const reverseRel = Object.values(otherEntity.relations).find(r => r.target === entity.name && r.type === 'one-to-many');
357
+ if (!reverseRel)
358
+ continue;
359
+ // If neither side has a joinColumn (fields:), it's implicit M-N
360
+ if (!rel.joinColumn && !reverseRel.joinColumn) {
361
+ rel.type = 'many-to-many';
362
+ reverseRel.type = 'many-to-many';
363
+ // Prisma convention : table name is `_${A}To${B}` sorted alphabetically
364
+ const [a, b] = [entity.name, otherEntity.name].sort();
365
+ const throughName = `_${a}To${b}`;
366
+ rel.through = throughName;
367
+ reverseRel.through = throughName;
368
+ }
369
+ }
370
+ }
371
+ }
372
+ // ============================================================
373
+ // Utilities
374
+ // ============================================================
375
+ hasTimestampsConvention(fields) {
376
+ const names = new Set(fields.map(f => f.name));
377
+ return names.has('createdAt') && names.has('updatedAt');
378
+ }
379
+ unquote(s) {
380
+ if (s.startsWith('"') && s.endsWith('"'))
381
+ return s.slice(1, -1);
382
+ return s;
383
+ }
384
+ detectPreviewFeatures(source, opts) {
385
+ const previews = [
386
+ { pattern: /\bview\s+\w+\s*\{/i, name: 'views' },
387
+ { pattern: /\btype\s+\w+\s*\{/i, name: 'composite types (Mongo)' },
388
+ { pattern: /previewFeatures\s*=/i, name: 'generator previewFeatures' },
389
+ ];
390
+ for (const { pattern, name } of previews) {
391
+ if (pattern.test(source)) {
392
+ this.warn(opts, {
393
+ code: WarningCode.PREVIEW_FEATURE,
394
+ message: `Detected use of ${name}; MVP may not fully support this`,
395
+ });
396
+ }
397
+ }
398
+ }
399
+ }
400
+ //# sourceMappingURL=prisma.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.adapter.js","sourceRoot":"","sources":["../../src/adapters/prisma.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { EntitySchema, FieldDef } from '@mostajs/orm';
2
+ import type { IAdapter, AdapterOptions, AdapterWarning } from './types.js';
3
+ /**
4
+ * AbstractAdapter provides shared logic for all adapters:
5
+ * - warning emission (strict vs callback mode)
6
+ * - case conversion (pascal / camel / snake)
7
+ * - EntitySchema validation
8
+ * - empty-entity factory
9
+ */
10
+ export declare abstract class AbstractAdapter implements IAdapter {
11
+ abstract readonly name: string;
12
+ abstract readonly vendor: string;
13
+ readonly version: string;
14
+ abstract canParse(input: string | object): boolean;
15
+ abstract toEntitySchema(input: string | object, opts?: AdapterOptions): Promise<EntitySchema[]>;
16
+ /**
17
+ * Emit a warning. In strict mode, throws; otherwise calls onWarning callback.
18
+ */
19
+ protected warn(opts: AdapterOptions | undefined, warning: AdapterWarning): void;
20
+ /** Convert to snake_case (for table/collection names) */
21
+ protected snakeCase(str: string): string;
22
+ /** Convert to PascalCase (for entity names) */
23
+ protected pascalCase(str: string): string;
24
+ /** Convert to camelCase (for field names) */
25
+ protected camelCase(str: string): string;
26
+ /**
27
+ * Create an empty EntitySchema with sensible defaults.
28
+ * Use as starting point when building a schema from source.
29
+ */
30
+ protected createEmptyEntity(name: string, collection?: string): EntitySchema;
31
+ /**
32
+ * Validate an EntitySchema structure.
33
+ * Returns array of error messages (empty array = valid).
34
+ */
35
+ protected validateEntitySchema(schema: EntitySchema): string[];
36
+ /** Validate a single FieldDef */
37
+ protected validateFieldDef(key: string, field: FieldDef): string[];
38
+ }
39
+ //# sourceMappingURL=abstract.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract.adapter.d.ts","sourceRoot":"","sources":["../../src/core/abstract.adapter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAa,MAAM,cAAc,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3E;;;;;;GAMG;AACH,8BAAsB,eAAgB,YAAW,QAAQ;IACvD,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAW;IAEnC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAClD,QAAQ,CAAC,cAAc,CACrB,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,YAAY,EAAE,CAAC;IAM1B;;OAEG;IACH,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAW/E,yDAAyD;IACzD,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAQxC,+CAA+C;IAC/C,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOzC,6CAA6C;IAC7C,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASxC;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY;IAW5E;;;OAGG;IACH,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE;IAgD9D,iCAAiC;IACjC,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAE;CAanE"}
@@ -0,0 +1,130 @@
1
+ // @mostajs/orm-adapter — AbstractAdapter
2
+ // Base class providing common helpers for all adapter implementations.
3
+ // Inspired by AbstractSqlDialect in @mostajs/orm.
4
+ // Author: Dr Hamid MADANI drmdh@msn.com
5
+ // License: AGPL-3.0-or-later
6
+ import { StrictWarningError } from './errors.js';
7
+ /**
8
+ * AbstractAdapter provides shared logic for all adapters:
9
+ * - warning emission (strict vs callback mode)
10
+ * - case conversion (pascal / camel / snake)
11
+ * - EntitySchema validation
12
+ * - empty-entity factory
13
+ */
14
+ export class AbstractAdapter {
15
+ version = '0.1.0';
16
+ // ============================================================
17
+ // Warning helpers
18
+ // ============================================================
19
+ /**
20
+ * Emit a warning. In strict mode, throws; otherwise calls onWarning callback.
21
+ */
22
+ warn(opts, warning) {
23
+ if (opts?.strict) {
24
+ throw new StrictWarningError(warning);
25
+ }
26
+ opts?.onWarning?.(warning);
27
+ }
28
+ // ============================================================
29
+ // Case conversion helpers
30
+ // ============================================================
31
+ /** Convert to snake_case (for table/collection names) */
32
+ snakeCase(str) {
33
+ return str
34
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
35
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
36
+ .replace(/[\s-]+/g, '_')
37
+ .toLowerCase();
38
+ }
39
+ /** Convert to PascalCase (for entity names) */
40
+ pascalCase(str) {
41
+ return str
42
+ .replace(/[_\s-]+/g, ' ')
43
+ .replace(/\w+/g, w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
44
+ .replace(/\s+/g, '');
45
+ }
46
+ /** Convert to camelCase (for field names) */
47
+ camelCase(str) {
48
+ const p = this.pascalCase(str);
49
+ return p.charAt(0).toLowerCase() + p.slice(1);
50
+ }
51
+ // ============================================================
52
+ // Schema helpers
53
+ // ============================================================
54
+ /**
55
+ * Create an empty EntitySchema with sensible defaults.
56
+ * Use as starting point when building a schema from source.
57
+ */
58
+ createEmptyEntity(name, collection) {
59
+ return {
60
+ name: this.pascalCase(name),
61
+ collection: collection ?? this.snakeCase(name) + 's',
62
+ fields: {},
63
+ relations: {},
64
+ indexes: [],
65
+ timestamps: false,
66
+ };
67
+ }
68
+ /**
69
+ * Validate an EntitySchema structure.
70
+ * Returns array of error messages (empty array = valid).
71
+ */
72
+ validateEntitySchema(schema) {
73
+ const errors = [];
74
+ if (!schema.name || typeof schema.name !== 'string') {
75
+ errors.push('name is required and must be a string');
76
+ }
77
+ else if (!/^[A-Z][a-zA-Z0-9]*$/.test(schema.name)) {
78
+ errors.push(`name "${schema.name}" must be PascalCase`);
79
+ }
80
+ if (!schema.collection || typeof schema.collection !== 'string') {
81
+ errors.push('collection is required and must be a string');
82
+ }
83
+ if (!schema.fields || typeof schema.fields !== 'object') {
84
+ errors.push('fields must be an object');
85
+ }
86
+ else {
87
+ for (const [key, field] of Object.entries(schema.fields)) {
88
+ const fieldErrors = this.validateFieldDef(key, field);
89
+ errors.push(...fieldErrors);
90
+ }
91
+ }
92
+ if (!schema.relations || typeof schema.relations !== 'object') {
93
+ errors.push('relations must be an object');
94
+ }
95
+ else {
96
+ for (const [key, rel] of Object.entries(schema.relations)) {
97
+ if (!rel.target)
98
+ errors.push(`relation "${key}" missing target`);
99
+ if (!['one-to-one', 'many-to-one', 'one-to-many', 'many-to-many'].includes(rel.type)) {
100
+ errors.push(`relation "${key}" has invalid type: ${rel.type}`);
101
+ }
102
+ }
103
+ }
104
+ if (!Array.isArray(schema.indexes)) {
105
+ errors.push('indexes must be an array');
106
+ }
107
+ if (typeof schema.timestamps !== 'boolean') {
108
+ errors.push('timestamps must be a boolean');
109
+ }
110
+ if (schema.discriminator && !schema.discriminatorValue) {
111
+ errors.push('discriminator requires discriminatorValue');
112
+ }
113
+ return errors;
114
+ }
115
+ /** Validate a single FieldDef */
116
+ validateFieldDef(key, field) {
117
+ const errors = [];
118
+ const validTypes = [
119
+ 'string', 'text', 'number', 'boolean', 'date', 'json', 'array',
120
+ ];
121
+ if (!validTypes.includes(field.type)) {
122
+ errors.push(`field "${key}" has invalid type: ${field.type}`);
123
+ }
124
+ if (field.type === 'array' && !field.arrayOf) {
125
+ errors.push(`field "${key}" is array but arrayOf is missing`);
126
+ }
127
+ return errors;
128
+ }
129
+ }
130
+ //# sourceMappingURL=abstract.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstract.adapter.js","sourceRoot":"","sources":["../../src/core/abstract.adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AdapterWarning } from './types.js';
2
+ /** Base error class for all adapter-related errors */
3
+ export declare class AdapterError extends Error {
4
+ readonly code: string;
5
+ constructor(message: string, code?: string);
6
+ }
7
+ /** Thrown when an input cannot be parsed by any registered adapter */
8
+ export declare class NoAdapterFoundError extends AdapterError {
9
+ constructor(message?: string);
10
+ }
11
+ /** Thrown when input is malformed or violates its own schema */
12
+ export declare class InvalidSchemaError extends AdapterError {
13
+ readonly details?: unknown | undefined;
14
+ constructor(message: string, details?: unknown | undefined);
15
+ }
16
+ /** Thrown in strict mode when an unsupported feature is encountered */
17
+ export declare class StrictWarningError extends AdapterError {
18
+ readonly warning: AdapterWarning;
19
+ constructor(warning: AdapterWarning);
20
+ }
21
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,sDAAsD;AACtD,qBAAa,YAAa,SAAQ,KAAK;aACQ,IAAI,EAAE,MAAM;gBAA7C,OAAO,EAAE,MAAM,EAAkB,IAAI,GAAE,MAAwB;CAI5E;AAED,sEAAsE;AACtE,qBAAa,mBAAoB,SAAQ,YAAY;gBACvC,OAAO,SAAyC;CAI7D;AAED,gEAAgE;AAChE,qBAAa,kBAAmB,SAAQ,YAAY;aACL,OAAO,CAAC,EAAE,OAAO;gBAAlD,OAAO,EAAE,MAAM,EAAkB,OAAO,CAAC,EAAE,OAAO,YAAA;CAI/D;AAED,uEAAuE;AACvE,qBAAa,kBAAmB,SAAQ,YAAY;aACtB,OAAO,EAAE,cAAc;gBAAvB,OAAO,EAAE,cAAc;CAIpD"}