glasswork 0.1.0 → 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 (128) hide show
  1. package/README.md +22 -43
  2. package/dist/config/config-service.d.ts +101 -0
  3. package/dist/config/config-service.d.ts.map +1 -0
  4. package/dist/config/config-service.js +164 -0
  5. package/dist/config/config-service.js.map +1 -0
  6. package/dist/config/helpers.d.ts +101 -0
  7. package/dist/config/helpers.d.ts.map +1 -0
  8. package/dist/config/helpers.js +122 -0
  9. package/dist/config/helpers.js.map +1 -0
  10. package/dist/config/index.d.ts +39 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +41 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/config/providers.d.ts +163 -0
  15. package/dist/config/providers.d.ts.map +1 -0
  16. package/dist/config/providers.js +188 -0
  17. package/dist/config/providers.js.map +1 -0
  18. package/dist/config/types.d.ts +98 -0
  19. package/dist/config/types.d.ts.map +1 -0
  20. package/dist/config/types.js +7 -0
  21. package/dist/config/types.js.map +1 -0
  22. package/dist/core/bootstrap.js +9 -3
  23. package/dist/core/bootstrap.js.map +1 -1
  24. package/dist/core/types.d.ts +2 -1
  25. package/dist/core/types.d.ts.map +1 -1
  26. package/dist/http/error-response.dto.d.ts +76 -0
  27. package/dist/http/error-response.dto.d.ts.map +1 -0
  28. package/dist/http/error-response.dto.js +67 -0
  29. package/dist/http/error-response.dto.js.map +1 -0
  30. package/dist/http/errors.d.ts +39 -0
  31. package/dist/http/errors.d.ts.map +1 -1
  32. package/dist/http/errors.js +78 -0
  33. package/dist/http/errors.js.map +1 -1
  34. package/dist/http/route-helpers.d.ts +13 -6
  35. package/dist/http/route-helpers.d.ts.map +1 -1
  36. package/dist/http/route-helpers.js +29 -1
  37. package/dist/http/route-helpers.js.map +1 -1
  38. package/dist/index.d.ts +6 -3
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +10 -5
  41. package/dist/index.js.map +1 -1
  42. package/dist/middleware/rate-limit.d.ts.map +1 -1
  43. package/dist/middleware/rate-limit.js +2 -16
  44. package/dist/middleware/rate-limit.js.map +1 -1
  45. package/dist/openapi/defaults.d.ts.map +1 -1
  46. package/dist/openapi/defaults.js +6 -38
  47. package/dist/openapi/defaults.js.map +1 -1
  48. package/dist/openapi/openapi.d.ts +1 -1
  49. package/dist/openapi/openapi.d.ts.map +1 -1
  50. package/dist/openapi/openapi.js +21 -3
  51. package/dist/openapi/openapi.js.map +1 -1
  52. package/package.json +25 -2
  53. package/dist/bootstrap.d.ts +0 -55
  54. package/dist/bootstrap.d.ts.map +0 -1
  55. package/dist/bootstrap.js +0 -359
  56. package/dist/bootstrap.js.map +0 -1
  57. package/dist/environment.d.ts +0 -21
  58. package/dist/environment.d.ts.map +0 -1
  59. package/dist/environment.js +0 -29
  60. package/dist/environment.js.map +0 -1
  61. package/dist/error-handler.d.ts +0 -33
  62. package/dist/error-handler.d.ts.map +0 -1
  63. package/dist/error-handler.js +0 -53
  64. package/dist/error-handler.js.map +0 -1
  65. package/dist/errors.d.ts +0 -36
  66. package/dist/errors.d.ts.map +0 -1
  67. package/dist/errors.js +0 -65
  68. package/dist/errors.js.map +0 -1
  69. package/dist/get-client-ip.d.ts +0 -24
  70. package/dist/get-client-ip.d.ts.map +0 -1
  71. package/dist/get-client-ip.js +0 -49
  72. package/dist/get-client-ip.js.map +0 -1
  73. package/dist/logger.d.ts +0 -37
  74. package/dist/logger.d.ts.map +0 -1
  75. package/dist/logger.js +0 -52
  76. package/dist/logger.js.map +0 -1
  77. package/dist/module.d.ts +0 -21
  78. package/dist/module.d.ts.map +0 -1
  79. package/dist/module.js +0 -85
  80. package/dist/module.js.map +0 -1
  81. package/dist/omit.d.ts +0 -20
  82. package/dist/omit.d.ts.map +0 -1
  83. package/dist/omit.js +0 -28
  84. package/dist/omit.js.map +0 -1
  85. package/dist/openapi-defaults.d.ts +0 -11
  86. package/dist/openapi-defaults.d.ts.map +0 -1
  87. package/dist/openapi-defaults.js +0 -127
  88. package/dist/openapi-defaults.js.map +0 -1
  89. package/dist/openapi-hooks.d.ts +0 -14
  90. package/dist/openapi-hooks.d.ts.map +0 -1
  91. package/dist/openapi-hooks.js +0 -80
  92. package/dist/openapi-hooks.js.map +0 -1
  93. package/dist/openapi.d.ts +0 -24
  94. package/dist/openapi.d.ts.map +0 -1
  95. package/dist/openapi.js +0 -106
  96. package/dist/openapi.js.map +0 -1
  97. package/dist/pagination.d.ts +0 -48
  98. package/dist/pagination.d.ts.map +0 -1
  99. package/dist/pagination.js +0 -43
  100. package/dist/pagination.js.map +0 -1
  101. package/dist/pick.d.ts +0 -20
  102. package/dist/pick.d.ts.map +0 -1
  103. package/dist/pick.js +0 -28
  104. package/dist/pick.js.map +0 -1
  105. package/dist/rate-limit.d.ts +0 -7
  106. package/dist/rate-limit.d.ts.map +0 -1
  107. package/dist/rate-limit.js +0 -180
  108. package/dist/rate-limit.js.map +0 -1
  109. package/dist/route-helpers.d.ts +0 -172
  110. package/dist/route-helpers.d.ts.map +0 -1
  111. package/dist/route-helpers.js +0 -249
  112. package/dist/route-helpers.js.map +0 -1
  113. package/dist/serialize-dates.d.ts +0 -27
  114. package/dist/serialize-dates.d.ts.map +0 -1
  115. package/dist/serialize-dates.js +0 -39
  116. package/dist/serialize-dates.js.map +0 -1
  117. package/dist/testing.d.ts +0 -87
  118. package/dist/testing.d.ts.map +0 -1
  119. package/dist/testing.js +0 -94
  120. package/dist/testing.js.map +0 -1
  121. package/dist/types.d.ts +0 -273
  122. package/dist/types.d.ts.map +0 -1
  123. package/dist/types.js +0 -2
  124. package/dist/types.js.map +0 -1
  125. package/dist/utils.d.ts +0 -9
  126. package/dist/utils.d.ts.map +0 -1
  127. package/dist/utils.js +0 -31
  128. package/dist/utils.js.map +0 -1
@@ -1,3 +1,5 @@
1
+ import { toJsonSchema } from '@valibot/to-json-schema';
2
+ import { ErrorResponseDto, ValidationErrorResponseDto, ValidationIssueDto, } from '../http/error-response.dto.js';
1
3
  /**
2
4
  * Default OpenAPI components provided by Glasswork.
3
5
  * These include headers for features implemented by the framework:
@@ -8,44 +10,10 @@
8
10
  */
9
11
  export const defaultOpenAPIComponents = {
10
12
  schemas: {
11
- // Error response schemas
12
- ErrorResponse: {
13
- type: 'object',
14
- required: ['error'],
15
- properties: {
16
- error: {
17
- type: 'string',
18
- maxLength: 1000,
19
- pattern: '^[\\s\\S]*$', // Any characters including whitespace
20
- description: 'Error message',
21
- },
22
- issues: {
23
- type: 'array',
24
- maxItems: 100,
25
- items: {
26
- type: 'object',
27
- required: ['message'],
28
- properties: {
29
- message: {
30
- type: 'string',
31
- maxLength: 500,
32
- },
33
- path: {
34
- type: 'array',
35
- maxItems: 20,
36
- items: {
37
- oneOf: [
38
- { type: 'string', maxLength: 200 },
39
- { type: 'number', format: 'int32' },
40
- ],
41
- },
42
- },
43
- },
44
- },
45
- description: 'Validation error details',
46
- },
47
- },
48
- },
13
+ // Error response schemas - converted from Valibot DTOs
14
+ ErrorResponse: toJsonSchema(ErrorResponseDto),
15
+ ValidationErrorResponse: toJsonSchema(ValidationErrorResponseDto),
16
+ ValidationIssue: toJsonSchema(ValidationIssueDto),
49
17
  },
50
18
  headers: {
51
19
  // CORS headers
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/openapi/defaults.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/openapi/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EACL,gBAAgB,EAChB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA+B;IAClE,OAAO,EAAE;QACP,uDAAuD;QACvD,aAAa,EAAE,YAAY,CAAC,gBAAgB,CAA2B;QACvE,uBAAuB,EAAE,YAAY,CAAC,0BAA0B,CAA2B;QAC3F,eAAe,EAAE,YAAY,CAAC,kBAAkB,CAA2B;KAC5E;IACD,OAAO,EAAE;QACP,eAAe;QACf,6BAA6B,EAAE;YAC7B,WAAW,EAAE,kCAAkC;YAC/C,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,qCAAqC;aAC/C;SACF;QAED,6CAA6C;QAC7C,iBAAiB,EAAE;YACjB,WAAW,EAAE,mDAAmD;YAChE,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,KAAK;aACf;SACF;QACD,qBAAqB,EAAE;YACrB,WAAW,EAAE,0CAA0C;YACvD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,KAAK;aACf;SACF;QACD,iBAAiB,EAAE;YACjB,WAAW,EAAE,4CAA4C;YACzD,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,IAAI;aACd;SACF;QACD,aAAa,EAAE;YACb,WAAW,EAAE,4DAA4D;YACzE,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,IAAI;aACd;SACF;QAED,0CAA0C;QAC1C,eAAe,EAAE;YACf,WAAW,EAAE,iCAAiC;YAC9C,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,UAAU,EAAE,YAAY;aAClC;SACF;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,qBAAqB;YAClC,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,UAAU,EAAE,YAAY;aAClC;SACF;QACD,SAAS,EAAE;YACT,WAAW,EAAE,0BAA0B;YACvC,MAAM,EAAE;gBACN,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,GAAG;aACb;SACF;KACF;CACF,CAAC"}
@@ -12,7 +12,7 @@ export interface ConfigureOpenAPIOptions {
12
12
  *
13
13
  * Behavior by environment:
14
14
  * - development: Serve specs and UI at /api and /api/openapi.json
15
- * - production: Write spec to disk (openapi.json), no serving
15
+ * - production: No serving by default
16
16
  * - test: Disabled by default
17
17
  *
18
18
  * This function automatically sets up response hooks based on enabled features
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAW1B,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,IAAI,CAAC;IACV,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAkEvE"}
1
+ {"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAW1B,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,IAAI,CAAC;IACV,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CA2EvE"}
@@ -1,7 +1,7 @@
1
1
  import { writeFile } from 'node:fs/promises';
2
2
  import { swaggerUI } from '@hono/swagger-ui';
3
3
  import { openAPISpecs } from 'hono-openapi';
4
- import { setGlobalResponseHooks } from '../http/route-helpers.js';
4
+ import { setGlobalResponseHooks, setGlobalSecuritySchemes } from '../http/route-helpers.js';
5
5
  import { deepMerge } from '../utils/deep-merge.js';
6
6
  import { createLogger } from '../utils/logger.js';
7
7
  import { defaultOpenAPIComponents } from './defaults.js';
@@ -11,7 +11,7 @@ import { createCorsHeadersHook, createPaginationHeadersHook, createRateLimitHead
11
11
  *
12
12
  * Behavior by environment:
13
13
  * - development: Serve specs and UI at /api and /api/openapi.json
14
- * - production: Write spec to disk (openapi.json), no serving
14
+ * - production: No serving by default
15
15
  * - test: Disabled by default
16
16
  *
17
17
  * This function automatically sets up response hooks based on enabled features
@@ -45,6 +45,13 @@ export function configureOpenAPI(options) {
45
45
  });
46
46
  // Merge application documentation with filtered Glasswork defaults
47
47
  const mergedDocumentation = deepMerge({ components: filteredComponents }, openapi.documentation || {});
48
+ // Extract security scheme names from the merged documentation and make them available globally
49
+ // This allows route definitions to reference the actual security schemes defined in the app
50
+ const securitySchemes = extractSecuritySchemeNames(mergedDocumentation);
51
+ setGlobalSecuritySchemes(securitySchemes);
52
+ if (securitySchemes.length > 0) {
53
+ logger.info(`Security schemes: ${securitySchemes.join(', ')}`);
54
+ }
48
55
  // Serve OpenAPI spec endpoint (development only by default)
49
56
  if (shouldServeSpecs) {
50
57
  app.get('/api/openapi.json', openAPISpecs(app, { documentation: mergedDocumentation }));
@@ -53,7 +60,7 @@ export function configureOpenAPI(options) {
53
60
  if (shouldServeUI) {
54
61
  app.get('/api', swaggerUI({ url: '/api/openapi.json' }));
55
62
  }
56
- // Write OpenAPI spec to file (production/Lambda)
63
+ // Write OpenAPI spec to file (optional)
57
64
  if (openapi.writeToFile) {
58
65
  const filePath = openapi.writeToFile;
59
66
  // Generate spec and write to file
@@ -72,6 +79,17 @@ export function configureOpenAPI(options) {
72
79
  }, 1000); // Wait for routes to be registered
73
80
  }
74
81
  }
82
+ /**
83
+ * Extract security scheme names from OpenAPI documentation.
84
+ * Returns an array of scheme names that can be used in route security definitions.
85
+ */
86
+ function extractSecuritySchemeNames(documentation) {
87
+ const securitySchemes = documentation.components?.securitySchemes;
88
+ if (!securitySchemes || typeof securitySchemes !== 'object') {
89
+ return [];
90
+ }
91
+ return Object.keys(securitySchemes);
92
+ }
75
93
  /**
76
94
  * Filter component headers based on enabled features.
77
95
  * This removes header definitions from the components schema that won't be used.
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/openapi/openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ5C,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EACL,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAUpB;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgC;IAC/D,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAErE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAEvD,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,KAAK,aAAa,CAAC;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,KAAK,aAAa,CAAC;IAEvE,iDAAiD;IACjD,MAAM,cAAc,GAAG;QACrB,qBAAqB,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC;QACzC,0BAA0B,CAAC,SAAS,EAAE,OAAO,IAAI,KAAK,CAAC;QACvD,2BAA2B,EAAE;KAC9B,CAAC;IAEF,wCAAwC;IACxC,MAAM,QAAQ,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;IAEvE,qDAAqD;IACrD,4DAA4D;IAC5D,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAEjC,4FAA4F;IAC5F,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,wBAAwB,EAAE;QAC9E,gBAAgB,EAAE,SAAS,EAAE,OAAO,IAAI,KAAK;QAC7C,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI;KAChC,CAAC,CAAC;IAEH,mEAAmE;IACnE,MAAM,mBAAmB,GAAG,SAAS,CACnC,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAClC,OAAO,CAAC,aAAa,IAAI,EAAE,CAC5B,CAAC;IAEF,+FAA+F;IAC/F,4FAA4F;IAC5F,MAAM,eAAe,GAAG,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;IACxE,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAE1C,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,qBAAqB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,4DAA4D;IAC5D,IAAI,gBAAgB,EAAE,CAAC;QACrB,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,YAAY,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,iDAAiD;IACjD,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,wCAAwC;IACxC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;QACrC,kCAAkC;QAClC,2CAA2C;QAC3C,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC;gBACH,6DAA6D;gBAC7D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBACxD,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAE1C,MAAM,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,mCAAmC;IAC/C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,0BAA0B,CAAC,aAA0C;IAC5E,MAAM,eAAe,GAAG,aAAa,CAAC,UAAU,EAAE,eAAe,CAAC;IAElE,IAAI,CAAC,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,0BAA0B,CACjC,UAAsC,EACtC,QAA6D;IAE7D,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CACxC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAC3F,CAAC;IAEF,OAAO;QACL,GAAG,UAAU;QACb,OAAO,EAAE,eAAe;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAC1B,UAAkB,EAClB,EAAE,gBAAgB,EAAE,WAAW,EAAuD;IAEtF,gFAAgF;IAChF,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAC/C,IAAI,UAAU,KAAK,6BAA6B,EAAE,CAAC;QACjD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,8DAA8D;IAC9D,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;QACxE,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,mCAAmC;IACnC,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "glasswork",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "type": "module",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
12
+ "default": "./dist/index.js"
12
13
  },
13
14
  "./package.json": "./package.json"
14
15
  },
@@ -49,6 +50,7 @@
49
50
  "dev": "tsc --watch",
50
51
  "test": "vitest",
51
52
  "test:coverage": "vitest --coverage",
53
+ "lint": "biome check . --write",
52
54
  "prepublishOnly": "npm run build && npm test"
53
55
  },
54
56
  "publishConfig": {
@@ -56,17 +58,38 @@
56
58
  },
57
59
  "peerDependencies": {
58
60
  "@aws-sdk/client-dynamodb": "^3.902.0",
61
+ "@aws-sdk/client-ssm": "^3.902.0",
59
62
  "@aws-sdk/lib-dynamodb": "^3.902.0",
60
63
  "@hono/swagger-ui": "^0.5.0",
61
64
  "awilix": "^12.0.0",
65
+ "dotenv": "^16.0.0",
62
66
  "hono": "^4.9.0",
63
67
  "hono-openapi": "^0.4.0",
64
68
  "valibot": "^1.0.0"
65
69
  },
70
+ "peerDependenciesMeta": {
71
+ "@aws-sdk/client-dynamodb": {
72
+ "optional": true
73
+ },
74
+ "@aws-sdk/client-ssm": {
75
+ "optional": true
76
+ },
77
+ "@aws-sdk/lib-dynamodb": {
78
+ "optional": true
79
+ },
80
+ "@hono/swagger-ui": {
81
+ "optional": true
82
+ },
83
+ "dotenv": {
84
+ "optional": true
85
+ }
86
+ },
66
87
  "devDependencies": {
88
+ "@aws-sdk/client-ssm": "^3.901.0",
67
89
  "@biomejs/biome": "^2.2.5",
68
90
  "@types/node": "^22.18.8",
69
91
  "@vitest/coverage-v8": "^3.2.4",
92
+ "dotenv": "^17.2.3",
70
93
  "typescript": "^5.9.3",
71
94
  "vitest": "^3.2.4"
72
95
  },
@@ -1,55 +0,0 @@
1
- import type { AwilixContainer } from 'awilix';
2
- import type { BootstrapOptions, BootstrapResult, ModuleConfig } from './types.js';
3
- /**
4
- * Bootstrap the application with modules.
5
- *
6
- * This function:
7
- * 1. Creates an Awilix container (PROXY mode for Lambda compatibility)
8
- * 2. Registers all module providers
9
- * 3. Creates a Hono app
10
- * 4. Applies rate limiting middleware (if configured)
11
- * 5. Configures OpenAPI (environment-aware)
12
- * 6. Mounts module routes
13
- * 7. Returns both app and container (container remains accessible!)
14
- *
15
- * Features:
16
- * - Automatic environment detection (development/production/test)
17
- * - OpenAPI generation and serving (environment-aware)
18
- * - Rate limiting with pluggable storage (memory/DynamoDB)
19
- * - Module system with dependency injection
20
- *
21
- * @example
22
- * ```typescript
23
- * const { app, container } = bootstrap(AppModule, {
24
- * openapi: {
25
- * enabled: true,
26
- * documentation: { ... }
27
- * },
28
- * rateLimit: {
29
- * enabled: true,
30
- * storage: 'memory'
31
- * }
32
- * });
33
- *
34
- * // Container is still accessible for advanced use
35
- * console.log(container.cradle.authService);
36
- * container.register({ customService: asClass(CustomService) });
37
- * ```
38
- */
39
- export declare function bootstrap(rootModule: ModuleConfig, options?: BootstrapOptions): BootstrapResult;
40
- /**
41
- * Collect all modules (flatten imports recursively)
42
- * @internal - exported for testing utilities
43
- */
44
- export declare function collectModules(rootModule: ModuleConfig): ModuleConfig[];
45
- /**
46
- * Validate no circular dependencies between modules
47
- * @internal - exported for testing utilities
48
- */
49
- export declare function validateNoCycles(modules: ModuleConfig[]): void;
50
- /**
51
- * Register module providers with Awilix container
52
- * @internal - exported for testing utilities
53
- */
54
- export declare function registerModuleProviders(module: ModuleConfig, container: AwilixContainer, debug?: boolean): void;
55
- //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAY9C,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAKf,YAAY,EAKb,MAAM,YAAY,CAAC;AAwBpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,SAAS,CACvB,UAAU,EAAE,YAAY,EACxB,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CAgEjB;AAsKD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,GAAG,YAAY,EAAE,CAuBvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI,CA2C9D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,eAAe,EAC1B,KAAK,UAAQ,GACZ,IAAI,CAQN"}
package/dist/bootstrap.js DELETED
@@ -1,359 +0,0 @@
1
- import { asClass, asValue, createContainer, InjectionMode } from 'awilix';
2
- import { Hono } from 'hono';
3
- import { cors } from 'hono/cors';
4
- import { logger as honoLogger } from 'hono/logger';
5
- import { requestId } from 'hono/request-id';
6
- import { secureHeaders } from 'hono/secure-headers';
7
- import { isLambda } from './environment.js';
8
- import { defaultErrorHandler } from './error-handler.js';
9
- import { createPlainLogger } from './logger.js';
10
- import { configureOpenAPI } from './openapi.js';
11
- import { createRateLimitMiddleware } from './rate-limit.js';
12
- /**
13
- * Detect environment from NODE_ENV or AWS Lambda context
14
- */
15
- function detectEnvironment() {
16
- const nodeEnv = process.env.NODE_ENV;
17
- if (nodeEnv === 'production') {
18
- return 'production';
19
- }
20
- if (nodeEnv === 'test') {
21
- return 'test';
22
- }
23
- // Check if running in AWS Lambda
24
- if (process.env.AWS_LAMBDA_FUNCTION_NAME || process.env.LAMBDA_TASK_ROOT) {
25
- return 'production';
26
- }
27
- return 'development';
28
- }
29
- /**
30
- * Bootstrap the application with modules.
31
- *
32
- * This function:
33
- * 1. Creates an Awilix container (PROXY mode for Lambda compatibility)
34
- * 2. Registers all module providers
35
- * 3. Creates a Hono app
36
- * 4. Applies rate limiting middleware (if configured)
37
- * 5. Configures OpenAPI (environment-aware)
38
- * 6. Mounts module routes
39
- * 7. Returns both app and container (container remains accessible!)
40
- *
41
- * Features:
42
- * - Automatic environment detection (development/production/test)
43
- * - OpenAPI generation and serving (environment-aware)
44
- * - Rate limiting with pluggable storage (memory/DynamoDB)
45
- * - Module system with dependency injection
46
- *
47
- * @example
48
- * ```typescript
49
- * const { app, container } = bootstrap(AppModule, {
50
- * openapi: {
51
- * enabled: true,
52
- * documentation: { ... }
53
- * },
54
- * rateLimit: {
55
- * enabled: true,
56
- * storage: 'memory'
57
- * }
58
- * });
59
- *
60
- * // Container is still accessible for advanced use
61
- * console.log(container.cradle.authService);
62
- * container.register({ customService: asClass(CustomService) });
63
- * ```
64
- */
65
- export function bootstrap(rootModule, options = {}) {
66
- const { apiBasePath = '/api', debug = false, environment = detectEnvironment(), errorHandler = defaultErrorHandler, openapi, rateLimit, middleware, logger, } = options;
67
- // Create Awilix container with PROXY mode (Lambda-compatible)
68
- const container = createContainer({
69
- injectionMode: InjectionMode.PROXY,
70
- strict: true,
71
- });
72
- if (debug) {
73
- console.log('[Glasswork] Bootstrapping application...');
74
- }
75
- // Collect all modules (flatten imports)
76
- const allModules = collectModules(rootModule);
77
- if (debug) {
78
- console.log(`[Glasswork] Found ${allModules.length} modules:`, allModules.map((m) => m.name).join(', '));
79
- }
80
- // Validate no circular dependencies
81
- validateNoCycles(allModules);
82
- // Register all providers
83
- for (const module of allModules) {
84
- if (debug) {
85
- console.log(`[Glasswork] Registering module: ${module.name}`);
86
- }
87
- registerModuleProviders(module, container, debug);
88
- }
89
- // Create Hono app and apply middleware
90
- const app = createApp({
91
- environment,
92
- errorHandler,
93
- openapi,
94
- rateLimit,
95
- middleware,
96
- logger,
97
- debug,
98
- });
99
- // Mount module routes
100
- mountModuleRoutes({ app, modules: allModules, container, apiBasePath, debug });
101
- if (debug) {
102
- console.log('[Glasswork] Bootstrap complete');
103
- console.log(`[Glasswork] Environment: ${environment}`);
104
- console.log(`[Glasswork] Registered ${Object.keys(container.cradle).length} services`);
105
- }
106
- return { app, container };
107
- }
108
- /**
109
- * Create Hono app and apply middleware
110
- */
111
- function createApp(options) {
112
- const app = new Hono();
113
- applyErrorHandler(app, options);
114
- applySecurityMiddleware(app, options);
115
- applyLoggingMiddleware(app, options);
116
- applyRateLimiting(app, options);
117
- applyOpenAPIDocumentation(app, options);
118
- return app;
119
- }
120
- /**
121
- * Apply error handler to the app
122
- */
123
- function applyErrorHandler(app, { errorHandler, debug }) {
124
- if (errorHandler === false)
125
- return;
126
- if (debug) {
127
- console.log('[Glasswork] Applying error handler');
128
- }
129
- app.onError(errorHandler);
130
- }
131
- /**
132
- * Apply security-related middleware (secure headers, request ID, CORS)
133
- */
134
- function applySecurityMiddleware(app, { environment, middleware, debug, }) {
135
- // Secure headers (default: true in production)
136
- if (middleware?.secureHeaders !== false && environment === 'production') {
137
- if (debug) {
138
- console.log('[Glasswork] Applying secure headers');
139
- }
140
- app.use(secureHeaders());
141
- }
142
- // Request ID (default: true)
143
- if (middleware?.requestId !== false) {
144
- if (debug) {
145
- console.log('[Glasswork] Applying request ID middleware');
146
- }
147
- app.use(requestId());
148
- }
149
- // CORS
150
- if (middleware?.cors) {
151
- if (debug) {
152
- console.log('[Glasswork] Applying CORS middleware');
153
- }
154
- app.use(cors(middleware.cors));
155
- }
156
- }
157
- /**
158
- * Apply logging middleware
159
- */
160
- function applyLoggingMiddleware(app, { logger, debug }) {
161
- if (logger?.enabled === false)
162
- return;
163
- // Auto-detect plain mode based on environment if not specified
164
- const usePlainLogger = logger?.plain ?? isLambda();
165
- if (debug) {
166
- console.log(`[Glasswork] Applying logger (plain: ${usePlainLogger})`);
167
- }
168
- app.use(usePlainLogger ? createPlainLogger() : honoLogger());
169
- }
170
- /**
171
- * Apply rate limiting middleware
172
- */
173
- function applyRateLimiting(app, { rateLimit, debug }) {
174
- if (!rateLimit?.enabled)
175
- return;
176
- if (debug) {
177
- console.log(`[Glasswork] Rate limiting enabled (${rateLimit.storage} storage, ${rateLimit.maxRequests || 100} req/${rateLimit.windowMs || 60000}ms)`);
178
- }
179
- app.use(createRateLimitMiddleware(rateLimit));
180
- }
181
- /**
182
- * Apply OpenAPI documentation
183
- */
184
- function applyOpenAPIDocumentation(app, options) {
185
- const { environment, openapi, rateLimit, middleware, debug } = options;
186
- if (!openapi?.enabled)
187
- return;
188
- if (debug) {
189
- console.log('[Glasswork] Configuring OpenAPI');
190
- }
191
- configureOpenAPI({ app, environment, openapi, rateLimit, middleware });
192
- }
193
- /**
194
- * Mount module routes to the app
195
- */
196
- function mountModuleRoutes(options) {
197
- const { app, modules, container, apiBasePath, debug } = options;
198
- for (const module of modules) {
199
- if (!module.routes || !module.basePath) {
200
- continue;
201
- }
202
- if (debug) {
203
- console.log(`[Glasswork] Mounting routes: ${apiBasePath}/${module.basePath}`);
204
- }
205
- const router = new Hono();
206
- // Call route factory with router and services
207
- module.routes(router, container.cradle);
208
- // Mount at base path
209
- app.route(`${apiBasePath}/${module.basePath}`, router);
210
- }
211
- }
212
- /**
213
- * Collect all modules (flatten imports recursively)
214
- * @internal - exported for testing utilities
215
- */
216
- export function collectModules(rootModule) {
217
- const modules = new Map();
218
- const visited = new Set();
219
- function collect(module) {
220
- if (visited.has(module.name)) {
221
- return;
222
- }
223
- visited.add(module.name);
224
- modules.set(module.name, module);
225
- // Recursively collect imports
226
- if (module.imports) {
227
- for (const importedModule of module.imports) {
228
- collect(importedModule);
229
- }
230
- }
231
- }
232
- collect(rootModule);
233
- return Array.from(modules.values());
234
- }
235
- /**
236
- * Validate no circular dependencies between modules
237
- * @internal - exported for testing utilities
238
- */
239
- export function validateNoCycles(modules) {
240
- const graph = new Map();
241
- // Build dependency graph
242
- for (const module of modules) {
243
- if (!graph.has(module.name)) {
244
- graph.set(module.name, new Set());
245
- }
246
- if (module.imports) {
247
- for (const importedModule of module.imports) {
248
- graph.get(module.name)?.add(importedModule.name);
249
- }
250
- }
251
- }
252
- // Detect cycles using DFS
253
- const visiting = new Set();
254
- const visited = new Set();
255
- function visit(name, path) {
256
- if (visiting.has(name)) {
257
- throw new Error(`Circular dependency detected: ${[...path, name].join(' -> ')}`);
258
- }
259
- if (visited.has(name)) {
260
- return;
261
- }
262
- visiting.add(name);
263
- const dependencies = graph.get(name) || new Set();
264
- for (const dep of dependencies) {
265
- visit(dep, [...path, name]);
266
- }
267
- visiting.delete(name);
268
- visited.add(name);
269
- }
270
- for (const module of modules) {
271
- visit(module.name, []);
272
- }
273
- }
274
- /**
275
- * Register module providers with Awilix container
276
- * @internal - exported for testing utilities
277
- */
278
- export function registerModuleProviders(module, container, debug = false) {
279
- if (!module.providers) {
280
- return;
281
- }
282
- for (const provider of module.providers) {
283
- registerProvider(provider, container, module.name, debug);
284
- }
285
- }
286
- /**
287
- * Register a single provider with Awilix
288
- */
289
- function registerProvider(provider, container, moduleName, debug) {
290
- if (typeof provider === 'function') {
291
- registerClassProvider(provider, container, debug);
292
- return;
293
- }
294
- if ('useClass' in provider) {
295
- registerExplicitClassProvider(provider, container, debug);
296
- return;
297
- }
298
- if ('useValue' in provider) {
299
- registerValueProvider(provider, container, debug);
300
- return;
301
- }
302
- if ('useFactory' in provider) {
303
- registerFactoryProvider(provider, container, debug);
304
- return;
305
- }
306
- throw new Error(`Invalid provider configuration in module "${moduleName}"`);
307
- }
308
- function registerClassProvider(provider, container, debug) {
309
- const name = camelCase(provider.name);
310
- if (debug) {
311
- console.log(` - Registering ${name} (${provider.name})`);
312
- }
313
- container.register({
314
- [name]: asClass(provider).singleton(),
315
- });
316
- }
317
- function registerExplicitClassProvider(provider, container, debug) {
318
- const name = typeof provider.provide === 'string' ? provider.provide : camelCase(provider.provide.name);
319
- const scope = provider.scope || 'SINGLETON';
320
- if (debug) {
321
- console.log(` - Registering ${name} (scope: ${scope})`);
322
- }
323
- const registration = asClass(provider.useClass);
324
- container.register({
325
- [name]: applyScopeToRegistration(registration, scope),
326
- });
327
- }
328
- function registerValueProvider(provider, container, debug) {
329
- if (debug) {
330
- console.log(` - Registering ${provider.provide} (value)`);
331
- }
332
- container.register({
333
- [provider.provide]: asValue(provider.useValue),
334
- });
335
- }
336
- function registerFactoryProvider(provider, container, debug) {
337
- if (debug) {
338
- console.log(` - Registering ${provider.provide} (factory)`);
339
- }
340
- container.register({
341
- [provider.provide]: asValue(provider.useFactory(container)),
342
- });
343
- }
344
- function applyScopeToRegistration(registration, scope) {
345
- if (scope === 'SCOPED') {
346
- return registration.scoped();
347
- }
348
- if (scope === 'TRANSIENT') {
349
- return registration.transient();
350
- }
351
- return registration.singleton();
352
- }
353
- /**
354
- * Convert PascalCase to camelCase
355
- */
356
- function camelCase(str) {
357
- return str.charAt(0).toLowerCase() + str.slice(1);
358
- }
359
- //# sourceMappingURL=bootstrap.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}