@liminalfunctions/framework 1.0.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 (181) hide show
  1. package/.mocharc.json +5 -0
  2. package/dist/F_Client_Collection_Registry.d.ts +18 -0
  3. package/dist/F_Client_Collection_Registry.js +36 -0
  4. package/dist/F_Client_Collection_Registry.js.map +1 -0
  5. package/dist/F_Collection.d.ts +21 -0
  6. package/dist/F_Collection.js +36 -0
  7. package/dist/F_Collection.js.map +1 -0
  8. package/dist/F_Collection_Registry.d.ts +11 -0
  9. package/dist/F_Collection_Registry.js +18 -0
  10. package/dist/F_Collection_Registry.js.map +1 -0
  11. package/dist/F_Compile.d.ts +4 -0
  12. package/dist/F_Compile.js +298 -0
  13. package/dist/F_Compile.js.map +1 -0
  14. package/dist/F_Security_Models/F_SM_Open_Access.d.ts +11 -0
  15. package/dist/F_Security_Models/F_SM_Open_Access.js +14 -0
  16. package/dist/F_Security_Models/F_SM_Open_Access.js.map +1 -0
  17. package/dist/F_Security_Models/F_SM_Ownership.d.ts +12 -0
  18. package/dist/F_Security_Models/F_SM_Ownership.js +46 -0
  19. package/dist/F_Security_Models/F_SM_Ownership.js.map +1 -0
  20. package/dist/F_Security_Models/F_SM_Role_Membership.d.ts +19 -0
  21. package/dist/F_Security_Models/F_SM_Role_Membership.js +73 -0
  22. package/dist/F_Security_Models/F_SM_Role_Membership.js.map +1 -0
  23. package/dist/F_Security_Models/F_Security_Model.d.ts +41 -0
  24. package/dist/F_Security_Models/F_Security_Model.js +29 -0
  25. package/dist/F_Security_Models/F_Security_Model.js.map +1 -0
  26. package/dist/code_generation/generate_client_library.d.ts +4 -0
  27. package/dist/code_generation/generate_client_library.js +158 -0
  28. package/dist/code_generation/generate_client_library.js.map +1 -0
  29. package/dist/code_generation/templates/.gitignore.mustache +383 -0
  30. package/dist/code_generation/templates/collection.mustache +106 -0
  31. package/dist/code_generation/templates/main.mustache +24 -0
  32. package/dist/code_generation/templates/package.json.mustache +18 -0
  33. package/dist/code_generation/templates/tsconfig.json.mustache +14 -0
  34. package/dist/code_generation/templates/types.mustache +4 -0
  35. package/dist/code_generation/templates/utils.ts.mustache +17 -0
  36. package/dist/code_generation/utils/tab_indent.d.ts +1 -0
  37. package/dist/code_generation/utils/tab_indent.js +4 -0
  38. package/dist/code_generation/utils/tab_indent.js.map +1 -0
  39. package/dist/code_generation/utils/type_from_zod.d.ts +2 -0
  40. package/dist/code_generation/utils/type_from_zod.js +102 -0
  41. package/dist/code_generation/utils/type_from_zod.js.map +1 -0
  42. package/dist/utils/cache.d.ts +13 -0
  43. package/dist/utils/cache.js +101 -0
  44. package/dist/utils/cache.js.map +1 -0
  45. package/dist/utils/mongoose_from_zod.d.ts +13 -0
  46. package/dist/utils/mongoose_from_zod.js +164 -0
  47. package/dist/utils/mongoose_from_zod.js.map +1 -0
  48. package/dist/utils/pretty_print_zod.d.ts +2 -0
  49. package/dist/utils/pretty_print_zod.js +63 -0
  50. package/dist/utils/pretty_print_zod.js.map +1 -0
  51. package/dist/utils/query_object_to_mongodb_query.d.ts +3 -0
  52. package/dist/utils/query_object_to_mongodb_query.js +61 -0
  53. package/dist/utils/query_object_to_mongodb_query.js.map +1 -0
  54. package/dist/utils/query_validator_from_zod.d.ts +6 -0
  55. package/dist/utils/query_validator_from_zod.js +216 -0
  56. package/dist/utils/query_validator_from_zod.js.map +1 -0
  57. package/package.json +36 -0
  58. package/src/F_Collection.ts +50 -0
  59. package/src/F_Collection_Registry.ts +29 -0
  60. package/src/F_Compile.ts +368 -0
  61. package/src/F_Security_Models/F_SM_Open_Access.ts +21 -0
  62. package/src/F_Security_Models/F_SM_Ownership.ts +72 -0
  63. package/src/F_Security_Models/F_SM_Role_Membership.ts +87 -0
  64. package/src/F_Security_Models/F_Security_Model.ts +85 -0
  65. package/src/code_generation/generate_client_library.ts +197 -0
  66. package/src/code_generation/templates/.gitignore.mustache +383 -0
  67. package/src/code_generation/templates/collection.mustache +106 -0
  68. package/src/code_generation/templates/main.mustache +24 -0
  69. package/src/code_generation/templates/package.json.mustache +18 -0
  70. package/src/code_generation/templates/tsconfig.json.mustache +14 -0
  71. package/src/code_generation/templates/types.mustache +4 -0
  72. package/src/code_generation/templates/utils.ts.mustache +17 -0
  73. package/src/code_generation/utils/tab_indent.ts +3 -0
  74. package/src/code_generation/utils/type_from_zod.ts +140 -0
  75. package/src/utils/cache.ts +149 -0
  76. package/src/utils/mongoose_from_zod.ts +191 -0
  77. package/src/utils/pretty_print_zod.ts +75 -0
  78. package/src/utils/query_object_to_mongodb_query.ts +73 -0
  79. package/src/utils/query_validator_from_zod.ts +246 -0
  80. package/test/0_0_mongoose_from_zod.test.ts +260 -0
  81. package/test/0_1_query_validator_from_zod.test.ts +518 -0
  82. package/test/0_2_query_validator_to_mongodb_query.test.ts +365 -0
  83. package/test/0_3_cache.test.ts +204 -0
  84. package/test/1_0_basic_server.test.ts +530 -0
  85. package/test/1_1_security_ownership.test.ts +328 -0
  86. package/test/1_2_role_membership.test.ts +731 -0
  87. package/test/2_0_client_library_basic_type_generation.test.ts +444 -0
  88. package/test/2_0_client_library_query_type_generation.test.ts +352 -0
  89. package/test/2_1_client_library_generation.test.ts +255 -0
  90. package/test/tmp/dist/Brief_News_Category.d.ts +16 -0
  91. package/test/tmp/dist/Brief_News_Category.js +85 -0
  92. package/test/tmp/dist/Brief_News_Category.js.map +1 -0
  93. package/test/tmp/dist/Client.d.ts +19 -0
  94. package/test/tmp/dist/Client.js +97 -0
  95. package/test/tmp/dist/Client.js.map +1 -0
  96. package/test/tmp/dist/Institution.d.ts +18 -0
  97. package/test/tmp/dist/Institution.js +94 -0
  98. package/test/tmp/dist/Institution.js.map +1 -0
  99. package/test/tmp/dist/Project.d.ts +16 -0
  100. package/test/tmp/dist/Project.js +85 -0
  101. package/test/tmp/dist/Project.js.map +1 -0
  102. package/test/tmp/dist/index.d.ts +4 -0
  103. package/test/tmp/dist/index.js +14 -0
  104. package/test/tmp/dist/index.js.map +1 -0
  105. package/test/tmp/dist/types/brief_news_category.d.ts +7 -0
  106. package/test/tmp/dist/types/brief_news_category.js +2 -0
  107. package/test/tmp/dist/types/brief_news_category.js.map +1 -0
  108. package/test/tmp/dist/types/brief_news_category_post.d.ts +7 -0
  109. package/test/tmp/dist/types/brief_news_category_post.js +2 -0
  110. package/test/tmp/dist/types/brief_news_category_post.js.map +1 -0
  111. package/test/tmp/dist/types/brief_news_category_put.d.ts +7 -0
  112. package/test/tmp/dist/types/brief_news_category_put.js +2 -0
  113. package/test/tmp/dist/types/brief_news_category_put.js.map +1 -0
  114. package/test/tmp/dist/types/brief_news_category_query.d.ts +26 -0
  115. package/test/tmp/dist/types/brief_news_category_query.js +2 -0
  116. package/test/tmp/dist/types/brief_news_category_query.js.map +1 -0
  117. package/test/tmp/dist/types/client.d.ts +5 -0
  118. package/test/tmp/dist/types/client.js +2 -0
  119. package/test/tmp/dist/types/client.js.map +1 -0
  120. package/test/tmp/dist/types/client_post.d.ts +5 -0
  121. package/test/tmp/dist/types/client_post.js +2 -0
  122. package/test/tmp/dist/types/client_post.js.map +1 -0
  123. package/test/tmp/dist/types/client_put.d.ts +5 -0
  124. package/test/tmp/dist/types/client_put.js +2 -0
  125. package/test/tmp/dist/types/client_put.js.map +1 -0
  126. package/test/tmp/dist/types/client_query.d.ts +18 -0
  127. package/test/tmp/dist/types/client_query.js +2 -0
  128. package/test/tmp/dist/types/client_query.js.map +1 -0
  129. package/test/tmp/dist/types/institution.d.ts +4 -0
  130. package/test/tmp/dist/types/institution.js +2 -0
  131. package/test/tmp/dist/types/institution.js.map +1 -0
  132. package/test/tmp/dist/types/institution_post.d.ts +4 -0
  133. package/test/tmp/dist/types/institution_post.js +2 -0
  134. package/test/tmp/dist/types/institution_post.js.map +1 -0
  135. package/test/tmp/dist/types/institution_put.d.ts +4 -0
  136. package/test/tmp/dist/types/institution_put.js +2 -0
  137. package/test/tmp/dist/types/institution_put.js.map +1 -0
  138. package/test/tmp/dist/types/institution_query.d.ts +14 -0
  139. package/test/tmp/dist/types/institution_query.js +2 -0
  140. package/test/tmp/dist/types/institution_query.js.map +1 -0
  141. package/test/tmp/dist/types/project.d.ts +7 -0
  142. package/test/tmp/dist/types/project.js +2 -0
  143. package/test/tmp/dist/types/project.js.map +1 -0
  144. package/test/tmp/dist/types/project_post.d.ts +7 -0
  145. package/test/tmp/dist/types/project_post.js +2 -0
  146. package/test/tmp/dist/types/project_post.js.map +1 -0
  147. package/test/tmp/dist/types/project_put.d.ts +7 -0
  148. package/test/tmp/dist/types/project_put.js +2 -0
  149. package/test/tmp/dist/types/project_put.js.map +1 -0
  150. package/test/tmp/dist/types/project_query.d.ts +27 -0
  151. package/test/tmp/dist/types/project_query.js +2 -0
  152. package/test/tmp/dist/types/project_query.js.map +1 -0
  153. package/test/tmp/dist/utils/utils.d.ts +11 -0
  154. package/test/tmp/dist/utils/utils.js +13 -0
  155. package/test/tmp/dist/utils/utils.js.map +1 -0
  156. package/test/tmp/package-lock.json +573 -0
  157. package/test/tmp/package.json +18 -0
  158. package/test/tmp/src/Brief_News_Category.ts +94 -0
  159. package/test/tmp/src/Client.ts +106 -0
  160. package/test/tmp/src/Institution.ts +103 -0
  161. package/test/tmp/src/Project.ts +94 -0
  162. package/test/tmp/src/index.ts +20 -0
  163. package/test/tmp/src/types/brief_news_category.ts +7 -0
  164. package/test/tmp/src/types/brief_news_category_post.ts +7 -0
  165. package/test/tmp/src/types/brief_news_category_put.ts +7 -0
  166. package/test/tmp/src/types/brief_news_category_query.ts +26 -0
  167. package/test/tmp/src/types/client.ts +5 -0
  168. package/test/tmp/src/types/client_post.ts +5 -0
  169. package/test/tmp/src/types/client_put.ts +5 -0
  170. package/test/tmp/src/types/client_query.ts +18 -0
  171. package/test/tmp/src/types/institution.ts +4 -0
  172. package/test/tmp/src/types/institution_post.ts +4 -0
  173. package/test/tmp/src/types/institution_put.ts +4 -0
  174. package/test/tmp/src/types/institution_query.ts +14 -0
  175. package/test/tmp/src/types/project.ts +7 -0
  176. package/test/tmp/src/types/project_post.ts +7 -0
  177. package/test/tmp/src/types/project_put.ts +7 -0
  178. package/test/tmp/src/types/project_query.ts +27 -0
  179. package/test/tmp/src/utils/utils.ts +17 -0
  180. package/test/tmp/tsconfig.json +14 -0
  181. package/tsconfig.json +14 -0
@@ -0,0 +1,73 @@
1
+ import { Cache } from "../utils/cache.js";
2
+ import { F_Security_Model } from "./F_Security_Model.js";
3
+ import mongoose from "mongoose";
4
+ let operation_permission_map = {
5
+ 'get': 'read',
6
+ 'create': 'create',
7
+ 'update': 'update',
8
+ 'delete': 'delete'
9
+ };
10
+ export class F_SM_Role_Membership extends F_Security_Model {
11
+ user_id_field;
12
+ role_id_field;
13
+ layer_collection_id;
14
+ role_membership_collection;
15
+ role_membership_cache;
16
+ role_collection;
17
+ role_cache;
18
+ constructor(collection, layer_collection, role_membership_collection, role_collection, role_membership_cache, role_cache, user_id_field = 'user_id', role_id_field = 'role_id') {
19
+ super(collection);
20
+ this.needs_auth_user = true;
21
+ this.user_id_field = user_id_field;
22
+ this.role_id_field = role_id_field;
23
+ this.layer_collection_id = layer_collection.collection_id;
24
+ this.role_membership_collection = role_membership_collection;
25
+ this.role_membership_cache = role_membership_cache ?? new Cache(60);
26
+ this.role_collection = role_collection;
27
+ this.role_cache = role_cache ?? new Cache(60);
28
+ if (!this.role_collection.mongoose_schema.permissions) {
29
+ throw new Error(`could not find field "permissions" on role collection. Permissions should be an object of the format {[key: collection_id]: ('read'| 'create'| 'update'| 'delete')[]}`);
30
+ }
31
+ }
32
+ async has_permission(req, res, find, operation) {
33
+ let user_id = req.auth.user_id;
34
+ let layer_id = req.params[this.layer_collection_id];
35
+ let role_membership = await this.role_membership_cache.first_fetch_then_refresh(`${user_id}-${layer_id}`, async () => {
36
+ let role_memberships = await this.role_membership_collection.mongoose_model.find({
37
+ [this.user_id_field]: user_id,
38
+ [`${this.layer_collection_id}_id`]: new mongoose.Types.ObjectId(layer_id)
39
+ });
40
+ if (role_memberships.length > 1) {
41
+ console.warn(`in F_SM_Role_Membership, more than one role membership for user ${user_id} at layer ${this.layer_collection_id} found.`);
42
+ }
43
+ return role_memberships[0];
44
+ });
45
+ if (!role_membership) {
46
+ return false;
47
+ }
48
+ if (!role_membership[this.role_id_field]) {
49
+ console.warn(`role membership collection ${this.role_membership_collection.collection_id} did not have role ID filed ${this.role_id_field}`);
50
+ return false;
51
+ }
52
+ let role = await this.role_cache.first_fetch_then_refresh(role_membership[this.role_id_field], async () => {
53
+ let role = await this.role_collection.mongoose_model.findById(role_membership[this.role_id_field]);
54
+ return role;
55
+ });
56
+ if (!role) {
57
+ return false;
58
+ }
59
+ if (!role.permissions) {
60
+ console.warn(`role collection ${this.role_collection.collection_id} was missing its permissions field`);
61
+ return false;
62
+ }
63
+ if (!role.permissions[this.collection.collection_id]) {
64
+ console.warn(`role collection ${this.role_collection.collection_id} was missing its permissions.${this.collection.collection_id} field`);
65
+ return false;
66
+ }
67
+ return role.permissions[this.collection.collection_id].includes(operation_permission_map[operation]);
68
+ }
69
+ async handle_empty_query_results(req, res, operation) {
70
+ return { data: null };
71
+ }
72
+ }
73
+ //# sourceMappingURL=F_SM_Role_Membership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"F_SM_Role_Membership.js","sourceRoot":"","sources":["../../src/F_Security_Models/F_SM_Role_Membership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import * as z from "zod/v4";
2
+ import { Request, Response } from "express";
3
+ import { F_Collection } from "../F_Collection.js";
4
+ export type Operation = 'get' | 'update' | 'create' | 'delete';
5
+ export declare abstract class F_Security_Model<Collection_ID extends string, ZodSchema extends z.ZodObject> {
6
+ collection: F_Collection<Collection_ID, ZodSchema>;
7
+ needs_auth_user: boolean;
8
+ static auth_fetcher: (req: Request) => Promise<Auth_Data | undefined>;
9
+ constructor(collection: F_Collection<Collection_ID, ZodSchema>);
10
+ abstract has_permission(req: Request, res: Response, find: {
11
+ [key: string]: any;
12
+ }, operation: Operation): Promise<boolean>;
13
+ abstract handle_empty_query_results(req: Request, res: Response, operation: Operation): Promise<Empty_Query_Possibilities>;
14
+ static set_auth_fetcher(fetcher: (req: Request) => Promise<Auth_Data | undefined>): void;
15
+ static has_permission(models: F_Security_Model<string, any>[], req: Request, res: Response, find: {
16
+ [key: string]: any;
17
+ }, operation: Operation): Promise<F_Security_Model<string, any>>;
18
+ static model_with_permission(models: F_Security_Model<string, any>[], req: Request, res: Response, find: {
19
+ [key: string]: any;
20
+ }, operation: Operation): Promise<F_Security_Model<string, any>>;
21
+ }
22
+ export type Auth_Data = {
23
+ user_id: string;
24
+ layers: {
25
+ layer_id: string;
26
+ permissions: {
27
+ [key: string]: Operation[];
28
+ };
29
+ special_permissions: {
30
+ [key: string]: string[];
31
+ };
32
+ }[];
33
+ };
34
+ export type Authenticated_Request = Request & {
35
+ auth: Auth_Data;
36
+ };
37
+ export type Empty_Query_Possibilities = {
38
+ data: null;
39
+ } | {
40
+ error: string;
41
+ };
@@ -0,0 +1,29 @@
1
+ export class F_Security_Model {
2
+ collection;
3
+ needs_auth_user;
4
+ static auth_fetcher;
5
+ constructor(collection) {
6
+ this.collection = collection;
7
+ }
8
+ static set_auth_fetcher(fetcher) {
9
+ F_Security_Model.auth_fetcher = fetcher;
10
+ }
11
+ static async has_permission(models, req, res, find, operation) { console.error(`F_Security_Model.has_permission is deprecated in favor of F_Security_Model.model_with_permission.`); return await F_Security_Model.model_with_permission(models, req, res, find, operation); }
12
+ static async model_with_permission(models, req, res, find, operation) {
13
+ let has_attempted_authenticating_user = false;
14
+ for (let security_model of models) {
15
+ if (security_model.needs_auth_user && !has_attempted_authenticating_user) {
16
+ has_attempted_authenticating_user = true;
17
+ req.auth = await F_Security_Model.auth_fetcher(req);
18
+ }
19
+ if (security_model.needs_auth_user && !req.auth) {
20
+ continue;
21
+ }
22
+ if (await security_model.has_permission(req, res, find, operation)) {
23
+ return security_model;
24
+ }
25
+ }
26
+ return undefined;
27
+ }
28
+ }
29
+ //# sourceMappingURL=F_Security_Model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"F_Security_Model.js","sourceRoot":"","sources":["../../src/F_Security_Models/F_Security_Model.ts"],"names":[],"mappings":"AAOA,MAAM,OAAgB,gBAAgB;IAClC,UAAU,CAAyC;IACnD,eAAe,CAAS;IACxB,MAAM,CAAC,YAAY,CAAkD;IAErE,YAAY,UAAkD;QAC1D,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IA4BD,MAAM,CAAC,gBAAgB,CAAC,OAAyD;QAC7E,gBAAgB,CAAC,YAAY,GAAG,OAAO,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAuC,EAAE,GAAY,EAAE,GAAa,EAAE,IAA0B,EAAE,SAAoB,IAAG,OAAO,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC,CAAC,OAAO,MAAM,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAClW,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAuC,EAAE,GAAY,EAAE,GAAa,EAAE,IAA0B,EAAE,SAAoB;QACrJ,IAAI,iCAAiC,GAAG,KAAK,CAAC;QAE9C,KAAK,IAAI,cAAc,IAAI,MAAM,EAAE,CAAC;YAEhC,IAAI,cAAc,CAAC,eAAe,IAAI,CAAC,iCAAiC,EAAE,CAAC;gBACvE,iCAAiC,GAAG,IAAI,CAAC;gBACxC,GAA6B,CAAC,IAAI,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACnF,CAAC;YAGD,IAAI,cAAc,CAAC,eAAe,IAAI,CAAE,GAA6B,CAAC,IAAI,EAAE,CAAC;gBACzE,SAAS;YACb,CAAC;YAGD,IAAI,MAAM,cAAc,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;gBACjE,OAAO,cAAc,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ"}
@@ -0,0 +1,4 @@
1
+ import { F_Collection_Registry } from "../F_Collection_Registry.js";
2
+ export declare function generate_client_library<Collections>(path: string, collection_registry: F_Collection_Registry<Collections>, service_name?: string): Promise<void>;
3
+ export declare function get_type_name(collection_id: string, suffix?: string): string;
4
+ export declare function uppercase(str: string): string;
@@ -0,0 +1,158 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { type_from_zod } from "./utils/type_from_zod.js";
3
+ import mustache from 'mustache';
4
+ import { existsSync } from "node:fs";
5
+ export async function generate_client_library(path, collection_registry, service_name = 'default-service') {
6
+ let api_builder = {
7
+ mustache_context: {},
8
+ children: {}
9
+ };
10
+ for (let col of Object.values(collection_registry.collections)) {
11
+ let collection = col;
12
+ let mustache_context = {
13
+ collection_id: collection.collection_id,
14
+ type_return: `${get_type_name(collection.collection_id)}`,
15
+ path_type_return: `types/${get_type_name(collection.collection_id)}`,
16
+ type_query: `${get_type_name(collection.collection_id)}_query`,
17
+ path_type_query: `types/${get_type_name(collection.collection_id)}_query`,
18
+ type_put: `${get_type_name(collection.collection_id)}_put`,
19
+ path_type_put: `types/${get_type_name(collection.collection_id)}_put`,
20
+ type_post: `${get_type_name(collection.collection_id)}_post`,
21
+ path_type_post: `types/${get_type_name(collection.collection_id)}_post`,
22
+ };
23
+ let collection_type_definition_builder = [];
24
+ let collection_type_main = type_from_zod(collection.validator, 0);
25
+ collection_type_definition_builder.push(`export type ${mustache_context.type_return} = ${collection_type_main[0]}`, ...collection_type_main.slice(1));
26
+ let collection_query_type_definition_builder = [];
27
+ let collection_type_query = type_from_zod(collection.query_validator_client, 0);
28
+ collection_query_type_definition_builder.push(`export type ${mustache_context.type_query} = ${collection_type_query[0]}`, ...collection_type_query.slice(1));
29
+ let collection_put_type_definition_builder = [];
30
+ let collection_type_put = type_from_zod(collection.put_validator, 0);
31
+ collection_put_type_definition_builder.push(`export type ${mustache_context.type_put} = ${collection_type_put[0]}`, ...collection_type_put.slice(1));
32
+ let collection_post_type_definition_builder = [];
33
+ let collection_type_post = type_from_zod(collection.post_validator, 0);
34
+ collection_post_type_definition_builder.push(`export type ${mustache_context.type_post} = ${collection_type_post[0]}`, ...collection_type_post.slice(1));
35
+ if (!existsSync([path, 'src'].join('/'))) {
36
+ await mkdir([path, 'src'].join('/'));
37
+ }
38
+ if (!existsSync([path, 'dist'].join('/'))) {
39
+ await mkdir([path, 'dist'].join('/'));
40
+ }
41
+ if (!existsSync([path, 'src', 'types'].join('/'))) {
42
+ await mkdir([path, 'src', 'types'].join('/'));
43
+ }
44
+ if (!existsSync([path, 'src', 'utils'].join('/'))) {
45
+ await mkdir([path, 'src', 'utils'].join('/'));
46
+ }
47
+ await writeFile([path, 'src', 'utils', 'utils.ts'].join('/'), await readFile(import.meta.resolve('./templates/utils.ts.mustache').slice(8), { encoding: 'utf-8' }));
48
+ await writeFile([path, 'tsconfig.json'].join('/'), await readFile(import.meta.resolve('./templates/tsconfig.json.mustache').slice(8), { encoding: 'utf-8' }));
49
+ await writeFile([path, '.gitignore'].join('/'), await readFile(import.meta.resolve('./templates/.gitignore.mustache').slice(8), { encoding: 'utf-8' }));
50
+ await writeFile([path, 'src', mustache_context.path_type_return + '.ts'].join('/'), collection_type_definition_builder.join('\n'));
51
+ await writeFile([path, 'src', mustache_context.path_type_query + '.ts'].join('/'), collection_query_type_definition_builder.join('\n'));
52
+ await writeFile([path, 'src', mustache_context.path_type_put + '.ts'].join('/'), collection_put_type_definition_builder.join('\n'));
53
+ await writeFile([path, 'src', mustache_context.path_type_post + '.ts'].join('/'), collection_post_type_definition_builder.join('\n'));
54
+ for (let access_layer of collection.access_layers) {
55
+ let builder = get_builder(api_builder, access_layer.layers, collection, mustache_context);
56
+ }
57
+ }
58
+ let mustache_main = await readFile(import.meta.resolve('./templates/main.mustache').slice(8), { encoding: 'utf-8' });
59
+ let mustache_types = await readFile(import.meta.resolve('./templates/types.mustache').slice(8), { encoding: 'utf-8' });
60
+ let mustache_collection = await readFile(import.meta.resolve('./templates/collection.mustache').slice(8), { encoding: 'utf-8' });
61
+ let mustache_package = await readFile(import.meta.resolve('./templates/package.json.mustache').slice(8), { encoding: 'utf-8' });
62
+ let builder_leaves = [];
63
+ let queue = [api_builder];
64
+ while (queue.length > 0) {
65
+ let builder = queue.shift();
66
+ let children = Object.values(builder.children);
67
+ if (children.length > 0) {
68
+ queue.push(...children);
69
+ }
70
+ else {
71
+ builder_leaves.push(builder);
72
+ }
73
+ builder.mustache_context.child_collection_id_types = `"${children.map(ele => ele.mustache_context.collection_id).join('" | "')}"`;
74
+ builder.mustache_context.child_collections = children.map(ele => {
75
+ return {
76
+ collection_id: ele.mustache_context.collection_id,
77
+ built_collection: uppercase(ele.mustache_context.collection_id),
78
+ built_collection_path: `./${uppercase(ele.mustache_context.collection_id)}.js`
79
+ };
80
+ });
81
+ }
82
+ let original_escape = mustache.escape;
83
+ mustache.escape = (text) => text;
84
+ let rendered_index = mustache.render(mustache_main, api_builder.mustache_context);
85
+ let rendered_collection_manipulators = [];
86
+ queue = Object.values(api_builder.children);
87
+ let added = new Set(Object.values(api_builder.children));
88
+ while (queue.length > 0) {
89
+ let builder = queue.shift();
90
+ builder.mustache_context.my_built_collection = uppercase(builder.mustache_context.collection_id);
91
+ builder.mustache_context.my_built_collection_path = `./${uppercase(builder.mustache_context.collection_id)}`;
92
+ builder.mustache_context.types = mustache.render(mustache_types, builder.mustache_context);
93
+ builder.mustache_context.has_subcollections = builder.mustache_context.child_collections.length > 0;
94
+ rendered_collection_manipulators.push({ builder: builder, text: mustache.render(mustache_collection, builder.mustache_context) });
95
+ queue.push(...Object.values(builder.children).filter(ele => !added.has(ele)));
96
+ for (let child of Object.values(builder.children)) {
97
+ added.add(child);
98
+ }
99
+ }
100
+ let rendered_package_json = mustache.render(mustache_package, {
101
+ server_name: service_name
102
+ });
103
+ mustache.escape = original_escape;
104
+ await writeFile([path, 'src', './index.ts'].join('/'), rendered_index);
105
+ for (let manipulator of rendered_collection_manipulators) {
106
+ await writeFile([path, 'src', manipulator.builder.mustache_context.my_built_collection_path + '.ts'].join('/'), manipulator.text);
107
+ }
108
+ await writeFile([path, './package.json'].join('/'), rendered_package_json);
109
+ }
110
+ export function get_type_name(collection_id, suffix) {
111
+ return suffix ? `${collection_id}_${suffix}`.replace(/[^(a-zA-Z0-9\_)]/g, '_') : collection_id.replace(/[^(a-zA-Z0-9\_)]/g, '_');
112
+ }
113
+ export function uppercase(str) {
114
+ let upper_on = true;
115
+ let joinable = [];
116
+ for (let char of str) {
117
+ if (char === '_') {
118
+ upper_on = true;
119
+ joinable.push(char);
120
+ continue;
121
+ }
122
+ if (upper_on) {
123
+ upper_on = false;
124
+ joinable.push(char.toUpperCase());
125
+ }
126
+ else {
127
+ joinable.push(char);
128
+ }
129
+ }
130
+ return joinable.join('');
131
+ }
132
+ function get_builder(root, parent_collection_ids, collection, mustache_context) {
133
+ let builder = root;
134
+ let collection_ids = parent_collection_ids.slice();
135
+ while (collection_ids.length > 0) {
136
+ let collection_id = collection_ids.shift();
137
+ if (!builder.children[collection_id]) {
138
+ builder.children[collection_id] = {
139
+ children: {},
140
+ parent: builder,
141
+ };
142
+ }
143
+ builder = builder.children[collection_id];
144
+ }
145
+ if (!builder.children[collection.collection_id]) {
146
+ builder.children[collection.collection_id] = {
147
+ children: {},
148
+ parent: builder,
149
+ };
150
+ }
151
+ builder = builder.children[collection.collection_id];
152
+ if (!builder.collection) {
153
+ builder.collection = collection;
154
+ builder.mustache_context = mustache_context;
155
+ }
156
+ return builder;
157
+ }
158
+ //# sourceMappingURL=generate_client_library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate_client_library.js","sourceRoot":"","sources":["../../src/code_generation/generate_client_library.ts"],"names":[],"mappings":"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"}