runlify 0.0.780 → 0.0.783

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 (38) hide show
  1. package/build/index.js +4 -2
  2. package/build/projectsGeneration/args.js +39 -3
  3. package/build/projectsGeneration/builders/BaseSavableEntityBuilder.js +25 -13
  4. package/build/projectsGeneration/builders/SystemMetaBuilder.js +75 -11
  5. package/build/projectsGeneration/builders/buildedTypes.js +1 -1
  6. package/build/projectsGeneration/builders/storage.js +60 -0
  7. package/build/projectsGeneration/defaultCatalogs/{addElasticSearch.js → addExternalSearch.js} +6 -5
  8. package/build/projectsGeneration/defaultCatalogs/index.js +2 -2
  9. package/build/projectsGeneration/generateProject/back/generateBack.js +3 -1
  10. package/build/projectsGeneration/generateProject/back/src/services/generateBackEntityService.js +2 -2
  11. package/build/projectsGeneration/generateProject/generateBackClickHouseBootstrap.js +16 -0
  12. package/build/projectsGeneration/generateProject/generateBackElasticBootstrap.js +3 -2
  13. package/build/projectsGeneration/generateProject/generateEnvironment.js +36 -8
  14. package/build/projectsGeneration/generators/fileTemplates/back/clickhouse/jobs.js +94 -0
  15. package/build/projectsGeneration/generators/fileTemplates/back/elastic/jobs.js +15 -3
  16. package/build/projectsGeneration/generators/fileTemplates/back/environment/src/clients/getPrisma.js +75 -8
  17. package/build/projectsGeneration/generators/fileTemplates/back/services/entity/class.js +31 -20
  18. package/build/projectsGeneration/generators/fileTemplates/back/services/entity/config.js +10 -3
  19. package/build/projectsGeneration/generators/prisma/scheme/genPrismaEntity.js +17 -6
  20. package/build/projectsGeneration/generators/prisma/scheme/genPrismaSchemaForEntities.js +3 -3
  21. package/build/projectsGeneration/generators/prisma/scheme/genPrismaSchemaForEntitiesWithClientAdnDb.js +67 -9
  22. package/build/projectsGeneration/utils/databaseMeta.js +75 -0
  23. package/build/types/index.d.ts +1 -0
  24. package/build/types/projectsGeneration/builders/BaseSavableEntityBuilder.d.ts +6 -4
  25. package/build/types/projectsGeneration/builders/SystemMetaBuilder.d.ts +5 -1
  26. package/build/types/projectsGeneration/builders/buildedTypes.d.ts +7 -2
  27. package/build/types/projectsGeneration/builders/storage.d.ts +21 -0
  28. package/build/types/projectsGeneration/defaultCatalogs/addExternalSearch.d.ts +2 -0
  29. package/build/types/projectsGeneration/defaultCatalogs/index.d.ts +1 -1
  30. package/build/types/projectsGeneration/generateProject/generateBackClickHouseBootstrap.d.ts +3 -0
  31. package/build/types/projectsGeneration/generators/fileTemplates/back/clickhouse/jobs.d.ts +183 -0
  32. package/build/types/projectsGeneration/generators/fileTemplates/back/environment/src/clients/getPrisma.d.ts +2 -2
  33. package/build/types/projectsGeneration/generators/prisma/scheme/genPrismaEntity.d.ts +1 -1
  34. package/build/types/projectsGeneration/generators/prisma/scheme/genPrismaSchemaForEntities.d.ts +1 -1
  35. package/build/types/projectsGeneration/generators/prisma/scheme/genPrismaSchemaForEntitiesWithClientAdnDb.d.ts +12 -1
  36. package/build/types/projectsGeneration/utils/databaseMeta.d.ts +8 -0
  37. package/package.json +1 -1
  38. package/build/types/projectsGeneration/defaultCatalogs/addElasticSearch.d.ts +0 -2
@@ -44,13 +44,24 @@ const prismaIndexFieldFragment = (entity, fieldName, indexType) => {
44
44
  }
45
45
  return `${fieldName}(ops: JsonbPathOps)`;
46
46
  };
47
- const genPrismaEntity = (entity, links, forShards = false) => {
47
+ const inwardEntityLinks = (entity, links, allEntities) => {
48
+ let inward = (0, getLinksFromExternalEntities_1.getLinksFromExternalEntities)(entity, links).filter((el) => el.fromField.linkCategory === 'entity');
49
+ if (allEntities) {
50
+ inward = inward.filter((el) => {
51
+ const owner = allEntities.get(el.entityOwnerName);
52
+ return !!owner && owner.database === entity.database;
53
+ });
54
+ }
55
+ return inward;
56
+ };
57
+ const genPrismaEntity = (entity, links, forShards = false, allEntities) => {
48
58
  const fields = [
49
59
  ...R.flatten(entity.fields.map((field) => (0, genPrismaField_1.genPrismaField)(entity, field, forShards))),
50
- ...forShards ? [] : (0, getLinksFromExternalEntities_1.getLinksFromExternalEntities)(entity, links)
51
- .filter((el) => el.fromField.linkCategory === 'entity')
52
- .map((link) => (0, genPrismaFieldFromExternalEntity_1.genPrismaFieldFromExternalEntity)(link))
53
- .filter((l) => l),
60
+ ...forShards
61
+ ? []
62
+ : inwardEntityLinks(entity, links, allEntities)
63
+ .map((link) => (0, genPrismaFieldFromExternalEntity_1.genPrismaFieldFromExternalEntity)(link))
64
+ .filter((l) => l),
54
65
  ];
55
66
  return `model ${(0, cases_1.pascalSingular)(entity.name)} {
56
67
  ${fields.join('\n')}${entity.uniqueConstraints.length > 0
@@ -68,4 +79,4 @@ ${fields.join('\n')}${entity.uniqueConstraints.length > 0
68
79
  `;
69
80
  };
70
81
  exports.genPrismaEntity = genPrismaEntity;
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuUHJpc21hRW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb2plY3RzR2VuZXJhdGlvbi9nZW5lcmF0b3JzL3ByaXNtYS9zY2hlbWUvZ2VuUHJpc21hRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQTBCO0FBQzFCLG1EQUFzRDtBQUN0RCxnREFBdUU7QUFDdkUsOEZBQXdGO0FBRXhGLDREQUFzRDtBQUN0RCxnR0FBMEY7QUFDMUYsNkNBQXNDO0FBRXRDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUFZLEVBQVcsRUFBRSxDQUNuRCxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVE7SUFDM0IsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RCLEtBQXFCLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQTtBQUU5QyxNQUFNLHdCQUF3QixHQUFHLENBQy9CLE1BQWMsRUFDZCxTQUFpQixFQUNqQixTQUFnQyxFQUN4QixFQUFFO0lBQ1YsSUFBSSxTQUFTLEtBQUssb0JBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQTtJQUU3RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxPQUFPLEdBQUcsU0FBUyxxQkFBcUIsQ0FBQztBQUMzQyxDQUFDLENBQUE7QUFFTSxNQUFNLGVBQWUsR0FBRyxDQUM3QixNQUFjLEVBQ2QsS0FBdUIsRUFDdkIsU0FBUyxHQUFHLEtBQUssRUFDVCxFQUFFO0lBQ1YsTUFBTSxNQUFNLEdBQUc7UUFDYixHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUEsK0JBQWMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDcEYsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBQSwyREFBNEIsRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO2FBQzVELE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEtBQUssUUFBUSxDQUFDO2FBQ3RELEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBQSxtRUFBZ0MsRUFBQyxJQUFJLENBQUMsQ0FBQzthQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNwQixDQUFBO0lBRUQsT0FBTyxTQUFTLElBQUEsc0JBQWMsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0VBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQ2YsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxJQUFJO1lBQ0osTUFBTSxDQUFDLGlCQUFpQjtpQkFDckIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxjQUFjLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNmLENBQUMsQ0FBQyxFQUNOLEdBQ0UsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUN6QixDQUFDLENBQUMsSUFBSTtZQUNKLE1BQU0sQ0FBQyxPQUFPO2lCQUNYLEdBQUcsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFFLEVBQUUsQ0FDdEIsYUFBYSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFBLHdCQUFVLEVBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQzNJO2lCQUNBLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDZixDQUFDLENBQUMsRUFDSjs7Q0FFRCxDQUFBO0FBQ0QsQ0FBQyxDQUFBO0FBakNZLFFBQUEsZUFBZSxtQkFpQzNCIn0=
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuUHJpc21hRW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Byb2plY3RzR2VuZXJhdGlvbi9nZW5lcmF0b3JzL3ByaXNtYS9zY2hlbWUvZ2VuUHJpc21hRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQTBCO0FBQzFCLG1EQUFzRDtBQUN0RCxnREFBdUU7QUFDdkUsOEZBQXdGO0FBRXhGLDREQUFzRDtBQUN0RCxnR0FBMEY7QUFDMUYsNkNBQXNDO0FBRXRDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUFZLEVBQVcsRUFBRSxDQUNuRCxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVE7SUFDM0IsS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO0lBQ3RCLEtBQXFCLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQTtBQUU5QyxNQUFNLHdCQUF3QixHQUFHLENBQy9CLE1BQWMsRUFDZCxTQUFpQixFQUNqQixTQUFnQyxFQUN4QixFQUFFO0lBQ1YsSUFBSSxTQUFTLEtBQUssb0JBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQTtJQUU3RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxPQUFPLEdBQUcsU0FBUyxxQkFBcUIsQ0FBQztBQUMzQyxDQUFDLENBQUE7QUFFRCxNQUFNLGlCQUFpQixHQUFHLENBQ3hCLE1BQWMsRUFDZCxLQUF1QixFQUN2QixXQUFpQyxFQUNmLEVBQUU7SUFDcEIsSUFBSSxNQUFNLEdBQUcs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
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.genPrismaSchemaForEntities = void 0;
4
4
  const genPrismaEntity_1 = require("./genPrismaEntity");
5
- const genPrismaSchemaForEntities = (entities, links, forShards = false) => {
5
+ const genPrismaSchemaForEntities = (entities, links, forShards = false, allEntities) => {
6
6
  const prismaSchemas = [];
7
7
  for (const entity of entities) {
8
- prismaSchemas.push((0, genPrismaEntity_1.genPrismaEntity)(entity, links, forShards));
8
+ prismaSchemas.push((0, genPrismaEntity_1.genPrismaEntity)(entity, links, forShards, allEntities));
9
9
  }
10
10
  return prismaSchemas.join('\n\n');
11
11
  };
12
12
  exports.genPrismaSchemaForEntities = genPrismaSchemaForEntities;
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuUHJpc21hU2NoZW1hRm9yRW50aXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvamVjdHNHZW5lcmF0aW9uL2dlbmVyYXRvcnMvcHJpc21hL3NjaGVtZS9nZW5QcmlzbWFTY2hlbWFGb3JFbnRpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBaUQ7QUFFMUMsTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxRQUFrQixFQUNsQixLQUF1QixFQUN2QixTQUFTLEdBQUcsS0FBSyxFQUNqQixFQUFFO0lBQ0YsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFBO0lBQ2xDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFO1FBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBQSxpQ0FBZSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtLQUM5RDtJQUVELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNuQyxDQUFDLENBQUE7QUFYWSxRQUFBLDBCQUEwQiw4QkFXdEMifQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuUHJpc21hU2NoZW1hRm9yRW50aXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvamVjdHNHZW5lcmF0aW9uL2dlbmVyYXRvcnMvcHJpc21hL3NjaGVtZS9nZW5QcmlzbWFTY2hlbWFGb3JFbnRpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBaUQ7QUFFMUMsTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxRQUFrQixFQUNsQixLQUF1QixFQUN2QixTQUFTLEdBQUcsS0FBSyxFQUNqQixXQUFpQyxFQUNqQyxFQUFFO0lBQ0YsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFBO0lBQ2xDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxFQUFFO1FBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBQSxpQ0FBZSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7S0FDM0U7SUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDbkMsQ0FBQyxDQUFBO0FBWlksUUFBQSwwQkFBMEIsOEJBWXRDIn0=
@@ -1,24 +1,82 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.genPrismaSchemaForEntitiesWithClientAdnDb = void 0;
3
+ exports.genDeployConnectionPrisma = exports.genPrismaSchemaForEntitiesWithClientAdnDb = void 0;
4
4
  const genPrismaSchemaForEntities_1 = require("./genPrismaSchemaForEntities");
5
- const genPrismaSchemaForEntitiesWithClientAdnDb = ({ entities, allLinks, }, forShards = false) => {
5
+ const databaseMeta_1 = require("../../../utils/databaseMeta");
6
+ const collectCrossDatabaseEntityLinkViolations = (entities, allEntities) => {
7
+ const lines = [];
8
+ for (const entity of entities) {
9
+ for (const field of entity.fields) {
10
+ if (field.category !== 'link') {
11
+ continue;
12
+ }
13
+ if (field.linkCategory !== 'entity') {
14
+ continue;
15
+ }
16
+ const target = allEntities.get(field.externalEntity);
17
+ if (!target) {
18
+ continue;
19
+ }
20
+ if (target.database !== entity.database) {
21
+ lines.push(` ${entity.name}.${field.name} → ${field.externalEntity} (database "${entity.database}" → "${target.database}")`);
22
+ }
23
+ }
24
+ }
25
+ return lines;
26
+ };
27
+ const genPrismaSchemaForEntitiesWithClientAdnDb = (args, opts) => {
28
+ const { database, forShards } = opts;
29
+ const { entities, allLinks, allEntities } = args;
30
+ const effectiveForShards = database === 'main' && forShards;
6
31
  const ent = entities
7
- .filter(e => forShards ? e.sharded : !e.sharded)
8
- .filter(e => !e.elasticOnly);
9
- const joined = (0, genPrismaSchemaForEntities_1.genPrismaSchemaForEntities)(ent, allLinks, forShards);
32
+ .filter((e) => e.storage !== 'elastic' && e.storage !== 'clickhouse')
33
+ .filter((e) => {
34
+ if (database !== 'main') {
35
+ return e.database === database;
36
+ }
37
+ return e.database === 'main' && (forShards ? e.sharded : !e.sharded);
38
+ });
39
+ const crossDbViolations = collectCrossDatabaseEntityLinkViolations(ent, allEntities);
40
+ if (crossDbViolations.length > 0) {
41
+ throw new Error(`Cross-database entity links are not supported (Prisma cannot place @relation across datasources). ` +
42
+ `Replace addLinkField with addViewLinkField for these links in metadata:\n${crossDbViolations.join('\n')}`);
43
+ }
44
+ const joined = (0, genPrismaSchemaForEntities_1.genPrismaSchemaForEntities)(ent, allLinks, effectiveForShards, allEntities);
45
+ const writeEnv = (0, databaseMeta_1.prismaDatasourceWriteEnvVar)(database);
46
+ let outputLine = '';
47
+ if (database === 'main' && effectiveForShards) {
48
+ outputLine = `
49
+ output = "./build"`;
50
+ }
51
+ else if (database !== 'main') {
52
+ outputLine = `
53
+ output = "./client"`;
54
+ }
10
55
  return `generator client {
11
56
  provider = "prisma-client-js"
12
- previewFeatures = ["metrics"]${forShards ? `
13
- output = "./build"` : ''}
57
+ previewFeatures = ["metrics"]${outputLine}
14
58
  }
15
59
 
16
60
  datasource db {
17
61
  provider = "postgresql"
18
- url = env("DATABASE_MAIN_WRITE_URI")
62
+ url = env("${writeEnv}")
19
63
  }
20
64
 
21
65
  ${joined}`;
22
66
  };
23
67
  exports.genPrismaSchemaForEntitiesWithClientAdnDb = genPrismaSchemaForEntitiesWithClientAdnDb;
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuUHJpc21hU2NoZW1hRm9yRW50aXRpZXNXaXRoQ2xpZW50QWRuRGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvamVjdHNHZW5lcmF0aW9uL2dlbmVyYXRvcnMvcHJpc21hL3NjaGVtZS9nZW5QcmlzbWFTY2hlbWFGb3JFbnRpdGllc1dpdGhDbGllbnRBZG5EYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2RUFBdUU7QUFFaEUsTUFBTSx5Q0FBeUMsR0FBRyxDQUFDLEVBQ3hELFFBQVEsRUFDUixRQUFRLEdBQ2tCLEVBQzFCLFNBQVMsR0FBRyxLQUFLLEVBQ2pCLEVBQUU7SUFDRixNQUFNLEdBQUcsR0FBRyxRQUFRO1NBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1NBQy9DLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUEsdURBQTBCLEVBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUVuRSxPQUFPOztpQ0FFd0IsU0FBUyxDQUFDLENBQUMsQ0FBQzt1QkFDdEIsQ0FBQSxDQUFDLENBQUMsRUFBRTs7Ozs7Ozs7RUFRekIsTUFBTSxFQUFFLENBQUE7QUFDVixDQUFDLENBQUE7QUF4QlksUUFBQSx5Q0FBeUMsNkNBd0JyRCJ9
68
+ /** Minimal deploy schema (migrate URL only). */
69
+ const genDeployConnectionPrisma = (database) => {
70
+ const migrationEnv = (0, databaseMeta_1.prismaDatasourceMigrationEnvVar)(database);
71
+ return `datasource db {
72
+ provider = "postgresql"
73
+ url = env("${migrationEnv}")
74
+ }
75
+
76
+ generator client {
77
+ provider = "prisma-client-js"
78
+ }
79
+ `;
80
+ };
81
+ exports.genDeployConnectionPrisma = genDeployConnectionPrisma;
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuUHJpc21hU2NoZW1hRm9yRW50aXRpZXNXaXRoQ2xpZW50QWRuRGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvamVjdHNHZW5lcmF0aW9uL2dlbmVyYXRvcnMvcHJpc21hL3NjaGVtZS9nZW5QcmlzbWFTY2hlbWFGb3JFbnRpdGllc1dpdGhDbGllbnRBZG5EYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSw2RUFBdUU7QUFDdkUsOERBR29DO0FBRXBDLE1BQU0sd0NBQXdDLEdBQUcsQ0FDL0MsUUFBa0IsRUFDbEIsV0FBZ0MsRUFDdEIsRUFBRTtJQUNaLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUMxQixLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsRUFBRTtRQUM3QixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDakMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU0sRUFBRTtnQkFDN0IsU0FBUTthQUNUO1lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxLQUFLLFFBQVEsRUFBRTtnQkFDbkMsU0FBUTthQUNUO1lBQ0QsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDcEQsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDWCxTQUFRO2FBQ1Q7WUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDdkMsS0FBSyxDQUFDLElBQUksQ0FDUixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLENBQUMsY0FBYyxlQUFlLE1BQU0sQ0FBQyxRQUFRLFFBQVEsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUNsSCxDQUFBO2FBQ0Y7U0FDRjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFZTSxNQUFNLHlDQUF5QyxHQUFHLENBQ3ZELElBQStCLEVBQy9CLElBQThCLEVBQzlCLEVBQUU7SUFDRixNQUFNLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBQyxHQUFHLElBQUksQ0FBQTtJQUNsQyxNQUFNLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUMsR0FBRyxJQUFJLENBQUE7SUFFOUMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLEtBQUssTUFBTSxJQUFJLFNBQVMsQ0FBQTtJQUUzRCxNQUFNLEdBQUcsR0FBRyxRQUFRO1NBQ2pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUM7U0FDcEUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDWixJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDdkIsT0FBTyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQTtTQUMvQjtRQUNELE9BQU8sQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RFLENBQUMsQ0FBQyxDQUFBO0lBRUosTUFBTSxpQkFBaUIsR0FBRyx3Q0FBd0MsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDcEYsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2Isb0dBQW9HO1lBQ2xHLDRFQUE0RSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDN0csQ0FBQTtLQUNGO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBQSx1REFBMEIsRUFDdkMsR0FBRyxFQUNILFFBQVEsRUFDUixrQkFBa0IsRUFDbEIsV0FBVyxDQUNaLENBQUE7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFBLDBDQUEyQixFQUFDLFFBQVEsQ0FBQyxDQUFBO0lBRXRELElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQTtJQUNuQixJQUFJLFFBQVEsS0FBSyxNQUFNLElBQUksa0JBQWtCLEVBQUU7UUFDN0MsVUFBVSxHQUFHO3VCQUNNLENBQUE7S0FDcEI7U0FBTSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7UUFDOUIsVUFBVSxHQUFHO3dCQUNPLENBQUE7S0FDckI7SUFFRCxPQUFPOztpQ0FFd0IsVUFBVTs7Ozs7b0JBS3ZCLFFBQVE7OztFQUcxQixNQUFNLEVBQUUsQ0FBQTtBQUNWLENBQUMsQ0FBQTtBQXZEWSxRQUFBLHlDQUF5Qyw2Q0F1RHJEO0FBRUQsZ0RBQWdEO0FBQ3pDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxRQUFnQixFQUFVLEVBQUU7SUFDcEUsTUFBTSxZQUFZLEdBQUcsSUFBQSw4Q0FBK0IsRUFBQyxRQUFRLENBQUMsQ0FBQTtJQUM5RCxPQUFPOztvQkFFVyxZQUFZOzs7Ozs7Q0FNL0IsQ0FBQTtBQUNELENBQUMsQ0FBQTtBQVhZLFFBQUEseUJBQXlCLDZCQVdyQyJ9
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prismaDatasourceMigrationEnvVar = exports.prismaDatasourceWriteEnvVar = exports.databaseNameToEnvSuffix = exports.buildConfigVarsForAdditionalDatabase = exports.validateEntityDatabaseName = exports.postgresUrlDatabaseName = void 0;
4
+ const change_case_1 = require("change-case");
5
+ const ENTITY_DATABASE_NAME_RE = /^[a-z][a-zA-Z0-9]*$/;
6
+ const postgresUrlDatabaseName = (metaDbName) => metaDbName === 'main' ? 'postgres' : (0, change_case_1.snakeCase)(metaDbName);
7
+ exports.postgresUrlDatabaseName = postgresUrlDatabaseName;
8
+ const validateEntityDatabaseName = (name) => {
9
+ if (name === 'main') {
10
+ return;
11
+ }
12
+ if (!ENTITY_DATABASE_NAME_RE.test(name)) {
13
+ throw new Error(`Invalid database name "${name}": use a reserved "main" or an identifier matching ${ENTITY_DATABASE_NAME_RE}.`);
14
+ }
15
+ };
16
+ exports.validateEntityDatabaseName = validateEntityDatabaseName;
17
+ /** Config vars for a non-main database (mirrors database.main.* in SystemMetaBuilder). */
18
+ const buildConfigVarsForAdditionalDatabase = (dbName) => {
19
+ const titleBase = `База данных "${dbName}"`;
20
+ const defaultBase = `postgresql://postgres:password@localhost:5432/${(0, exports.postgresUrlDatabaseName)(dbName)}`;
21
+ return [
22
+ {
23
+ name: `database.${dbName}.write.uri`,
24
+ type: 'string',
25
+ required: true,
26
+ default: defaultBase,
27
+ needFor: `${titleBase}: строка подключения для записи`,
28
+ scopes: ['back', 'worker', 'telegramBot'],
29
+ hidden: true,
30
+ editable: false,
31
+ },
32
+ {
33
+ name: `database.${dbName}.readOnly.uri`,
34
+ type: 'string',
35
+ required: false,
36
+ default: defaultBase,
37
+ needFor: `${titleBase}: строка подключения только для чтения`,
38
+ scopes: ['back', 'worker', 'telegramBot'],
39
+ hidden: true,
40
+ editable: false,
41
+ },
42
+ {
43
+ name: `database.${dbName}.readOnly.enabled`,
44
+ type: 'bool',
45
+ required: true,
46
+ default: false,
47
+ needFor: `${titleBase}: включено ли отдельное подключение для чтения`,
48
+ scopes: ['back', 'worker', 'telegramBot'],
49
+ hidden: false,
50
+ editable: true,
51
+ },
52
+ {
53
+ name: `database.${dbName}.migration.uri`,
54
+ type: 'string',
55
+ required: true,
56
+ default: defaultBase,
57
+ needFor: `${titleBase}: строка подключения для миграций (без pgbouncer)`,
58
+ scopes: ['back', 'worker', 'telegramBot'],
59
+ hidden: true,
60
+ editable: false,
61
+ },
62
+ ];
63
+ };
64
+ exports.buildConfigVarsForAdditionalDatabase = buildConfigVarsForAdditionalDatabase;
65
+ const databaseNameToEnvSuffix = (dbName) => dbName.replace(/([A-Z])/gu, '_$1').replace(/^_/, '').toUpperCase();
66
+ exports.databaseNameToEnvSuffix = databaseNameToEnvSuffix;
67
+ const prismaDatasourceWriteEnvVar = (database) => database === 'main'
68
+ ? 'DATABASE_MAIN_WRITE_URI'
69
+ : `DATABASE_${(0, exports.databaseNameToEnvSuffix)(database)}_WRITE_URI`;
70
+ exports.prismaDatasourceWriteEnvVar = prismaDatasourceWriteEnvVar;
71
+ const prismaDatasourceMigrationEnvVar = (database) => database === 'main'
72
+ ? 'DATABASE_MAIN_MIGRATION_URI'
73
+ : `DATABASE_${(0, exports.databaseNameToEnvSuffix)(database)}_MIGRATION_URI`;
74
+ exports.prismaDatasourceMigrationEnvVar = prismaDatasourceMigrationEnvVar;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2VNZXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Byb2plY3RzR2VuZXJhdGlvbi91dGlscy9kYXRhYmFzZU1ldGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXFDO0FBSXJDLE1BQU0sdUJBQXVCLEdBQUcscUJBQXFCLENBQUE7QUFFOUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLFVBQWtCLEVBQVUsRUFBRSxDQUNwRSxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUEsdUJBQVMsRUFBQyxVQUFVLENBQUMsQ0FBQTtBQUQvQyxRQUFBLHVCQUF1QiwyQkFDd0I7QUFFckQsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLElBQVksRUFBUSxFQUFFO0lBQy9ELElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUNuQixPQUFNO0tBQ1A7SUFDRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQ2IsMEJBQTBCLElBQUksc0RBQXNELHVCQUF1QixHQUFHLENBQy9HLENBQUE7S0FDRjtBQUNILENBQUMsQ0FBQTtBQVRZLFFBQUEsMEJBQTBCLDhCQVN0QztBQUVELDBGQUEwRjtBQUNuRixNQUFNLG9DQUFvQyxHQUFHLENBQ2xELE1BQWMsRUFDRCxFQUFFO0lBQ2YsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLE1BQU0sR0FBRyxDQUFBO0lBQzNDLE1BQU0sV0FBVyxHQUFHLGlEQUFpRCxJQUFBLCtCQUF1QixFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUE7SUFDdEcsT0FBTztRQUNMO1lBQ0UsSUFBSSxFQUFFLFlBQVksTUFBTSxZQUFZO1lBQ3BDLElBQUksRUFBRSxRQUFpQjtZQUN2QixRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLE9BQU8sRUFBRSxHQUFHLFNBQVMsaUNBQWlDO1lBQ3RELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDO1lBQ3pDLE1BQU0sRUFBRSxJQUFJO1lBQ1osUUFBUSxFQUFFLEtBQUs7U0FDaEI7UUFDRDtZQUNFLElBQUksRUFBRSxZQUFZLE1BQU0sZUFBZTtZQUN2QyxJQUFJLEVBQUUsUUFBaUI7WUFDdkIsUUFBUSxFQUFFLEtBQUs7WUFDZixPQUFPLEVBQUUsV0FBVztZQUNwQixPQUFPLEVBQUUsR0FBRyxTQUFTLHdDQUF3QztZQUM3RCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQztZQUN6QyxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxLQUFLO1NBQ2hCO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsWUFBWSxNQUFNLG1CQUFtQjtZQUMzQyxJQUFJLEVBQUUsTUFBZTtZQUNyQixRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSxLQUFLO1lBQ2QsT0FBTyxFQUFFLEdBQUcsU0FBUyxnREFBZ0Q7WUFDckUsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUM7WUFDekMsTUFBTSxFQUFFLEtBQUs7WUFDYixRQUFRLEVBQUUsSUFBSTtTQUNmO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsWUFBWSxNQUFNLGdCQUFnQjtZQUN4QyxJQUFJLEVBQUUsUUFBaUI7WUFDdkIsUUFBUSxFQUFFLElBQUk7WUFDZCxPQUFPLEVBQUUsV0FBVztZQUNwQixPQUFPLEVBQUUsR0FBRyxTQUFTLG1EQUFtRDtZQUN4RSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQztZQUN6QyxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxLQUFLO1NBQ2hCO0tBQ3dCLENBQUE7QUFDN0IsQ0FBQyxDQUFBO0FBL0NZLFFBQUEsb0NBQW9DLHdDQStDaEQ7QUFFTSxNQUFNLHVCQUF1QixHQUFHLENBQUMsTUFBYyxFQUFVLEVBQUUsQ0FDaEUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUR2RCxRQUFBLHVCQUF1QiwyQkFDZ0M7QUFFN0QsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUN0RSxRQUFRLEtBQUssTUFBTTtJQUNqQixDQUFDLENBQUMseUJBQXlCO0lBQzNCLENBQUMsQ0FBQyxZQUFZLElBQUEsK0JBQXVCLEVBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQTtBQUhsRCxRQUFBLDJCQUEyQiwrQkFHdUI7QUFFeEQsTUFBTSwrQkFBK0IsR0FBRyxDQUFDLFFBQWdCLEVBQVUsRUFBRSxDQUMxRSxRQUFRLEtBQUssTUFBTTtJQUNqQixDQUFDLENBQUMsNkJBQTZCO0lBQy9CLENBQUMsQ0FBQyxZQUFZLElBQUEsK0JBQXVCLEVBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFBO0FBSHRELFFBQUEsK0JBQStCLG1DQUd1QiJ9
@@ -1,2 +1,3 @@
1
1
  export { default as SystemMetaBuilder } from './projectsGeneration/builders/SystemMetaBuilder';
2
2
  export * from './projectsGeneration';
3
+ export { Storage, type StorageType, type SearchEngine } from './projectsGeneration/builders/storage';
@@ -2,6 +2,7 @@ import ScalarFieldBuilder from './fields/ScalarFieldBuilder';
2
2
  import IdFieldBuilder from './fields/IdFieldBuilder';
3
3
  import LinkFieldBuilder from './fields/LinkFieldBuilder';
4
4
  import { Multitenancy, BaseSavableEntity, PermissionType, MethodType, DateUnit } from './buildedTypes';
5
+ import { StorageType } from './storage';
5
6
  import CatalogBuilder from './CatalogBuilder';
6
7
  import BaseBuilder from './BaseBuilder';
7
8
  import FormsBuilder from './ui/FormsBuilder';
@@ -38,8 +39,7 @@ declare abstract class BaseSavableEntityBuilder extends BaseBuilder implements M
38
39
  predefinedElements: Record<string, any>[];
39
40
  devPerefinedElements: Record<string, any>[];
40
41
  searchEnabled: boolean;
41
- externalSearch: boolean;
42
- elasticOnly: boolean;
42
+ protected _storage: StorageType;
43
43
  multitenancy: Multitenancy;
44
44
  commonElementsVisibleToAll: boolean;
45
45
  title: Record<string, {
@@ -48,6 +48,7 @@ declare abstract class BaseSavableEntityBuilder extends BaseBuilder implements M
48
48
  }>;
49
49
  externalSearchName: string | undefined;
50
50
  sharded: boolean;
51
+ database: string;
51
52
  isExternalSearch: boolean;
52
53
  clearDBAfter: {
53
54
  count: number;
@@ -68,8 +69,8 @@ declare abstract class BaseSavableEntityBuilder extends BaseBuilder implements M
68
69
  plural: string;
69
70
  singular: string;
70
71
  }, language?: string): this;
71
- setExternalSearch(): this;
72
- setElasticOnly(): this;
72
+ getStorage(): StorageType;
73
+ setStorage(storage: StorageType): this;
73
74
  setSearchEnabled(searchEnabled?: boolean): this;
74
75
  setAuditable(auditable?: boolean): this;
75
76
  setDeletable(deletable?: boolean): this;
@@ -126,6 +127,7 @@ declare abstract class BaseSavableEntityBuilder extends BaseBuilder implements M
126
127
  setDevPredefinedElements(fields: Record<string, any>[]): void;
127
128
  setMultitenancy(multitenancy: Multitenancy, commonElementsVisibleToAll?: boolean): void;
128
129
  setSharded(value?: boolean): this;
130
+ setDatabase(name: string): this;
129
131
  setIsExternalTable(): this;
130
132
  setClearDBAfter(count: number, unit: DateUnit): this;
131
133
  setAllowedToChange(value?: string): this;
@@ -46,6 +46,7 @@ declare class SystemMetaBuilder implements MethodsModelsHolder {
46
46
  protected outputModels: BaseModelBuilder[];
47
47
  labels: string[];
48
48
  additionalServices: AdditionalServiceBuilder[];
49
+ private readonly registeredDatabaseNames;
49
50
  name: string;
50
51
  prefix: string;
51
52
  needFor?: string;
@@ -94,6 +95,7 @@ declare class SystemMetaBuilder implements MethodsModelsHolder {
94
95
  addExternalMenuItem(label: string, url: string): ExternalMenuItemBuilder;
95
96
  addExternalEnvMenuItem(label: string, env: string): ExternalEnvMenuItemBuilder;
96
97
  getBack(): DeploymentBuilder;
98
+ addDatabase(name: string): this;
97
99
  getDocuments(): EntityBuilderWithOptions<DocumentBuilder>[];
98
100
  addDocument(name: string, title?: {
99
101
  singular?: string;
@@ -112,7 +114,9 @@ declare class SystemMetaBuilder implements MethodsModelsHolder {
112
114
  addGlossaryTerm(term: string, definition: string): this;
113
115
  addCommnad(projectCategory: ProjectCategory, name: string, command: string, needFor: string): this;
114
116
  getSavableEntities(): (EntityBuilderWithOptions<CatalogBuilder> | EntityBuilderWithOptions<InfoRegistryBuilder> | EntityBuilderWithOptions<DocumentBuilder> | EntityBuilderWithOptions<SumRegistryBuilder>)[];
115
- getExternalSearchEntities(): Array<CatalogBuilder | DocumentBuilder | InfoRegistryBuilder | SumRegistryBuilder>;
117
+ getEntitiesWithExternalSearch(): Array<CatalogBuilder | DocumentBuilder | InfoRegistryBuilder | SumRegistryBuilder>;
118
+ getEntitiesWithElasticSearch(): Array<CatalogBuilder | DocumentBuilder | InfoRegistryBuilder | SumRegistryBuilder>;
119
+ getEntitiesWithClickHouseSearch(): Array<CatalogBuilder | DocumentBuilder | InfoRegistryBuilder | SumRegistryBuilder>;
116
120
  addMethod(name: string, methodType: MethodType, title?: string): MethodBuilder;
117
121
  addLabel(label: string): void;
118
122
  getMethods(): MethodBuilder[];
@@ -1,5 +1,6 @@
1
1
  import { HttpMethod } from './curlTypes';
2
2
  import { DocumentationOfDocument } from './docs/DocumentationOfDocument';
3
+ import { StorageType } from './storage';
3
4
  import { Index } from './types';
4
5
  import Forms from './ui/Forms';
5
6
  export type ConfigVarScope = 'ci' | 'back' | 'admin-app' | 'cutomer-app' | 'worker' | 'telegramBot';
@@ -18,6 +19,9 @@ export interface Glossary {
18
19
  term: string;
19
20
  definition: string;
20
21
  }
22
+ export type DataBaseMeta = {
23
+ name: string;
24
+ };
21
25
  export type ProjectCategory = 'back' | 'ui' | 'app' | 'land';
22
26
  export interface Command {
23
27
  projectCategory: ProjectCategory;
@@ -206,8 +210,7 @@ export type BaseSavableEntity = BaseEntity & {
206
210
  predefinedElements: Record<string, any>[];
207
211
  devPerefinedElements: Record<string, any>[];
208
212
  auditable: boolean;
209
- externalSearch: boolean;
210
- elasticOnly: boolean;
213
+ storage: StorageType;
211
214
  searchEnabled: boolean;
212
215
  sortField: string;
213
216
  creatableByUser: boolean;
@@ -238,6 +241,7 @@ export type BaseSavableEntity = BaseEntity & {
238
241
  labels: string[];
239
242
  excludeFromCommonMenu: boolean;
240
243
  cacheable: boolean;
244
+ database: string;
241
245
  };
242
246
  export type Report = BaseEntity & {
243
247
  type: 'report';
@@ -427,6 +431,7 @@ export type System = {
427
431
  prefix: string;
428
432
  needFor?: string;
429
433
  configVars: ConfigVar[];
434
+ dataBases: DataBaseMeta[];
430
435
  catalogs: Catalog[];
431
436
  documents: Document[];
432
437
  infoRegistries: InfoRegistry[];
@@ -0,0 +1,21 @@
1
+ export type StorageType = 'postgres' | 'elastic' | 'clickhouse' | 'postgres_with_elastic_search' | 'postgres_with_clickhouse_search';
2
+ export type SearchEngine = 'elastic' | 'clickhouse';
3
+ export declare const Storage: {
4
+ readonly POSTGRES: "postgres";
5
+ readonly ELASTIC: "elastic";
6
+ readonly CLICKHOUSE: "clickhouse";
7
+ readonly POSTGRES_WITH_ELASTIC_SEARCH: "postgres_with_elastic_search";
8
+ readonly POSTGRES_WITH_CLICKHOUSE_SEARCH: "postgres_with_clickhouse_search";
9
+ };
10
+ export declare const isStoragePostgres: (storage: StorageType) => boolean;
11
+ export declare const isStorageElasticOnly: (storage: StorageType) => boolean;
12
+ export declare const isStorageClickHouseOnly: (storage: StorageType) => boolean;
13
+ export declare const isStorageExternalSearch: (storage: StorageType) => boolean;
14
+ export declare const isStorageElasticSearch: (storage: StorageType) => boolean;
15
+ export declare const isStorageClickHouseSearch: (storage: StorageType) => boolean;
16
+ export declare const getSearchEngine: (storage: StorageType) => SearchEngine | null;
17
+ export declare const getSearchServicePrefix: (storage: StorageType) => 'Elastic' | 'ClickHouse' | null;
18
+ export declare const usesPrismaDelegate: (storage: StorageType) => boolean;
19
+ export declare const getConfigExternalSearch: (storage: StorageType) => boolean;
20
+ export declare const entityUsesElasticBootstrap: (storage: StorageType) => boolean;
21
+ export declare const entityUsesClickHouseBootstrap: (storage: StorageType) => boolean;
@@ -0,0 +1,2 @@
1
+ import SystemMetaBuilder from '../builders/SystemMetaBuilder';
2
+ export declare const addExternalSearch: (system: SystemMetaBuilder) => void;
@@ -1,2 +1,2 @@
1
1
  export * from './files';
2
- export * from './addElasticSearch';
2
+ export * from './addExternalSearch';
@@ -0,0 +1,3 @@
1
+ import { ProjectWideGenerationArgs } from '../args';
2
+ import { FileCreator } from './types';
3
+ export declare const generateBackClickHouseBootstrap: (fileCreator: FileCreator, args: ProjectWideGenerationArgs) => void;
@@ -0,0 +1,183 @@
1
+ import { Entity } from '../../../../builders';
2
+ export declare const genClickHouseJobsDataTmpl: (entities: Entity[], _options?: {
3
+ genPrismaServices: boolean;
4
+ genGraphSchema: boolean;
5
+ genGraphResolvers: boolean;
6
+ genUiResources: boolean;
7
+ skipWarningThisIsGenerated: boolean;
8
+ genPrismaSchema: boolean;
9
+ genContext: boolean;
10
+ typesOnly: boolean;
11
+ genRootConfig: boolean;
12
+ genRootElements: boolean;
13
+ genUiCountWidget: boolean;
14
+ genUiListWidget: boolean;
15
+ genUiAppBar: boolean;
16
+ genUiEntityMapping: boolean;
17
+ genUiMenu: boolean;
18
+ genUiElements: boolean;
19
+ genUiResourcesPage: boolean;
20
+ genUiRoutes: boolean;
21
+ genUIApp: boolean;
22
+ genUiFunctions: boolean;
23
+ genUiDashboard: boolean;
24
+ showMetaPage: boolean;
25
+ readOnly: boolean;
26
+ forms: {
27
+ list: {
28
+ gen: boolean;
29
+ };
30
+ show: {
31
+ gen: boolean;
32
+ };
33
+ edit: {
34
+ gen: boolean;
35
+ idEditable: boolean;
36
+ };
37
+ create: {
38
+ gen: boolean;
39
+ idEditable: boolean;
40
+ };
41
+ menu: {
42
+ show: boolean;
43
+ };
44
+ resourcesPage: {
45
+ show: boolean;
46
+ };
47
+ };
48
+ projectsGroup: string;
49
+ projectPrefix: string;
50
+ dbName: string;
51
+ projectName: string;
52
+ k8sChartName: string;
53
+ k8sNamespacePrefix: string;
54
+ k8sAppsDomain: string;
55
+ k8sSubdomainPrefix: string;
56
+ k8sImagePullSecrets: string;
57
+ ciDockerRegistry: string;
58
+ telemetry: boolean;
59
+ useSortedFilter: boolean;
60
+ genBackGitlabCi: boolean;
61
+ genUiGitlabCi: boolean;
62
+ genBackCiNotify: boolean;
63
+ genUiCiNotify: boolean;
64
+ adminBaseDockerimage: string;
65
+ backendBaseDockerimage: string;
66
+ genBackChartValues: boolean;
67
+ genBackChartIngress: boolean;
68
+ genBackChartBack: boolean;
69
+ genUiChartIngress: boolean;
70
+ genUiChartFront: boolean;
71
+ ingressAnnotationBodySize: string;
72
+ mountebankEnabled: boolean;
73
+ exportHtmlEnabled: boolean;
74
+ corePrismaGetter: boolean;
75
+ coreIndex: boolean;
76
+ usersEnabled: boolean;
77
+ tenantsAvailable: boolean;
78
+ themesEnabled: boolean;
79
+ mainColorOfAppTitile: boolean;
80
+ sharding: boolean;
81
+ breadcrumb: boolean;
82
+ showFunctionsInMenu: boolean;
83
+ showResourcesInMenu: boolean;
84
+ showMetaInMenu: boolean;
85
+ genFrontend: boolean;
86
+ genDockerfileBack: boolean;
87
+ genDockerfileUI: boolean;
88
+ auditableOnlyByUser: boolean;
89
+ graphGeneratorCommand: string;
90
+ detachedBackProject: string;
91
+ detachedUiProject: string;
92
+ }) => string;
93
+ export declare const genClickHouseJobsTmpl: (entities: Entity[], options?: {
94
+ genPrismaServices: boolean;
95
+ genGraphSchema: boolean;
96
+ genGraphResolvers: boolean;
97
+ genUiResources: boolean;
98
+ skipWarningThisIsGenerated: boolean;
99
+ genPrismaSchema: boolean;
100
+ genContext: boolean;
101
+ typesOnly: boolean;
102
+ genRootConfig: boolean;
103
+ genRootElements: boolean;
104
+ genUiCountWidget: boolean;
105
+ genUiListWidget: boolean;
106
+ genUiAppBar: boolean;
107
+ genUiEntityMapping: boolean;
108
+ genUiMenu: boolean;
109
+ genUiElements: boolean;
110
+ genUiResourcesPage: boolean;
111
+ genUiRoutes: boolean;
112
+ genUIApp: boolean;
113
+ genUiFunctions: boolean;
114
+ genUiDashboard: boolean;
115
+ showMetaPage: boolean;
116
+ readOnly: boolean;
117
+ forms: {
118
+ list: {
119
+ gen: boolean;
120
+ };
121
+ show: {
122
+ gen: boolean;
123
+ };
124
+ edit: {
125
+ gen: boolean;
126
+ idEditable: boolean;
127
+ };
128
+ create: {
129
+ gen: boolean;
130
+ idEditable: boolean;
131
+ };
132
+ menu: {
133
+ show: boolean;
134
+ };
135
+ resourcesPage: {
136
+ show: boolean;
137
+ };
138
+ };
139
+ projectsGroup: string;
140
+ projectPrefix: string;
141
+ dbName: string;
142
+ projectName: string;
143
+ k8sChartName: string;
144
+ k8sNamespacePrefix: string;
145
+ k8sAppsDomain: string;
146
+ k8sSubdomainPrefix: string;
147
+ k8sImagePullSecrets: string;
148
+ ciDockerRegistry: string;
149
+ telemetry: boolean;
150
+ useSortedFilter: boolean;
151
+ genBackGitlabCi: boolean;
152
+ genUiGitlabCi: boolean;
153
+ genBackCiNotify: boolean;
154
+ genUiCiNotify: boolean;
155
+ adminBaseDockerimage: string;
156
+ backendBaseDockerimage: string;
157
+ genBackChartValues: boolean;
158
+ genBackChartIngress: boolean;
159
+ genBackChartBack: boolean;
160
+ genUiChartIngress: boolean;
161
+ genUiChartFront: boolean;
162
+ ingressAnnotationBodySize: string;
163
+ mountebankEnabled: boolean;
164
+ exportHtmlEnabled: boolean;
165
+ corePrismaGetter: boolean;
166
+ coreIndex: boolean;
167
+ usersEnabled: boolean;
168
+ tenantsAvailable: boolean;
169
+ themesEnabled: boolean;
170
+ mainColorOfAppTitile: boolean;
171
+ sharding: boolean;
172
+ breadcrumb: boolean;
173
+ showFunctionsInMenu: boolean;
174
+ showResourcesInMenu: boolean;
175
+ showMetaInMenu: boolean;
176
+ genFrontend: boolean;
177
+ genDockerfileBack: boolean;
178
+ genDockerfileUI: boolean;
179
+ auditableOnlyByUser: boolean;
180
+ graphGeneratorCommand: string;
181
+ detachedBackProject: string;
182
+ detachedUiProject: string;
183
+ }) => string;
@@ -1,2 +1,2 @@
1
- import { BootstrapEntityOptions } from '../../../../../../types';
2
- export declare const prismaGetterTmpl: (_options?: BootstrapEntityOptions) => string;
1
+ import { ProjectWideGenerationArgs } from '../../../../../../args';
2
+ export declare const prismaGetterTmpl: (args: ProjectWideGenerationArgs) => string;
@@ -1,3 +1,3 @@
1
1
  import { Entity } from '../../../builders';
2
2
  import { LinkedEntities } from '../../../types';
3
- export declare const genPrismaEntity: (entity: Entity, links: LinkedEntities[], forShards?: boolean) => string;
3
+ export declare const genPrismaEntity: (entity: Entity, links: LinkedEntities[], forShards?: boolean, allEntities?: Map<string, Entity>) => string;
@@ -1,3 +1,3 @@
1
1
  import { Entity } from '../../../builders';
2
2
  import { LinkedEntities } from '../../../types';
3
- export declare const genPrismaSchemaForEntities: (entities: Entity[], links: LinkedEntities[], forShards?: boolean) => string;
3
+ export declare const genPrismaSchemaForEntities: (entities: Entity[], links: LinkedEntities[], forShards?: boolean, allEntities?: Map<string, Entity>) => string;
@@ -1,2 +1,13 @@
1
1
  import { ProjectWideGenerationArgs } from '../../../args';
2
- export declare const genPrismaSchemaForEntitiesWithClientAdnDb: ({ entities, allLinks, }: ProjectWideGenerationArgs, forShards?: boolean) => string;
2
+ export type GenPrismaSchemaDbOptions = {
3
+ /** Logical database key; `main` uses legacy paths and split by sharding. */
4
+ database: string;
5
+ /**
6
+ * When `database === 'main'`, same as today: shard vs non-shard models.
7
+ * For `database !== 'main'`, callers must pass `false` (sharding ignored).
8
+ */
9
+ forShards: boolean;
10
+ };
11
+ export declare const genPrismaSchemaForEntitiesWithClientAdnDb: (args: ProjectWideGenerationArgs, opts: GenPrismaSchemaDbOptions) => string;
12
+ /** Minimal deploy schema (migrate URL only). */
13
+ export declare const genDeployConnectionPrisma: (database: string) => string;
@@ -0,0 +1,8 @@
1
+ import { ConfigVar } from '../builders/buildedTypes';
2
+ export declare const postgresUrlDatabaseName: (metaDbName: string) => string;
3
+ export declare const validateEntityDatabaseName: (name: string) => void;
4
+ /** Config vars for a non-main database (mirrors database.main.* in SystemMetaBuilder). */
5
+ export declare const buildConfigVarsForAdditionalDatabase: (dbName: string) => ConfigVar[];
6
+ export declare const databaseNameToEnvSuffix: (dbName: string) => string;
7
+ export declare const prismaDatasourceWriteEnvVar: (database: string) => string;
8
+ export declare const prismaDatasourceMigrationEnvVar: (database: string) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runlify",
3
- "version": "0.0.780",
3
+ "version": "0.0.783",
4
4
  "description": "runlify CLI",
5
5
  "private": false,
6
6
  "main": "build/index.js",
@@ -1,2 +0,0 @@
1
- import SystemMetaBuilder from '../builders/SystemMetaBuilder';
2
- export declare const addElasticSearch: (system: SystemMetaBuilder) => void;