@common-stack/rollup-vite-utils 8.0.2-alpha.0 → 8.2.1-alpha.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 (104) hide show
  1. package/LICENSE +34 -21
  2. package/lib/config-schema.cjs +104 -103
  3. package/lib/config-schema.cjs.map +1 -1
  4. package/lib/config-schema.js +104 -103
  5. package/lib/config-schema.js.map +1 -1
  6. package/lib/index.cjs +1 -1
  7. package/lib/index.js +1 -1
  8. package/lib/preStartup/configLoader/configLoader.cjs +135 -2
  9. package/lib/preStartup/configLoader/configLoader.cjs.map +1 -1
  10. package/lib/preStartup/configLoader/configLoader.js +135 -2
  11. package/lib/preStartup/configLoader/configLoader.js.map +1 -1
  12. package/lib/preStartup/configLoader/index.cjs +1 -1
  13. package/lib/preStartup/configLoader/index.cjs.map +1 -1
  14. package/lib/preStartup/configLoader/index.js +1 -1
  15. package/lib/preStartup/configLoader/index.js.map +1 -1
  16. package/lib/rollup/modifyLibFiles/extractGraphQLQueries.cjs +6 -2
  17. package/lib/rollup/modifyLibFiles/extractGraphQLQueries.cjs.map +1 -1
  18. package/lib/rollup/modifyLibFiles/extractGraphQLQueries.js +6 -2
  19. package/lib/rollup/modifyLibFiles/extractGraphQLQueries.js.map +1 -1
  20. package/lib/rollup/rollupPluginAddJsExtension.cjs +3 -13
  21. package/lib/rollup/rollupPluginAddJsExtension.cjs.map +1 -1
  22. package/lib/rollup/rollupPluginAddJsExtension.js +2 -12
  23. package/lib/rollup/rollupPluginAddJsExtension.js.map +1 -1
  24. package/lib/rollup/rollupPluginGenerateJson.cjs +27 -0
  25. package/lib/rollup/rollupPluginGenerateJson.cjs.map +1 -1
  26. package/lib/rollup/rollupPluginGenerateJson.d.ts +10 -0
  27. package/lib/rollup/rollupPluginGenerateJson.js +27 -0
  28. package/lib/rollup/rollupPluginGenerateJson.js.map +1 -1
  29. package/lib/rollup/rollupPluginGenerateJson.test.d.ts +1 -0
  30. package/lib/rollup/rollupPluginModifyLibFiles.cjs +102 -46
  31. package/lib/rollup/rollupPluginModifyLibFiles.cjs.map +1 -1
  32. package/lib/rollup/rollupPluginModifyLibFiles.js +102 -46
  33. package/lib/rollup/rollupPluginModifyLibFiles.js.map +1 -1
  34. package/lib/rollup/rollupPluginUpdateFromConfig.cjs +4 -7
  35. package/lib/rollup/rollupPluginUpdateFromConfig.cjs.map +1 -1
  36. package/lib/rollup/rollupPluginUpdateFromConfig.js +4 -7
  37. package/lib/rollup/rollupPluginUpdateFromConfig.js.map +1 -1
  38. package/lib/rollup/rollupPluginUpdateFromConfig.test.d.ts +1 -0
  39. package/lib/tools/codegen/generateCodegenConfig.cjs +30 -0
  40. package/lib/tools/codegen/generateCodegenConfig.cjs.map +1 -1
  41. package/lib/tools/codegen/generateCodegenConfig.js +30 -0
  42. package/lib/tools/codegen/generateCodegenConfig.js.map +1 -1
  43. package/lib/tools/codegen/index.cjs.map +1 -1
  44. package/lib/tools/codegen/index.js.map +1 -1
  45. package/lib/tools/codegen/performCopyOperations.cjs +103 -18
  46. package/lib/tools/codegen/performCopyOperations.cjs.map +1 -1
  47. package/lib/tools/codegen/performCopyOperations.js +103 -18
  48. package/lib/tools/codegen/performCopyOperations.js.map +1 -1
  49. package/lib/tools/codegen/readModules.cjs +80 -59
  50. package/lib/tools/codegen/readModules.cjs.map +1 -1
  51. package/lib/tools/codegen/readModules.d.ts +0 -18
  52. package/lib/tools/codegen/readModules.js +80 -59
  53. package/lib/tools/codegen/readModules.js.map +1 -1
  54. package/lib/tools/codegen/setupCommonPackage.cjs +14 -5
  55. package/lib/tools/codegen/setupCommonPackage.cjs.map +1 -1
  56. package/lib/tools/codegen/setupCommonPackage.d.ts +1 -1
  57. package/lib/tools/codegen/setupCommonPackage.js +14 -5
  58. package/lib/tools/codegen/setupCommonPackage.js.map +1 -1
  59. package/lib/tools/codegen/templates/common/package.json.template +11 -0
  60. package/lib/tools/codegen/templates/common/rollup.config.mjs.template +6 -1
  61. package/lib/tools/codegen/templates/common/scripts/fix-generated-types.js.template +58 -0
  62. package/lib/tools/codegen/templates/common/src/apollo-context.ts.bk.template +34 -0
  63. package/lib/tools/codegen/templates/common/src/apollo-context.ts.template +13 -20
  64. package/lib/tools/codegen/templates/common/src/client-context.ts.template +19 -0
  65. package/lib/tools/codegen/templates/common/src/core/disposable.ts.template +93 -0
  66. package/lib/tools/codegen/templates/common/src/core/event.test.ts +16 -0
  67. package/lib/tools/codegen/templates/common/src/core/event.ts.template +326 -0
  68. package/lib/tools/codegen/templates/common/src/core/index.ts.template +3 -0
  69. package/lib/tools/codegen/templates/common/src/core/types.ts.template +1 -0
  70. package/lib/tools/codegen/templates/common/src/generated/service-schemas.ts.template +1 -0
  71. package/lib/tools/codegen/templates/common/src/index.server.ts.template +7 -0
  72. package/lib/tools/codegen/templates/common/src/index.ts.template +1 -0
  73. package/lib/utils/index.d.ts +1 -0
  74. package/lib/utils/packageUtils.cjs +158 -0
  75. package/lib/utils/packageUtils.cjs.map +1 -0
  76. package/lib/utils/packageUtils.d.ts +74 -0
  77. package/lib/utils/packageUtils.js +158 -0
  78. package/lib/utils/packageUtils.js.map +1 -0
  79. package/lib/utils/packageUtils.test.d.ts +1 -0
  80. package/lib/utils/utils.cjs +1 -1
  81. package/lib/utils/utils.js +1 -1
  82. package/lib/vite-wrappers/generators/clientLoaderGenerator.cjs +11 -3
  83. package/lib/vite-wrappers/generators/clientLoaderGenerator.cjs.map +1 -1
  84. package/lib/vite-wrappers/generators/clientLoaderGenerator.js +11 -3
  85. package/lib/vite-wrappers/generators/clientLoaderGenerator.js.map +1 -1
  86. package/lib/vite-wrappers/generators/utils/resourceParams.cjs +48 -11
  87. package/lib/vite-wrappers/generators/utils/resourceParams.cjs.map +1 -1
  88. package/lib/vite-wrappers/generators/utils/resourceParams.d.ts +10 -4
  89. package/lib/vite-wrappers/generators/utils/resourceParams.js +48 -11
  90. package/lib/vite-wrappers/generators/utils/resourceParams.js.map +1 -1
  91. package/lib/vite-wrappers/icon-switch.cjs +7 -11
  92. package/lib/vite-wrappers/icon-switch.cjs.map +1 -1
  93. package/lib/vite-wrappers/icon-switch.d.ts +0 -1
  94. package/lib/vite-wrappers/icon-switch.js +6 -10
  95. package/lib/vite-wrappers/icon-switch.js.map +1 -1
  96. package/lib/vite-wrappers/json-wrappers.cjs +30 -2
  97. package/lib/vite-wrappers/json-wrappers.cjs.map +1 -1
  98. package/lib/vite-wrappers/json-wrappers.js +30 -2
  99. package/lib/vite-wrappers/json-wrappers.js.map +1 -1
  100. package/lib/vite-wrappers/wrapperComponent.cjs +4 -4
  101. package/lib/vite-wrappers/wrapperComponent.cjs.map +1 -1
  102. package/lib/vite-wrappers/wrapperComponent.js +4 -4
  103. package/lib/vite-wrappers/wrapperComponent.js.map +1 -1
  104. package/package.json +5 -5
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Post-build script to fix malformed generated TypeScript definitions
5
+ * Fixes issues where JSDoc comments are incorrectly inserted into type definitions
6
+ */
7
+
8
+ import { readFileSync, writeFileSync } from 'fs';
9
+ import { fileURLToPath } from 'url';
10
+ import { dirname, join } from 'path';
11
+
12
+ const __filename = fileURLToPath(import.meta.url);
13
+ const __dirname = dirname(__filename);
14
+
15
+ const generatedFilePath = join(__dirname, '../lib/generated/generated.d.ts');
16
+
17
+ try {
18
+ console.log('Fixing generated type definitions...');
19
+
20
+ let content = readFileSync(generatedFilePath, 'utf8');
21
+
22
+ // Fix issue where JSDoc comments are inserted in the middle of type definitions
23
+ // Pattern 1: SchemaTypes.Scalars["URI"] /**...*/ ["input"]
24
+ // Should be: SchemaTypes.Scalars["URI"]["input"]
25
+ const jsdocInTypeRegex = /SchemaTypes\.Scalars\["URI"\]\s*\/\*\*[\s\S]*?\*\/\s*\["input"\]/g;
26
+ content = content.replace(jsdocInTypeRegex, 'SchemaTypes.Scalars["URI"]["input"]');
27
+
28
+ // Pattern 2: SchemaTypes.Scalars["Int"] /**...*/ ["input"]
29
+ // Remove JSDoc comments that appear between type accessors
30
+ const jsdocBetweenAccessorsRegex = /(SchemaTypes\.Scalars\["[^"]+"\])\s*\/\*\*[\s\S]*?\*\/\s*(\["input"\])/g;
31
+ content = content.replace(jsdocBetweenAccessorsRegex, '$1$2');
32
+
33
+ // Pattern 3: Fix closing JSDoc that appears as a standalone line followed by ["input"]
34
+ // Pattern: */ ["input"]>
35
+ // Should be removed - the JSDoc block shouldn't be there at all
36
+ const standaloneJsdocCloseRegex = /\s*\*\/\["input"\]>/g;
37
+ content = content.replace(standaloneJsdocCloseRegex, '>');
38
+
39
+ // Pattern 4: Fix multi-line JSDoc comments that break type definitions
40
+ // This happens when a JSDoc comment from another function is incorrectly placed
41
+ // between type accessor parts, e.g., ["String"] /**...*/ ["input"]
42
+ // Match any Scalar type followed by JSDoc followed by ["input"] or ["output"]
43
+ const multilineJsdocInTypeRegex = /(SchemaTypes\.Scalars\[[^\]]+\])\s*\/\*\*[\s\S]*?\*\/\s*(\["(?:input|output)"\])/g;
44
+ content = content.replace(multilineJsdocInTypeRegex, '$1$2');
45
+
46
+ // Pattern 5: Fix cases where JSDoc appears between other type accessors
47
+ // e.g., key: SchemaTypes.Scalars["String"] /**...*/ ["input"];
48
+ const typeAccessorJsdocRegex = /(\w+:\s*SchemaTypes\.\w+\[[^\]]+\])\s*\/\*\*[\s\S]*?\*\/\s*(\[[^\]]+\])/g;
49
+ content = content.replace(typeAccessorJsdocRegex, '$1$2');
50
+
51
+ // Write the fixed content back
52
+ writeFileSync(generatedFilePath, content, 'utf8');
53
+
54
+ console.log('✓ Successfully fixed generated type definitions');
55
+ } catch (error) {
56
+ console.error('Error fixing generated types:', error.message);
57
+ process.exit(1);
58
+ }
@@ -0,0 +1,34 @@
1
+ //@ts-nocheck
2
+ import { DataProxy } from '@apollo/client/cache';
3
+ import { ApolloClient } from '@apollo/client/index.js';
4
+ import { CdmLogger } from '@cdm-logger/core';
5
+ import express from 'express';
6
+ import { IPreferncesTransformed } from '@common-stack/server-core';
7
+ import { ClientContext } from './client-context';
8
+ import { IHttpReq, IIGraphQlContext } from './generated/generated-models';
9
+
10
+ /**
11
+ *
12
+ * Context
13
+ * @export
14
+ * @interface MyContext
15
+ */
16
+
17
+ export interface IDataSources {}
18
+
19
+ export interface IHttpMiddlewareContext {
20
+ req?: express.Request &
21
+ IHttpReq & {
22
+ logger?: CdmLogger.ILogger;
23
+ errors?: any;
24
+ };
25
+ res: express.Response;
26
+ }
27
+
28
+ export interface IGraphQLContext extends IIGraphQlContext {}
29
+ export interface ServerContext extends IHttpMiddlewareContext, IGraphQLContext {
30
+ /** Backend Datasource */
31
+ dataSources: IDataSources;
32
+ preferences: IPreferncesTransformed[];
33
+ }
34
+ export interface MyContext extends ClientContext, ServerContext {}
@@ -4,7 +4,16 @@ import { ApolloClient } from '@apollo/client/index.js';
4
4
  import { CdmLogger } from '@cdm-logger/core';
5
5
  import express from 'express';
6
6
  import { IPreferncesTransformed } from '@common-stack/server-core';
7
- import { IUserContext, IUserProfile, IIAuth0Token, AuthStrategy } from './generated/generated-models';
7
+ import { ClientContext } from './client-context';
8
+ import {
9
+ IUserContext,
10
+ IUserProfile,
11
+ IIAuth0Token,
12
+ AuthStrategy,
13
+ ICdecodeParsedUri,
14
+ IHttpReq,
15
+ IIGraphQlContext,
16
+ } from './generated/generated-models';
8
17
  /**
9
18
  *
10
19
  * Context
@@ -12,22 +21,6 @@ import { IUserContext, IUserProfile, IIAuth0Token, AuthStrategy } from './genera
12
21
  * @interface MyContext
13
22
  */
14
23
 
15
- export interface ClientContext {
16
- /**
17
- * Only application on the client side
18
- */
19
- cache: DataProxy;
20
- /**
21
- * Only application on the client side
22
- */
23
- getCacheKey: (options: { __typename: string; id?: string }) => string;
24
- /**
25
- * Only applicable on the client side
26
- */
27
- apolloClient: ApolloClient<any>; // deprecated use `client` instead
28
- client: ApolloClient<any>;
29
- }
30
-
31
24
  export interface IDataSources {}
32
25
 
33
26
  export interface IHttpMiddlewareContext {
@@ -36,21 +29,21 @@ export interface IHttpMiddlewareContext {
36
29
  permissions?: any;
37
30
  cdecodeuri?: any;
38
31
  logger?: CdmLogger.ILogger;
32
+ currentPageUriSegments?: ICdecodeParsedUri;
39
33
  user?: IIAuth0Token;
40
34
  errors?: any;
41
35
  profile?: IUserProfile;
42
- };
36
+ } & IHttpReq;
43
37
  res: express.Response;
44
38
  }
45
39
 
46
- export type IGraphQLContext = {
40
+ export interface IGraphQLContext extends IIGraphQlContext {
47
41
  /**
48
42
  * current ip of the user fetched from the request
49
43
  */
50
44
  userIp: string;
51
45
  };
52
46
  export interface ServerContext extends IHttpMiddlewareContext, IGraphQLContext {
53
- accessRoleService: any;
54
47
  user?: IIAuth0Token;
55
48
  userContext?: IUserContext;
56
49
  orgname?: string;
@@ -0,0 +1,19 @@
1
+
2
+ import { DataProxy } from '@apollo/client/cache';
3
+ import { ApolloClient } from '@apollo/client/index.js';
4
+
5
+ export interface ClientContext {
6
+ /**
7
+ * Only application on the client side
8
+ */
9
+ cache: DataProxy;
10
+ /**
11
+ * Only application on the client side
12
+ */
13
+ getCacheKey: (options: { __typename: string; id?: string }) => string;
14
+ /**
15
+ * Only applicable on the client side
16
+ */
17
+ apolloClient: ApolloClient<any>; // deprecated use `client` instead
18
+ client: ApolloClient<any>;
19
+ }
@@ -0,0 +1,93 @@
1
+ /* tslint:disable */
2
+ import { Event, Emitter } from './event';
3
+
4
+ export interface Disposable {
5
+ /**
6
+ * Dispose this object.
7
+ */
8
+ dispose(): void;
9
+ }
10
+
11
+ export namespace Disposable {
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ export function is(arg: any): arg is Disposable {
14
+ return !!arg && typeof arg === 'object' && 'dispose' in arg && typeof arg['dispose'] === 'function';
15
+ }
16
+ export function create(func: () => void): Disposable {
17
+ return {
18
+ dispose: func
19
+ };
20
+ }
21
+ export const NULL = create(() => { });
22
+ }
23
+
24
+ export class DisposableCollection implements Disposable {
25
+
26
+ protected readonly disposables: Disposable[] = [];
27
+ protected readonly onDisposeEmitter = new Emitter<void>();
28
+
29
+ constructor(...toDispose: Disposable[]) {
30
+ toDispose.forEach(d => this.push(d));
31
+ }
32
+
33
+ /**
34
+ * This event is fired only once
35
+ * on first dispose of not empty collection.
36
+ */
37
+ get onDispose(): Event<void> {
38
+ return this.onDisposeEmitter.event;
39
+ }
40
+
41
+ protected checkDisposed(): void {
42
+ if (this.disposed && !this.disposingElements) {
43
+ this.onDisposeEmitter.fire(undefined);
44
+ this.onDisposeEmitter.dispose();
45
+ }
46
+ }
47
+
48
+ get disposed(): boolean {
49
+ return this.disposables.length === 0;
50
+ }
51
+
52
+ private disposingElements = false;
53
+ dispose(): void {
54
+ if (this.disposed || this.disposingElements) {
55
+ return;
56
+ }
57
+ this.disposingElements = true;
58
+ while (!this.disposed) {
59
+ try {
60
+ this.disposables.pop()!.dispose();
61
+ } catch (e) {
62
+ console.error(e);
63
+ }
64
+ }
65
+ this.disposingElements = false;
66
+ this.checkDisposed();
67
+ }
68
+
69
+ push(disposable: Disposable): Disposable {
70
+ const disposables = this.disposables;
71
+ disposables.push(disposable);
72
+ const originalDispose = disposable.dispose.bind(disposable);
73
+ const toRemove = Disposable.create(() => {
74
+ const index = disposables.indexOf(disposable);
75
+ if (index !== -1) {
76
+ disposables.splice(index, 1);
77
+ }
78
+ this.checkDisposed();
79
+ });
80
+ disposable.dispose = () => {
81
+ toRemove.dispose();
82
+ originalDispose();
83
+ };
84
+ return toRemove;
85
+ }
86
+
87
+ pushAll(disposables: Disposable[]): Disposable[] {
88
+ return disposables.map(disposable =>
89
+ this.push(disposable)
90
+ );
91
+ }
92
+
93
+ }
@@ -0,0 +1,16 @@
1
+ // import { expect } from 'vitest';
2
+ // import { Emitter } from './event';
3
+
4
+ // describe('Event Objects', () => {
5
+
6
+ // it('Emitter firing should be synchronous', () => {
7
+ // const emitter = new Emitter<undefined>();
8
+ // let counter = 0;
9
+
10
+ // emitter.event(() => counter++);
11
+ // expect(counter).eq(0);
12
+ // emitter.fire(undefined);
13
+ // expect(counter).eq(1);
14
+ // });
15
+
16
+ // });
@@ -0,0 +1,326 @@
1
+ /* tslint:disable */
2
+
3
+ import { Disposable } from './disposable';
4
+ import { MaybePromise } from './types';
5
+
6
+ /**
7
+ * Represents a typed event.
8
+ */
9
+ export interface Event<T> {
10
+
11
+ /**
12
+ *
13
+ * @param listener The listener function will be call when the event happens.
14
+ * @param thisArgs The 'this' which will be used when calling the event listener.
15
+ * @param disposables An array to which a {{IDisposable}} will be added.
16
+ * @return a disposable to remove the listener again.
17
+ */
18
+ (listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]): Disposable;
19
+ /**
20
+ * An emitter will print a warning if more listeners are added for this event.
21
+ * The event.maxListeners allows the limit to be modified for this specific event.
22
+ * The value can be set to 0 to indicate an unlimited number of listener.
23
+ */
24
+ maxListeners: number
25
+ }
26
+
27
+ export namespace Event {
28
+ const _disposable = { dispose(): void { } };
29
+ export const None: Event<any> = Object.assign(function (): { dispose(): void } { return _disposable; }, {
30
+ get maxListeners(): number { return 0; },
31
+ set maxListeners(maxListeners: number) { }
32
+ });
33
+
34
+ /**
35
+ * Given an event and a `map` function, returns another event which maps each element
36
+ * through the mapping function.
37
+ */
38
+ export function map<I, O>(event: Event<I>, mapFunc: (i: I) => O): Event<O> {
39
+ return Object.assign((listener: (e: O) => any, thisArgs?: any, disposables?: Disposable[]) => event(i => listener.call(thisArgs, mapFunc(i)), undefined, disposables), {
40
+ maxListeners: 0,
41
+ });
42
+ }
43
+ }
44
+
45
+ type Callback = (...args: any[]) => any;
46
+ class CallbackList implements Iterable<Callback> {
47
+
48
+ private _callbacks: Function[] | undefined;
49
+ private _contexts: any[] | undefined;
50
+
51
+ get length(): number {
52
+ return this._callbacks && this._callbacks.length || 0;
53
+ }
54
+
55
+ public add(callback: Function, context: any = undefined, bucket?: Disposable[]): void {
56
+ if (!this._callbacks) {
57
+ this._callbacks = [];
58
+ this._contexts = [];
59
+ }
60
+ this._callbacks.push(callback);
61
+ this._contexts!.push(context);
62
+
63
+ if (Array.isArray(bucket)) {
64
+ bucket.push({ dispose: () => this.remove(callback, context) });
65
+ }
66
+ }
67
+
68
+ public remove(callback: Function, context: any = undefined): void {
69
+ if (!this._callbacks) {
70
+ return;
71
+ }
72
+
73
+ let foundCallbackWithDifferentContext = false;
74
+ for (let i = 0; i < this._callbacks.length; i++) {
75
+ if (this._callbacks[i] === callback) {
76
+ if (this._contexts![i] === context) {
77
+ // callback & context match => remove it
78
+ this._callbacks.splice(i, 1);
79
+ this._contexts!.splice(i, 1);
80
+ return;
81
+ } else {
82
+ foundCallbackWithDifferentContext = true;
83
+ }
84
+ }
85
+ }
86
+
87
+ if (foundCallbackWithDifferentContext) {
88
+ throw new Error('When adding a listener with a context, you should remove it with the same context');
89
+ }
90
+ }
91
+
92
+ // tslint:disable-next-line:typedef
93
+ public [Symbol.iterator]() {
94
+ if (!this._callbacks) {
95
+ return [][Symbol.iterator]();
96
+ }
97
+ const callbacks = this._callbacks.slice(0);
98
+ const contexts = this._contexts!.slice(0);
99
+
100
+ return callbacks.map((callback, i) =>
101
+ (...args: any[]) => callback.apply(contexts[i], args)
102
+ )[Symbol.iterator]();
103
+ }
104
+
105
+ public invoke(...args: any[]): any[] {
106
+ const ret: any[] = [];
107
+ for (const callback of this) {
108
+ try {
109
+ ret.push(callback(...args));
110
+ } catch (e) {
111
+ console.error(e);
112
+ }
113
+ }
114
+ return ret;
115
+ }
116
+
117
+ public isEmpty(): boolean {
118
+ return !this._callbacks || this._callbacks.length === 0;
119
+ }
120
+
121
+ public dispose(): void {
122
+ this._callbacks = undefined;
123
+ this._contexts = undefined;
124
+ }
125
+ }
126
+
127
+ export interface EmitterOptions {
128
+ onFirstListenerAdd?: Function;
129
+ onLastListenerRemove?: Function;
130
+ }
131
+
132
+ export class Emitter<T = any> {
133
+
134
+ private static LEAK_WARNING_THRESHHOLD = 175;
135
+
136
+ private static _noop = function (): void { };
137
+
138
+ private _event: Event<T>;
139
+ private _callbacks: CallbackList | undefined;
140
+ private _disposed = false;
141
+
142
+ private _leakingStacks: Map<string, number> | undefined;
143
+ private _leakWarnCountdown = 0;
144
+
145
+ constructor(
146
+ private _options?: EmitterOptions
147
+ ) { }
148
+
149
+ /**
150
+ * For the public to allow to subscribe
151
+ * to events from this Emitter
152
+ */
153
+ get event(): Event<T> {
154
+ if (!this._event) {
155
+ this._event = Object.assign((listener: (e: T) => any, thisArgs?: any, disposables?: Disposable[]) => {
156
+ if (!this._callbacks) {
157
+ this._callbacks = new CallbackList();
158
+ }
159
+ if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
160
+ this._options.onFirstListenerAdd(this);
161
+ }
162
+ this._callbacks.add(listener, thisArgs);
163
+ const removeMaxListenersCheck = this.checkMaxListeners(this._event.maxListeners);
164
+
165
+ const result: Disposable = {
166
+ dispose: () => {
167
+ if (removeMaxListenersCheck) {
168
+ removeMaxListenersCheck();
169
+ }
170
+ result.dispose = Emitter._noop;
171
+ if (!this._disposed) {
172
+ this._callbacks!.remove(listener, thisArgs);
173
+ result.dispose = Emitter._noop;
174
+ if (this._options && this._options.onLastListenerRemove && this._callbacks!.isEmpty()) {
175
+ this._options.onLastListenerRemove(this);
176
+ }
177
+ }
178
+ }
179
+ };
180
+ if (Array.isArray(disposables)) {
181
+ disposables.push(result);
182
+ }
183
+
184
+ return result;
185
+ }, {
186
+ maxListeners: Emitter.LEAK_WARNING_THRESHHOLD
187
+ }
188
+ );
189
+ }
190
+ return this._event;
191
+ }
192
+
193
+ protected checkMaxListeners(maxListeners: number): (() => void) | undefined {
194
+ if (maxListeners === 0 || !this._callbacks) {
195
+ return undefined;
196
+ }
197
+ const listenerCount = this._callbacks.length;
198
+ if (listenerCount <= maxListeners) {
199
+ return undefined;
200
+ }
201
+
202
+ const popStack = this.pushLeakingStack();
203
+
204
+ this._leakWarnCountdown -= 1;
205
+ if (this._leakWarnCountdown <= 0) {
206
+ // only warn on first exceed and then every time the limit
207
+ // is exceeded by 50% again
208
+ this._leakWarnCountdown = maxListeners * 0.5;
209
+
210
+ let topStack: string;
211
+ let topCount = 0;
212
+ this._leakingStacks!.forEach((stackCount, stack) => {
213
+ if (!topStack || topCount < stackCount) {
214
+ topStack = stack;
215
+ topCount = stackCount;
216
+ }
217
+ });
218
+
219
+ // eslint-disable-next-line max-len
220
+ console.warn(`Possible Emitter memory leak detected. ${listenerCount} listeners added. Use event.maxListeners to increase the limit (${maxListeners}). MOST frequent listener (${topCount}):`);
221
+ console.warn(topStack!);
222
+ }
223
+
224
+ return popStack;
225
+ }
226
+
227
+ protected pushLeakingStack(): () => void {
228
+ if (!this._leakingStacks) {
229
+ this._leakingStacks = new Map();
230
+ }
231
+ const stack = new Error().stack!.split('\n').slice(3).join('\n');
232
+ const count = (this._leakingStacks.get(stack) || 0);
233
+ this._leakingStacks.set(stack, count + 1);
234
+ return () => this.popLeakingStack(stack);
235
+ }
236
+
237
+ protected popLeakingStack(stack: string): void {
238
+ if (!this._leakingStacks) {
239
+ return;
240
+ }
241
+ const count = (this._leakingStacks.get(stack) || 0);
242
+ this._leakingStacks.set(stack, count - 1);
243
+ }
244
+
245
+ /**
246
+ * To be kept private to fire an event to
247
+ * subscribers
248
+ */
249
+ fire(event: T): any {
250
+ if (this._callbacks) {
251
+ this._callbacks.invoke(event);
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Process each listener one by one.
257
+ * Return `false` to stop iterating over the listeners, `true` to continue.
258
+ */
259
+ async sequence(processor: (listener: (e: T) => any) => MaybePromise<boolean>): Promise<void> {
260
+ if (this._callbacks) {
261
+ for (const listener of this._callbacks) {
262
+ if (!await processor(listener)) {
263
+ break;
264
+ }
265
+ }
266
+ }
267
+ }
268
+
269
+ dispose(): void {
270
+ if (this._leakingStacks) {
271
+ this._leakingStacks.clear();
272
+ this._leakingStacks = undefined;
273
+ }
274
+ if (this._callbacks) {
275
+ this._callbacks.dispose();
276
+ this._callbacks = undefined;
277
+ }
278
+ this._disposed = true;
279
+ }
280
+ }
281
+
282
+ export interface WaitUntilEvent {
283
+ /* eslint-disable @typescript-eslint/no-explicit-any */
284
+ /**
285
+ * Allows to pause the event loop until the provided thenable resolved.
286
+ *
287
+ * *Note:* It can only be called during event dispatch and not in an asynchronous manner
288
+ *
289
+ * @param thenable A thenable that delays execution.
290
+ */
291
+ waitUntil(thenable: Promise<any>): void;
292
+ /* eslint-enable @typescript-eslint/no-explicit-any */
293
+ }
294
+ export namespace WaitUntilEvent {
295
+ export async function fire<T extends WaitUntilEvent>(
296
+ emitter: Emitter<T>,
297
+ event: Pick<T, Exclude<keyof T, 'waitUntil'>>,
298
+ timeout: number | undefined = undefined
299
+ ): Promise<void> {
300
+ const waitables: Promise<void>[] = [];
301
+ const asyncEvent = Object.assign(event, {
302
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
303
+ waitUntil: (thenable: Promise<any>) => {
304
+ if (Object.isFrozen(waitables)) {
305
+ throw new Error('waitUntil cannot be called asynchronously.');
306
+ }
307
+ waitables.push(thenable);
308
+ }
309
+ }) as T;
310
+ try {
311
+ emitter.fire(asyncEvent);
312
+ // Asynchronous calls to `waitUntil` should fail.
313
+ Object.freeze(waitables);
314
+ } finally {
315
+ delete asyncEvent['waitUntil'];
316
+ }
317
+ if (!waitables.length) {
318
+ return;
319
+ }
320
+ if (timeout !== undefined) {
321
+ await Promise.race([Promise.all(waitables), new Promise(resolve => setTimeout(resolve, timeout))]);
322
+ } else {
323
+ await Promise.all(waitables);
324
+ }
325
+ }
326
+ }
@@ -0,0 +1,3 @@
1
+ export * from './disposable';
2
+ export * from './event';
3
+ export * from './types';
@@ -0,0 +1 @@
1
+ export type MaybePromise<T> = T | PromiseLike<T>;
@@ -0,0 +1 @@
1
+ export const DUMMY2 = 'dummy';
@@ -0,0 +1,7 @@
1
+ export * from './generated/generated-models';
2
+ export * from './generated/service-schemas';
3
+ export * from './configuration';
4
+ export * from './permissions';
5
+ export * from './apollo-context';
6
+ export * from './types';
7
+ export * from './core';
@@ -3,3 +3,4 @@ export * from './configuration';
3
3
  export * from './permissions';
4
4
  export * from './apollo-context';
5
5
  export * from './types';
6
+ export * from './core';
@@ -1,4 +1,5 @@
1
1
  export * from './utils';
2
+ export * from './packageUtils';
2
3
  export * from './withErrorHandleUtil';
3
4
  export * from './setupConfig';
4
5
  export * from './verifyConfig';