@fias/plugin-dev-harness 1.1.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 (125) hide show
  1. package/dist/bridge/live-handler.d.ts +27 -0
  2. package/dist/bridge/live-handler.d.ts.map +1 -0
  3. package/dist/bridge/live-handler.js +47 -0
  4. package/dist/bridge/live-handler.js.map +1 -0
  5. package/dist/bridge/live-handler.test.d.ts +2 -0
  6. package/dist/bridge/live-handler.test.d.ts.map +1 -0
  7. package/dist/bridge/live-handler.test.js +182 -0
  8. package/dist/bridge/live-handler.test.js.map +1 -0
  9. package/dist/bridge/mock-handler.d.ts +25 -0
  10. package/dist/bridge/mock-handler.d.ts.map +1 -0
  11. package/dist/bridge/mock-handler.js +81 -0
  12. package/dist/bridge/mock-handler.js.map +1 -0
  13. package/dist/bridge/mock-handler.test.d.ts +2 -0
  14. package/dist/bridge/mock-handler.test.d.ts.map +1 -0
  15. package/dist/bridge/mock-handler.test.js +322 -0
  16. package/dist/bridge/mock-handler.test.js.map +1 -0
  17. package/dist/bridge/types.d.ts +18 -0
  18. package/dist/bridge/types.d.ts.map +1 -0
  19. package/dist/bridge/types.js +8 -0
  20. package/dist/bridge/types.js.map +1 -0
  21. package/dist/cli/dev.d.ts +15 -0
  22. package/dist/cli/dev.d.ts.map +1 -0
  23. package/dist/cli/dev.js +64 -0
  24. package/dist/cli/dev.js.map +1 -0
  25. package/dist/cli/dev.test.d.ts +2 -0
  26. package/dist/cli/dev.test.d.ts.map +1 -0
  27. package/dist/cli/dev.test.js +114 -0
  28. package/dist/cli/dev.test.js.map +1 -0
  29. package/dist/cli/entities.d.ts +9 -0
  30. package/dist/cli/entities.d.ts.map +1 -0
  31. package/dist/cli/entities.js +71 -0
  32. package/dist/cli/entities.js.map +1 -0
  33. package/dist/cli/entities.test.d.ts +2 -0
  34. package/dist/cli/entities.test.d.ts.map +1 -0
  35. package/dist/cli/entities.test.js +179 -0
  36. package/dist/cli/entities.test.js.map +1 -0
  37. package/dist/cli/index.d.ts +9 -0
  38. package/dist/cli/index.d.ts.map +1 -0
  39. package/dist/cli/index.js +29 -0
  40. package/dist/cli/index.js.map +1 -0
  41. package/dist/cli/index.test.d.ts +2 -0
  42. package/dist/cli/index.test.d.ts.map +1 -0
  43. package/dist/cli/index.test.js +55 -0
  44. package/dist/cli/index.test.js.map +1 -0
  45. package/dist/cli/login.d.ts +9 -0
  46. package/dist/cli/login.d.ts.map +1 -0
  47. package/dist/cli/login.js +80 -0
  48. package/dist/cli/login.js.map +1 -0
  49. package/dist/cli/login.test.d.ts +2 -0
  50. package/dist/cli/login.test.d.ts.map +1 -0
  51. package/dist/cli/login.test.js +53 -0
  52. package/dist/cli/login.test.js.map +1 -0
  53. package/dist/cli/submit.d.ts +9 -0
  54. package/dist/cli/submit.d.ts.map +1 -0
  55. package/dist/cli/submit.js +250 -0
  56. package/dist/cli/submit.js.map +1 -0
  57. package/dist/cli/submit.test.d.ts +2 -0
  58. package/dist/cli/submit.test.d.ts.map +1 -0
  59. package/dist/cli/submit.test.js +381 -0
  60. package/dist/cli/submit.test.js.map +1 -0
  61. package/dist/cli/validate.d.ts +9 -0
  62. package/dist/cli/validate.d.ts.map +1 -0
  63. package/dist/cli/validate.js +154 -0
  64. package/dist/cli/validate.js.map +1 -0
  65. package/dist/cli/validate.test.d.ts +2 -0
  66. package/dist/cli/validate.test.d.ts.map +1 -0
  67. package/dist/cli/validate.test.js +275 -0
  68. package/dist/cli/validate.test.js.map +1 -0
  69. package/dist/config/config-loader.d.ts +25 -0
  70. package/dist/config/config-loader.d.ts.map +1 -0
  71. package/dist/config/config-loader.js +78 -0
  72. package/dist/config/config-loader.js.map +1 -0
  73. package/dist/config/config-loader.test.d.ts +2 -0
  74. package/dist/config/config-loader.test.d.ts.map +1 -0
  75. package/dist/config/config-loader.test.js +163 -0
  76. package/dist/config/config-loader.test.js.map +1 -0
  77. package/dist/config/credentials.d.ts +11 -0
  78. package/dist/config/credentials.d.ts.map +1 -0
  79. package/dist/config/credentials.js +71 -0
  80. package/dist/config/credentials.js.map +1 -0
  81. package/dist/config/credentials.test.d.ts +2 -0
  82. package/dist/config/credentials.test.d.ts.map +1 -0
  83. package/dist/config/credentials.test.js +115 -0
  84. package/dist/config/credentials.test.js.map +1 -0
  85. package/dist/index.d.ts +9 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +12 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/mocks/entity-responses.d.ts +15 -0
  90. package/dist/mocks/entity-responses.d.ts.map +1 -0
  91. package/dist/mocks/entity-responses.js +21 -0
  92. package/dist/mocks/entity-responses.js.map +1 -0
  93. package/dist/mocks/entity-responses.test.d.ts +2 -0
  94. package/dist/mocks/entity-responses.test.d.ts.map +1 -0
  95. package/dist/mocks/entity-responses.test.js +53 -0
  96. package/dist/mocks/entity-responses.test.js.map +1 -0
  97. package/dist/mocks/theme.d.ts +22 -0
  98. package/dist/mocks/theme.d.ts.map +1 -0
  99. package/dist/mocks/theme.js +37 -0
  100. package/dist/mocks/theme.js.map +1 -0
  101. package/dist/mocks/theme.test.d.ts +2 -0
  102. package/dist/mocks/theme.test.d.ts.map +1 -0
  103. package/dist/mocks/theme.test.js +66 -0
  104. package/dist/mocks/theme.test.js.map +1 -0
  105. package/dist/mocks/user.d.ts +12 -0
  106. package/dist/mocks/user.d.ts.map +1 -0
  107. package/dist/mocks/user.js +14 -0
  108. package/dist/mocks/user.js.map +1 -0
  109. package/dist/mocks/user.test.d.ts +2 -0
  110. package/dist/mocks/user.test.d.ts.map +1 -0
  111. package/dist/mocks/user.test.js +23 -0
  112. package/dist/mocks/user.test.js.map +1 -0
  113. package/dist/server/harness-server.d.ts +24 -0
  114. package/dist/server/harness-server.d.ts.map +1 -0
  115. package/dist/server/harness-server.js +433 -0
  116. package/dist/server/harness-server.js.map +1 -0
  117. package/dist/server/harness-server.test.d.ts +2 -0
  118. package/dist/server/harness-server.test.d.ts.map +1 -0
  119. package/dist/server/harness-server.test.js +178 -0
  120. package/dist/server/harness-server.test.js.map +1 -0
  121. package/dist/server/static/harness.css +160 -0
  122. package/dist/server/static/harness.html +35 -0
  123. package/dist/server/static/harness.js +345 -0
  124. package/package.json +43 -0
  125. package/templates/fias-dev.config.json +12 -0
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const config_loader_1 = require("./config-loader");
38
+ jest.mock('fs');
39
+ const mockedFs = jest.mocked(fs);
40
+ describe('config/config-loader', () => {
41
+ beforeEach(() => {
42
+ jest.resetAllMocks();
43
+ });
44
+ describe('loadConfig()', () => {
45
+ it('returns default config when no config file exists', () => {
46
+ mockedFs.existsSync.mockReturnValue(false);
47
+ const config = (0, config_loader_1.loadConfig)();
48
+ expect(config.pluginUrl).toBe('http://localhost:3100');
49
+ expect(config.port).toBe(3200);
50
+ expect(config.permissions).toEqual([
51
+ 'theme:read',
52
+ 'entities:invoke',
53
+ 'storage:sandbox',
54
+ 'user:profile:read',
55
+ ]);
56
+ expect(config.mockUser).toEqual({
57
+ userId: 'dev_user_001',
58
+ displayName: 'Dev User',
59
+ avatar: null,
60
+ });
61
+ expect(config.mockTheme).toBe('light');
62
+ expect(config.apiUrl).toBe('https://api.fias.app/v1');
63
+ });
64
+ it('merges user config with defaults', () => {
65
+ mockedFs.existsSync.mockReturnValue(true);
66
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
67
+ pluginUrl: 'http://localhost:4000',
68
+ port: 5000,
69
+ mockTheme: 'dark',
70
+ }));
71
+ const config = (0, config_loader_1.loadConfig)();
72
+ expect(config.pluginUrl).toBe('http://localhost:4000');
73
+ expect(config.port).toBe(5000);
74
+ expect(config.mockTheme).toBe('dark');
75
+ // Defaults should still be present for unspecified fields
76
+ expect(config.permissions).toEqual([
77
+ 'theme:read',
78
+ 'entities:invoke',
79
+ 'storage:sandbox',
80
+ 'user:profile:read',
81
+ ]);
82
+ expect(config.apiUrl).toBe('https://api.fias.app/v1');
83
+ });
84
+ it('deep merges mockUser with defaults', () => {
85
+ mockedFs.existsSync.mockReturnValue(true);
86
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
87
+ mockUser: {
88
+ displayName: 'Custom User',
89
+ },
90
+ }));
91
+ const config = (0, config_loader_1.loadConfig)();
92
+ expect(config.mockUser.displayName).toBe('Custom User');
93
+ expect(config.mockUser.userId).toBe('dev_user_001');
94
+ expect(config.mockUser.avatar).toBeNull();
95
+ });
96
+ it('handles mockEntities in user config', () => {
97
+ mockedFs.existsSync.mockReturnValue(true);
98
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
99
+ mockEntities: {
100
+ entity_summarize: {
101
+ response: 'Custom summary response',
102
+ delay: 500,
103
+ },
104
+ },
105
+ }));
106
+ const config = (0, config_loader_1.loadConfig)();
107
+ expect(config.mockEntities).toBeDefined();
108
+ expect(config.mockEntities.entity_summarize).toEqual({
109
+ response: 'Custom summary response',
110
+ delay: 500,
111
+ });
112
+ });
113
+ it('returns defaults when config file has invalid JSON', () => {
114
+ mockedFs.existsSync.mockReturnValue(true);
115
+ mockedFs.readFileSync.mockReturnValue('not valid json {{{');
116
+ const config = (0, config_loader_1.loadConfig)();
117
+ expect(config.pluginUrl).toBe('http://localhost:3100');
118
+ expect(config.port).toBe(3200);
119
+ });
120
+ it('returns defaults when readFileSync throws', () => {
121
+ mockedFs.existsSync.mockReturnValue(true);
122
+ mockedFs.readFileSync.mockImplementation(() => {
123
+ throw new Error('EACCES: permission denied');
124
+ });
125
+ const config = (0, config_loader_1.loadConfig)();
126
+ expect(config.pluginUrl).toBe('http://localhost:3100');
127
+ expect(config.port).toBe(3200);
128
+ });
129
+ it('handles empty mockUser in user config (uses all defaults)', () => {
130
+ mockedFs.existsSync.mockReturnValue(true);
131
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
132
+ mockUser: {},
133
+ }));
134
+ const config = (0, config_loader_1.loadConfig)();
135
+ expect(config.mockUser).toEqual({
136
+ userId: 'dev_user_001',
137
+ displayName: 'Dev User',
138
+ avatar: null,
139
+ });
140
+ });
141
+ it('handles user config with no mockUser key', () => {
142
+ mockedFs.existsSync.mockReturnValue(true);
143
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({
144
+ port: 9999,
145
+ }));
146
+ const config = (0, config_loader_1.loadConfig)();
147
+ expect(config.port).toBe(9999);
148
+ expect(config.mockUser).toEqual({
149
+ userId: 'dev_user_001',
150
+ displayName: 'Dev User',
151
+ avatar: null,
152
+ });
153
+ });
154
+ it('returns a new object each time (not a shared reference)', () => {
155
+ mockedFs.existsSync.mockReturnValue(false);
156
+ const config1 = (0, config_loader_1.loadConfig)();
157
+ const config2 = (0, config_loader_1.loadConfig)();
158
+ expect(config1).not.toBe(config2);
159
+ expect(config1).toEqual(config2);
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=config-loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.test.js","sourceRoot":"","sources":["../../src/config/config-loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Credentials Manager
3
+ *
4
+ * Manages the ~/.fias/credentials file for storing API keys.
5
+ */
6
+ export interface Credentials {
7
+ apiKey: string;
8
+ }
9
+ export declare function loadCredentials(): Credentials;
10
+ export declare function saveCredentials(credentials: Credentials): void;
11
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAKD,wBAAgB,eAAe,IAAI,WAAW,CAc7C;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAQ9D"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /**
3
+ * Credentials Manager
4
+ *
5
+ * Manages the ~/.fias/credentials file for storing API keys.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.loadCredentials = loadCredentials;
42
+ exports.saveCredentials = saveCredentials;
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const os = __importStar(require("os"));
46
+ const CREDENTIALS_DIR = path.join(os.homedir(), '.fias');
47
+ const CREDENTIALS_PATH = path.join(CREDENTIALS_DIR, 'credentials');
48
+ function loadCredentials() {
49
+ if (!fs.existsSync(CREDENTIALS_PATH)) {
50
+ return { apiKey: '' };
51
+ }
52
+ try {
53
+ const content = fs.readFileSync(CREDENTIALS_PATH, 'utf-8');
54
+ const parsed = JSON.parse(content);
55
+ return {
56
+ apiKey: parsed.apiKey || '',
57
+ };
58
+ }
59
+ catch {
60
+ return { apiKey: '' };
61
+ }
62
+ }
63
+ function saveCredentials(credentials) {
64
+ if (!fs.existsSync(CREDENTIALS_DIR)) {
65
+ fs.mkdirSync(CREDENTIALS_DIR, { recursive: true, mode: 0o700 });
66
+ }
67
+ fs.writeFileSync(CREDENTIALS_PATH, JSON.stringify(credentials, null, 2) + '\n', {
68
+ mode: 0o600,
69
+ });
70
+ }
71
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/config/credentials.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaH,0CAcC;AAED,0CAQC;AAnCD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAMzB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACzD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,SAAgB,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;SAC5B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,WAAwB;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QAC9E,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=credentials.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.test.d.ts","sourceRoot":"","sources":["../../src/config/credentials.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const credentials_1 = require("./credentials");
38
+ jest.mock('fs');
39
+ const mockedFs = jest.mocked(fs);
40
+ describe('config/credentials', () => {
41
+ beforeEach(() => {
42
+ jest.resetAllMocks();
43
+ });
44
+ describe('loadCredentials()', () => {
45
+ it('returns empty apiKey when credentials file does not exist', () => {
46
+ mockedFs.existsSync.mockReturnValue(false);
47
+ const creds = (0, credentials_1.loadCredentials)();
48
+ expect(creds).toEqual({ apiKey: '' });
49
+ });
50
+ it('loads apiKey from credentials file', () => {
51
+ mockedFs.existsSync.mockReturnValue(true);
52
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({ apiKey: 'fias_sk_test_12345' }));
53
+ const creds = (0, credentials_1.loadCredentials)();
54
+ expect(creds.apiKey).toBe('fias_sk_test_12345');
55
+ });
56
+ it('returns empty apiKey when file has no apiKey property', () => {
57
+ mockedFs.existsSync.mockReturnValue(true);
58
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({}));
59
+ const creds = (0, credentials_1.loadCredentials)();
60
+ expect(creds.apiKey).toBe('');
61
+ });
62
+ it('returns empty apiKey when file has invalid JSON', () => {
63
+ mockedFs.existsSync.mockReturnValue(true);
64
+ mockedFs.readFileSync.mockReturnValue('not json');
65
+ const creds = (0, credentials_1.loadCredentials)();
66
+ expect(creds.apiKey).toBe('');
67
+ });
68
+ it('returns empty apiKey when readFileSync throws', () => {
69
+ mockedFs.existsSync.mockReturnValue(true);
70
+ mockedFs.readFileSync.mockImplementation(() => {
71
+ throw new Error('EACCES');
72
+ });
73
+ const creds = (0, credentials_1.loadCredentials)();
74
+ expect(creds.apiKey).toBe('');
75
+ });
76
+ it('returns empty apiKey when apiKey is null in file', () => {
77
+ mockedFs.existsSync.mockReturnValue(true);
78
+ mockedFs.readFileSync.mockReturnValue(JSON.stringify({ apiKey: null }));
79
+ const creds = (0, credentials_1.loadCredentials)();
80
+ expect(creds.apiKey).toBe('');
81
+ });
82
+ });
83
+ describe('saveCredentials()', () => {
84
+ it('creates directory if it does not exist and writes file', () => {
85
+ mockedFs.existsSync.mockReturnValue(false);
86
+ (0, credentials_1.saveCredentials)({ apiKey: 'fias_sk_test_67890' });
87
+ expect(mockedFs.mkdirSync).toHaveBeenCalledWith(expect.stringContaining('.fias'), {
88
+ recursive: true,
89
+ mode: 0o700,
90
+ });
91
+ expect(mockedFs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining('credentials'), expect.stringContaining('fias_sk_test_67890'), { mode: 0o600 });
92
+ });
93
+ it('does not create directory if it already exists', () => {
94
+ mockedFs.existsSync.mockReturnValue(true);
95
+ (0, credentials_1.saveCredentials)({ apiKey: 'fias_sk_test_abc' });
96
+ expect(mockedFs.mkdirSync).not.toHaveBeenCalled();
97
+ expect(mockedFs.writeFileSync).toHaveBeenCalled();
98
+ });
99
+ it('writes valid JSON to the file', () => {
100
+ mockedFs.existsSync.mockReturnValue(true);
101
+ (0, credentials_1.saveCredentials)({ apiKey: 'fias_sk_test_json' });
102
+ const writtenContent = mockedFs.writeFileSync.mock.calls[0][1];
103
+ const parsed = JSON.parse(writtenContent.trim());
104
+ expect(parsed).toEqual({ apiKey: 'fias_sk_test_json' });
105
+ });
106
+ it('writes file with restricted permissions (0o600)', () => {
107
+ mockedFs.existsSync.mockReturnValue(true);
108
+ (0, credentials_1.saveCredentials)({ apiKey: 'fias_sk_test' });
109
+ expect(mockedFs.writeFileSync).toHaveBeenCalledWith(expect.any(String), expect.any(String), {
110
+ mode: 0o600,
111
+ });
112
+ });
113
+ });
114
+ });
115
+ //# sourceMappingURL=credentials.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.test.js","sourceRoot":"","sources":["../../src/config/credentials.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * FIAS Plugin Dev Harness — CLI Entry Point
4
+ *
5
+ * Local development server and CLI tools for building
6
+ * and testing FIAS plugin arches.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * FIAS Plugin Dev Harness — CLI Entry Point
5
+ *
6
+ * Local development server and CLI tools for building
7
+ * and testing FIAS plugin arches.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const cli_1 = require("./cli");
11
+ (0, cli_1.createCli)().parse(process.argv);
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA;;;;;GAKG;;AAEH,+BAAkC;AAElC,IAAA,eAAS,GAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Canned Entity Responses
3
+ *
4
+ * Default mock responses for entity invocations in mock mode.
5
+ */
6
+ export interface MockEntityResponse {
7
+ response: string;
8
+ delay: number;
9
+ }
10
+ export declare const DEFAULT_ENTITY_RESPONSE_DELAY = 1000;
11
+ /**
12
+ * Generate a default mock response for an entity invocation.
13
+ */
14
+ export declare function getDefaultMockResponse(entityId: string, input: string): MockEntityResponse;
15
+ //# sourceMappingURL=entity-responses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-responses.d.ts","sourceRoot":"","sources":["../../src/mocks/entity-responses.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAM1F"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /**
3
+ * Canned Entity Responses
4
+ *
5
+ * Default mock responses for entity invocations in mock mode.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_ENTITY_RESPONSE_DELAY = void 0;
9
+ exports.getDefaultMockResponse = getDefaultMockResponse;
10
+ exports.DEFAULT_ENTITY_RESPONSE_DELAY = 1000;
11
+ /**
12
+ * Generate a default mock response for an entity invocation.
13
+ */
14
+ function getDefaultMockResponse(entityId, input) {
15
+ const truncatedInput = input.length > 100 ? input.substring(0, 100) + '...' : input;
16
+ return {
17
+ response: `[Mock] Response for entity ${entityId} with input: ${truncatedInput}`,
18
+ delay: exports.DEFAULT_ENTITY_RESPONSE_DELAY,
19
+ };
20
+ }
21
+ //# sourceMappingURL=entity-responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-responses.js","sourceRoot":"","sources":["../../src/mocks/entity-responses.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAYH,wDAMC;AAXY,QAAA,6BAA6B,GAAG,IAAI,CAAC;AAElD;;GAEG;AACH,SAAgB,sBAAsB,CAAC,QAAgB,EAAE,KAAa;IACpE,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACpF,OAAO;QACL,QAAQ,EAAE,8BAA8B,QAAQ,gBAAgB,cAAc,EAAE;QAChF,KAAK,EAAE,qCAA6B;KACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=entity-responses.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-responses.test.d.ts","sourceRoot":"","sources":["../../src/mocks/entity-responses.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const entity_responses_1 = require("./entity-responses");
4
+ describe('mocks/entity-responses', () => {
5
+ describe('DEFAULT_ENTITY_RESPONSE_DELAY', () => {
6
+ it('is 1000ms', () => {
7
+ expect(entity_responses_1.DEFAULT_ENTITY_RESPONSE_DELAY).toBe(1000);
8
+ });
9
+ });
10
+ describe('getDefaultMockResponse()', () => {
11
+ it('returns a MockEntityResponse with response and delay', () => {
12
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_abc', 'hello');
13
+ expect(result).toHaveProperty('response');
14
+ expect(result).toHaveProperty('delay');
15
+ expect(typeof result.response).toBe('string');
16
+ expect(typeof result.delay).toBe('number');
17
+ });
18
+ it('includes entityId and input in the response string', () => {
19
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_xyz', 'test input');
20
+ expect(result.response).toContain('entity_xyz');
21
+ expect(result.response).toContain('test input');
22
+ });
23
+ it('uses DEFAULT_ENTITY_RESPONSE_DELAY as the delay', () => {
24
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_1', 'input');
25
+ expect(result.delay).toBe(entity_responses_1.DEFAULT_ENTITY_RESPONSE_DELAY);
26
+ });
27
+ it('does not truncate short input (100 chars or less)', () => {
28
+ const shortInput = 'A'.repeat(100);
29
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_1', shortInput);
30
+ expect(result.response).toContain(shortInput);
31
+ expect(result.response).not.toContain('...');
32
+ });
33
+ it('truncates long input at 100 characters and appends ellipsis', () => {
34
+ const longInput = 'B'.repeat(200);
35
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_1', longInput);
36
+ const truncated = longInput.substring(0, 100) + '...';
37
+ expect(result.response).toContain(truncated);
38
+ // Should NOT contain the full 200-char input
39
+ expect(result.response).not.toContain(longInput);
40
+ });
41
+ it('truncates input of exactly 101 characters', () => {
42
+ const input101 = 'C'.repeat(101);
43
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_1', input101);
44
+ expect(result.response).toContain('C'.repeat(100) + '...');
45
+ expect(result.response).not.toContain(input101);
46
+ });
47
+ it('includes [Mock] prefix in response', () => {
48
+ const result = (0, entity_responses_1.getDefaultMockResponse)('entity_1', 'input');
49
+ expect(result.response).toMatch(/^\[Mock\]/);
50
+ });
51
+ });
52
+ });
53
+ //# sourceMappingURL=entity-responses.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-responses.test.js","sourceRoot":"","sources":["../../src/mocks/entity-responses.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Default FIAS Theme Values
3
+ *
4
+ * Mock theme data matching the production FIAS platform theme.
5
+ */
6
+ export interface ThemeColors {
7
+ background: string;
8
+ foreground: string;
9
+ primary: string;
10
+ secondary: string;
11
+ accent: string;
12
+ muted: string;
13
+ border: string;
14
+ }
15
+ export interface Theme {
16
+ mode: 'light' | 'dark';
17
+ colors: ThemeColors;
18
+ }
19
+ export declare const DARK_THEME: Theme;
20
+ export declare const LIGHT_THEME: Theme;
21
+ export declare function getTheme(mode: 'light' | 'dark'): Theme;
22
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/mocks/theme.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAEtD"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * Default FIAS Theme Values
4
+ *
5
+ * Mock theme data matching the production FIAS platform theme.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.LIGHT_THEME = exports.DARK_THEME = void 0;
9
+ exports.getTheme = getTheme;
10
+ exports.DARK_THEME = {
11
+ mode: 'dark',
12
+ colors: {
13
+ background: '#0a0a0f',
14
+ foreground: '#e4e4e7',
15
+ primary: '#6d28d9',
16
+ secondary: '#1e1b4b',
17
+ accent: '#8b5cf6',
18
+ muted: '#27272a',
19
+ border: '#3f3f46',
20
+ },
21
+ };
22
+ exports.LIGHT_THEME = {
23
+ mode: 'light',
24
+ colors: {
25
+ background: '#ffffff',
26
+ foreground: '#18181b',
27
+ primary: '#7c3aed',
28
+ secondary: '#ede9fe',
29
+ accent: '#8b5cf6',
30
+ muted: '#f4f4f5',
31
+ border: '#e4e4e7',
32
+ },
33
+ };
34
+ function getTheme(mode) {
35
+ return mode === 'light' ? exports.LIGHT_THEME : exports.DARK_THEME;
36
+ }
37
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/mocks/theme.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA2CH,4BAEC;AA5BY,QAAA,UAAU,GAAU;IAC/B,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE;QACN,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;KAClB;CACF,CAAC;AAEW,QAAA,WAAW,GAAU;IAChC,IAAI,EAAE,OAAO;IACb,MAAM,EAAE;QACN,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,SAAS;KAClB;CACF,CAAC;AAEF,SAAgB,QAAQ,CAAC,IAAsB;IAC7C,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAW,CAAC,CAAC,CAAC,kBAAU,CAAC;AACrD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=theme.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.test.d.ts","sourceRoot":"","sources":["../../src/mocks/theme.test.ts"],"names":[],"mappings":""}