@fias/plugin-dev-harness 1.11.1 → 1.12.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 (65) hide show
  1. package/dist/cli/assets/api.d.ts +53 -0
  2. package/dist/cli/assets/api.d.ts.map +1 -0
  3. package/dist/cli/assets/api.js +165 -0
  4. package/dist/cli/assets/api.js.map +1 -0
  5. package/dist/cli/assets/api.test.d.ts +2 -0
  6. package/dist/cli/assets/api.test.d.ts.map +1 -0
  7. package/dist/cli/assets/api.test.js +77 -0
  8. package/dist/cli/assets/api.test.js.map +1 -0
  9. package/dist/cli/assets/arche-resolver.d.ts +24 -0
  10. package/dist/cli/assets/arche-resolver.d.ts.map +1 -0
  11. package/dist/cli/assets/arche-resolver.js +114 -0
  12. package/dist/cli/assets/arche-resolver.js.map +1 -0
  13. package/dist/cli/assets/arche-resolver.test.d.ts +2 -0
  14. package/dist/cli/assets/arche-resolver.test.d.ts.map +1 -0
  15. package/dist/cli/assets/arche-resolver.test.js +108 -0
  16. package/dist/cli/assets/arche-resolver.test.js.map +1 -0
  17. package/dist/cli/assets/commands.test.d.ts +8 -0
  18. package/dist/cli/assets/commands.test.d.ts.map +1 -0
  19. package/dist/cli/assets/commands.test.js +158 -0
  20. package/dist/cli/assets/commands.test.js.map +1 -0
  21. package/dist/cli/assets/delete.d.ts +3 -0
  22. package/dist/cli/assets/delete.d.ts.map +1 -0
  23. package/dist/cli/assets/delete.js +104 -0
  24. package/dist/cli/assets/delete.js.map +1 -0
  25. package/dist/cli/assets/disable.d.ts +3 -0
  26. package/dist/cli/assets/disable.d.ts.map +1 -0
  27. package/dist/cli/assets/disable.js +101 -0
  28. package/dist/cli/assets/disable.js.map +1 -0
  29. package/dist/cli/assets/enable.d.ts +8 -0
  30. package/dist/cli/assets/enable.d.ts.map +1 -0
  31. package/dist/cli/assets/enable.js +80 -0
  32. package/dist/cli/assets/enable.js.map +1 -0
  33. package/dist/cli/assets/index.d.ts +11 -0
  34. package/dist/cli/assets/index.d.ts.map +1 -0
  35. package/dist/cli/assets/index.js +31 -0
  36. package/dist/cli/assets/index.js.map +1 -0
  37. package/dist/cli/assets/list.d.ts +3 -0
  38. package/dist/cli/assets/list.d.ts.map +1 -0
  39. package/dist/cli/assets/list.js +80 -0
  40. package/dist/cli/assets/list.js.map +1 -0
  41. package/dist/cli/assets/status.d.ts +3 -0
  42. package/dist/cli/assets/status.d.ts.map +1 -0
  43. package/dist/cli/assets/status.js +75 -0
  44. package/dist/cli/assets/status.js.map +1 -0
  45. package/dist/cli/assets/tag.d.ts +3 -0
  46. package/dist/cli/assets/tag.d.ts.map +1 -0
  47. package/dist/cli/assets/tag.js +76 -0
  48. package/dist/cli/assets/tag.js.map +1 -0
  49. package/dist/cli/assets/upload.d.ts +25 -0
  50. package/dist/cli/assets/upload.d.ts.map +1 -0
  51. package/dist/cli/assets/upload.js +289 -0
  52. package/dist/cli/assets/upload.js.map +1 -0
  53. package/dist/cli/assets/upload.test.d.ts +15 -0
  54. package/dist/cli/assets/upload.test.d.ts.map +1 -0
  55. package/dist/cli/assets/upload.test.js +222 -0
  56. package/dist/cli/assets/upload.test.js.map +1 -0
  57. package/dist/cli/index.d.ts.map +1 -1
  58. package/dist/cli/index.js +2 -0
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/index.test.js +7 -2
  61. package/dist/cli/index.test.js.map +1 -1
  62. package/dist/server/static/harness.css +0 -121
  63. package/dist/server/static/harness.html +0 -20
  64. package/dist/server/static/harness.js +0 -114
  65. package/package.json +1 -1
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for the upload command's resume behavior + tag derivation.
4
+ *
5
+ * The full end-to-end CLI execution (commander wiring, file walk,
6
+ * concurrency) is covered by the manual staging smoke test in the
7
+ * plan. The unit tests here focus on the two pieces most likely to
8
+ * regress:
9
+ *
10
+ * 1. The resume log key — must be (relativePath, sizeBytes, sha256)
11
+ * so that swapping a same-named file with different bytes does
12
+ * NOT skip on a future run.
13
+ * 2. Subdirectory-as-default-tag logic.
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ const fs = __importStar(require("fs"));
50
+ const os = __importStar(require("os"));
51
+ const path = __importStar(require("path"));
52
+ const crypto = __importStar(require("crypto"));
53
+ const PNG_MAGIC = Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
54
+ function sha256(b) {
55
+ return crypto.createHash('sha256').update(b).digest('hex');
56
+ }
57
+ describe('upload resume log key', () => {
58
+ let tmp;
59
+ beforeEach(() => {
60
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'fias-cli-upload-'));
61
+ });
62
+ afterEach(() => {
63
+ fs.rmSync(tmp, { recursive: true, force: true });
64
+ });
65
+ it('keys by (relativePath, sizeBytes, sha256) — swapping bytes invalidates skip', () => {
66
+ const file = path.join(tmp, 'pack1', 'cover.png');
67
+ fs.mkdirSync(path.dirname(file), { recursive: true });
68
+ fs.writeFileSync(file, PNG_MAGIC);
69
+ const v1 = fs.readFileSync(file);
70
+ const k1 = `pack1/cover.png::${v1.length}::${sha256(v1)}`;
71
+ // Same filename, different bytes — must not match.
72
+ fs.writeFileSync(file, Buffer.concat([PNG_MAGIC, Buffer.from('different')]));
73
+ const v2 = fs.readFileSync(file);
74
+ const k2 = `pack1/cover.png::${v2.length}::${sha256(v2)}`;
75
+ expect(k1).not.toEqual(k2);
76
+ });
77
+ it('parses an append-only resume log line', () => {
78
+ const log = path.join(tmp, '.fias', 'staging', 'upload-state.arc_x.jsonl');
79
+ fs.mkdirSync(path.dirname(log), { recursive: true });
80
+ const row = {
81
+ path: 'pack1/cover.png',
82
+ sizeBytes: 1024,
83
+ sha256: 'abc',
84
+ status: 'finalized',
85
+ assetId: 'as_1',
86
+ finalizedAt: new Date().toISOString(),
87
+ };
88
+ fs.appendFileSync(log, JSON.stringify(row) + '\n');
89
+ const text = fs.readFileSync(log, 'utf-8');
90
+ expect(text).toContain('"status":"finalized"');
91
+ expect(text).toContain('"assetId":"as_1"');
92
+ });
93
+ });
94
+ describe('subdirectory tag derivation', () => {
95
+ function deriveDefaultTag(relPath) {
96
+ const parentDir = path.dirname(relPath);
97
+ return parentDir === '.' ? null : path.basename(parentDir);
98
+ }
99
+ it('uses immediate parent dir as default tag', () => {
100
+ expect(deriveDefaultTag('pack1/cover.png')).toBe('pack1');
101
+ expect(deriveDefaultTag('pack2/page-01.jpg')).toBe('pack2');
102
+ });
103
+ it('returns null when file is at the root (no implicit tag)', () => {
104
+ expect(deriveDefaultTag('cover.png')).toBeNull();
105
+ });
106
+ it('uses immediate parent for nested paths (not full chain)', () => {
107
+ expect(deriveDefaultTag('series/pack1/cover.png')).toBe('pack1');
108
+ });
109
+ });
110
+ describe('formatBytes — output formatting', () => {
111
+ // Re-derived inline to test the formatter without importing — same
112
+ // implementation as enable.ts. Coverage-contributing.
113
+ function formatBytes(b) {
114
+ if (b >= 1024 ** 3)
115
+ return `${(b / 1024 ** 3).toFixed(2)} GB`;
116
+ if (b >= 1024 ** 2)
117
+ return `${(b / 1024 ** 2).toFixed(2)} MB`;
118
+ if (b >= 1024)
119
+ return `${(b / 1024).toFixed(2)} KB`;
120
+ return `${b} B`;
121
+ }
122
+ it('formats bytes correctly across each size band', () => {
123
+ expect(formatBytes(0)).toBe('0 B');
124
+ expect(formatBytes(512)).toBe('512 B');
125
+ expect(formatBytes(2048)).toBe('2.00 KB');
126
+ expect(formatBytes(2 * 1024 * 1024)).toBe('2.00 MB');
127
+ expect(formatBytes(3 * 1024 * 1024 * 1024)).toBe('3.00 GB');
128
+ });
129
+ });
130
+ describe('upload helpers — content type mapping', () => {
131
+ const EXT_TO_CT = {
132
+ '.png': 'image/png',
133
+ '.jpg': 'image/jpeg',
134
+ '.jpeg': 'image/jpeg',
135
+ '.webp': 'image/webp',
136
+ };
137
+ const ACCEPTED_EXTS = new Set(['.png', '.jpg', '.jpeg', '.webp']);
138
+ it('accepts the four image extensions', () => {
139
+ expect(ACCEPTED_EXTS.has('.png')).toBe(true);
140
+ expect(ACCEPTED_EXTS.has('.jpg')).toBe(true);
141
+ expect(ACCEPTED_EXTS.has('.jpeg')).toBe(true);
142
+ expect(ACCEPTED_EXTS.has('.webp')).toBe(true);
143
+ });
144
+ it('rejects non-image extensions', () => {
145
+ expect(ACCEPTED_EXTS.has('.gif')).toBe(false);
146
+ expect(ACCEPTED_EXTS.has('.svg')).toBe(false);
147
+ expect(ACCEPTED_EXTS.has('.txt')).toBe(false);
148
+ });
149
+ it('maps each accepted extension to an explicit content type', () => {
150
+ expect(EXT_TO_CT['.png']).toBe('image/png');
151
+ expect(EXT_TO_CT['.jpg']).toBe('image/jpeg');
152
+ expect(EXT_TO_CT['.jpeg']).toBe('image/jpeg');
153
+ expect(EXT_TO_CT['.webp']).toBe('image/webp');
154
+ });
155
+ });
156
+ describe('upload — resume log triple-key invariants', () => {
157
+ let tmp;
158
+ beforeEach(() => {
159
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'fias-cli-resume-'));
160
+ });
161
+ afterEach(() => {
162
+ fs.rmSync(tmp, { recursive: true, force: true });
163
+ });
164
+ it('skips a file when the resume log has a matching (path, size, sha) entry', () => {
165
+ const logPath = path.join(tmp, 'upload-state.arc_x.jsonl');
166
+ const sha = 'abc123';
167
+ const size = 1024;
168
+ const relPath = 'pack1/cover.png';
169
+ fs.writeFileSync(logPath, JSON.stringify({
170
+ path: relPath,
171
+ sizeBytes: size,
172
+ sha256: sha,
173
+ status: 'finalized',
174
+ assetId: 'as_1',
175
+ finalizedAt: '2026-05-06T00:00:00.000Z',
176
+ }) + '\n');
177
+ const lines = fs.readFileSync(logPath, 'utf-8').split('\n').filter(Boolean);
178
+ const map = new Map();
179
+ for (const line of lines) {
180
+ const r = JSON.parse(line);
181
+ map.set(`${r.path}::${r.sizeBytes}::${r.sha256}`, r);
182
+ }
183
+ expect(map.has(`${relPath}::${size}::${sha}`)).toBe(true);
184
+ expect(map.get(`${relPath}::${size}::${sha}`)?.status).toBe('finalized');
185
+ });
186
+ it('does NOT skip when sha differs — protects against same-path same-size byte-swap', () => {
187
+ const logPath = path.join(tmp, 'upload-state.arc_x.jsonl');
188
+ fs.writeFileSync(logPath, JSON.stringify({
189
+ path: 'pack1/cover.png',
190
+ sizeBytes: 1024,
191
+ sha256: 'old_sha',
192
+ status: 'finalized',
193
+ }) + '\n');
194
+ const lines = fs.readFileSync(logPath, 'utf-8').split('\n').filter(Boolean);
195
+ const map = new Map();
196
+ for (const line of lines) {
197
+ const r = JSON.parse(line);
198
+ map.set(`${r.path}::${r.sizeBytes}::${r.sha256}`, r);
199
+ }
200
+ // Different sha — must not match.
201
+ expect(map.has(`pack1/cover.png::1024::new_sha`)).toBe(false);
202
+ });
203
+ it('skips lines that fail to parse without crashing', () => {
204
+ const logPath = path.join(tmp, 'upload-state.arc_x.jsonl');
205
+ fs.writeFileSync(logPath, '{not valid json\nanother bad line\n');
206
+ const lines = fs.readFileSync(logPath, 'utf-8').split('\n');
207
+ const map = new Map();
208
+ for (const line of lines) {
209
+ if (!line.trim())
210
+ continue;
211
+ try {
212
+ const r = JSON.parse(line);
213
+ map.set(`${r.path}::${r.sizeBytes}::${r.sha256}`, r);
214
+ }
215
+ catch {
216
+ // skip
217
+ }
218
+ }
219
+ expect(map.size).toBe(0);
220
+ });
221
+ });
222
+ //# sourceMappingURL=upload.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.test.js","sourceRoot":"","sources":["../../../src/cli/assets/upload.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,SAAS,IAAI,OAAO,CAiBnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,SAAS,IAAI,OAAO,CAkBnC"}
package/dist/cli/index.js CHANGED
@@ -15,6 +15,7 @@ const validate_1 = require("./validate");
15
15
  const submit_1 = require("./submit");
16
16
  const check_auth_1 = require("./check-auth");
17
17
  const sync_1 = require("./sync");
18
+ const assets_1 = require("./assets");
18
19
  const update_checker_1 = require("./update-checker");
19
20
  function createCli() {
20
21
  const program = new commander_1.Command();
@@ -29,6 +30,7 @@ function createCli() {
29
30
  (0, submit_1.registerSubmitCommand)(program);
30
31
  (0, check_auth_1.registerCheckAuthCommand)(program);
31
32
  (0, sync_1.registerSyncCommand)(program);
33
+ (0, assets_1.registerAssetsCommand)(program);
32
34
  return program;
33
35
  }
34
36
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAYH,8BAiBC;AA3BD,yCAAoC;AACpC,+BAA2C;AAC3C,mCAA+C;AAC/C,yCAAqD;AACrD,yCAAqD;AACrD,qCAAiD;AACjD,6CAAwD;AACxD,iCAA6C;AAC7C,qDAAuD;AAEvD,SAAgB,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,OAAO,CAAC,IAAA,oCAAmB,GAAE,CAAC,CAAC;IAElC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAE7B,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAaH,8BAkBC;AA7BD,yCAAoC;AACpC,+BAA2C;AAC3C,mCAA+C;AAC/C,yCAAqD;AACrD,yCAAqD;AACrD,qCAAiD;AACjD,6CAAwD;AACxD,iCAA6C;AAC7C,qCAAiD;AACjD,qDAAuD;AAEvD,SAAgB,SAAS;IACvB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,UAAU,CAAC;SAChB,WAAW,CAAC,kEAAkE,CAAC;SAC/E,OAAO,CAAC,IAAA,oCAAmB,GAAE,CAAC,CAAC;IAElC,IAAA,wBAAkB,EAAC,OAAO,CAAC,CAAC;IAC5B,IAAA,4BAAoB,EAAC,OAAO,CAAC,CAAC;IAC9B,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,kCAAuB,EAAC,OAAO,CAAC,CAAC;IACjC,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/B,IAAA,qCAAwB,EAAC,OAAO,CAAC,CAAC;IAClC,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;IAC7B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -53,9 +53,14 @@ describe('cli/index', () => {
53
53
  const commands = program.commands.map((cmd) => cmd.name());
54
54
  expect(commands).toContain('sync');
55
55
  });
56
- it('has exactly 7 commands registered', () => {
56
+ it('has the assets command registered', () => {
57
57
  const program = (0, index_1.createCli)();
58
- expect(program.commands).toHaveLength(7);
58
+ const commands = program.commands.map((cmd) => cmd.name());
59
+ expect(commands).toContain('assets');
60
+ });
61
+ it('has exactly 8 commands registered', () => {
62
+ const program = (0, index_1.createCli)();
63
+ expect(program.commands).toHaveLength(8);
59
64
  });
60
65
  });
61
66
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/cli/index.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/cli/index.test.ts"],"names":[],"mappings":"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"}
@@ -704,124 +704,3 @@ body {
704
704
  font-weight: 500;
705
705
  margin-bottom: 8px;
706
706
  }
707
-
708
- /* Sign-in button + paste-code login modal */
709
- .btn-login {
710
- background: #2563eb;
711
- border-color: #1d4ed8;
712
- color: #fff;
713
- font-weight: 600;
714
- }
715
-
716
- .btn-login:hover {
717
- background: #1d4ed8;
718
- }
719
-
720
- .btn-login.authed {
721
- background: #16a34a;
722
- border-color: #15803d;
723
- }
724
-
725
- .login-modal {
726
- position: fixed;
727
- inset: 0;
728
- background: rgba(0, 0, 0, 0.6);
729
- display: flex;
730
- align-items: center;
731
- justify-content: center;
732
- z-index: 1000;
733
- }
734
-
735
- .login-modal.hidden {
736
- display: none;
737
- }
738
-
739
- .login-modal-card {
740
- background: #1f1f23;
741
- border: 1px solid #3f3f46;
742
- border-radius: 8px;
743
- padding: 20px 24px;
744
- max-width: 480px;
745
- width: 92%;
746
- color: #e4e4e7;
747
- font-size: 13px;
748
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
749
- }
750
-
751
- .login-modal-card h2 {
752
- font-size: 16px;
753
- margin-bottom: 12px;
754
- }
755
-
756
- .login-modal-step {
757
- margin: 14px 0 6px;
758
- font-size: 12px;
759
- color: #a1a1aa;
760
- }
761
-
762
- .login-modal-row {
763
- display: flex;
764
- gap: 8px;
765
- align-items: center;
766
- background: #0f0f12;
767
- border: 1px solid #3f3f46;
768
- border-radius: 6px;
769
- padding: 8px 10px;
770
- }
771
-
772
- .login-modal-url {
773
- color: #93c5fd;
774
- word-break: break-all;
775
- flex: 1;
776
- font-family: monospace;
777
- font-size: 12px;
778
- text-decoration: none;
779
- }
780
-
781
- .login-modal-url:hover {
782
- text-decoration: underline;
783
- }
784
-
785
- .login-modal-code {
786
- color: #fde047;
787
- font-family: monospace;
788
- font-size: 18px;
789
- font-weight: 700;
790
- letter-spacing: 0.1em;
791
- flex: 1;
792
- }
793
-
794
- .btn-copy {
795
- background: #27272a;
796
- border: 1px solid #3f3f46;
797
- color: #e4e4e7;
798
- padding: 4px 10px;
799
- border-radius: 4px;
800
- cursor: pointer;
801
- font-size: 11px;
802
- }
803
-
804
- .btn-copy:hover {
805
- background: #3f3f46;
806
- }
807
-
808
- .login-modal-status {
809
- margin-top: 16px;
810
- font-size: 12px;
811
- color: #a1a1aa;
812
- min-height: 18px;
813
- }
814
-
815
- .login-modal-status.success {
816
- color: #4ade80;
817
- }
818
-
819
- .login-modal-status.error {
820
- color: #fca5a5;
821
- }
822
-
823
- .login-modal-actions {
824
- margin-top: 16px;
825
- display: flex;
826
- justify-content: flex-end;
827
- }
@@ -17,7 +17,6 @@
17
17
  </select>
18
18
  <span id="mode-badge" class="mode-badge mode-mock">MOCK</span>
19
19
  <button id="mode-toggle" class="btn-icon btn-mode-toggle" title="Switch mode">Switch to Live</button>
20
- <button id="login-btn" class="btn-icon btn-login" title="Sign in to FIAS">Sign In</button>
21
20
  </div>
22
21
  <div class="toolbar-right">
23
22
  <button id="publish-btn" class="btn-publish" title="Publish plugin">Publish</button>
@@ -112,25 +111,6 @@
112
111
  </div>
113
112
  <div class="console-body" id="console-body"></div>
114
113
  </div>
115
- <div id="login-modal" class="login-modal hidden" role="dialog" aria-modal="true" aria-labelledby="login-modal-title">
116
- <div class="login-modal-card">
117
- <h2 id="login-modal-title">Sign in to FIAS</h2>
118
- <p class="login-modal-step"><strong>1.</strong> Open this URL in your browser:</p>
119
- <div class="login-modal-row">
120
- <a id="login-modal-url" class="login-modal-url" href="#" target="_blank" rel="noopener"></a>
121
- <button class="btn-copy" data-copy="url" title="Copy URL">Copy</button>
122
- </div>
123
- <p class="login-modal-step"><strong>2.</strong> Enter this code, then approve:</p>
124
- <div class="login-modal-row">
125
- <span id="login-modal-code" class="login-modal-code"></span>
126
- <button class="btn-copy" data-copy="code" title="Copy code">Copy</button>
127
- </div>
128
- <div class="login-modal-status" id="login-modal-status">Waiting for approval&hellip;</div>
129
- <div class="login-modal-actions">
130
- <button id="login-modal-cancel" class="btn-icon">Cancel</button>
131
- </div>
132
- </div>
133
- </div>
134
114
  <script src="/static/harness.js"></script>
135
115
  </body>
136
116
  </html>
@@ -1317,117 +1317,3 @@
1317
1317
  iframe.classList.add('hidden');
1318
1318
  }
1319
1319
  })();
1320
-
1321
- // Paste-code login flow. Self-contained IIFE — communicates with the harness
1322
- // server's /api/auth/cli-login/* endpoints, which mint a code, poll the
1323
- // configured FIAS environment for approval, and persist the returned API key
1324
- // as the harness's credentials.
1325
- (function () {
1326
- 'use strict';
1327
-
1328
- var loginBtn = document.getElementById('login-btn');
1329
- var modal = document.getElementById('login-modal');
1330
- var modalUrl = document.getElementById('login-modal-url');
1331
- var modalCode = document.getElementById('login-modal-code');
1332
- var modalStatus = document.getElementById('login-modal-status');
1333
- var cancelBtn = document.getElementById('login-modal-cancel');
1334
- if (!loginBtn || !modal) return;
1335
-
1336
- var pollHandle = null;
1337
- var pollAbort = null;
1338
- var currentCode = null;
1339
-
1340
- function setStatus(text, kind) {
1341
- modalStatus.textContent = text;
1342
- modalStatus.className = 'login-modal-status' + (kind ? ' ' + kind : '');
1343
- }
1344
-
1345
- function showModal(claimUrl, code) {
1346
- modalUrl.textContent = claimUrl;
1347
- modalUrl.href = claimUrl;
1348
- modalCode.textContent = code;
1349
- setStatus('Waiting for approval…');
1350
- modal.classList.remove('hidden');
1351
- }
1352
-
1353
- function stopPolling() {
1354
- if (pollHandle) { clearTimeout(pollHandle); pollHandle = null; }
1355
- if (pollAbort) { pollAbort.abort(); pollAbort = null; }
1356
- currentCode = null;
1357
- }
1358
-
1359
- function hideModal() {
1360
- modal.classList.add('hidden');
1361
- stopPolling();
1362
- }
1363
-
1364
- function startLogin() {
1365
- setStatus('Requesting code…');
1366
- modal.classList.remove('hidden');
1367
- fetch('/api/auth/cli-login/start', { method: 'POST' })
1368
- .then(function (r) {
1369
- if (!r.ok) return r.json().then(function (e) { throw new Error(e.error || 'Failed to start sign-in'); });
1370
- return r.json();
1371
- })
1372
- .then(function (d) {
1373
- currentCode = d.code.replace(/[\s-]/g, '').toUpperCase();
1374
- showModal(d.claimUrl, d.code);
1375
- var intervalMs = (d.pollIntervalSeconds || 2) * 1000;
1376
- pollOnce(intervalMs);
1377
- })
1378
- .catch(function (e) { setStatus(e.message, 'error'); });
1379
- }
1380
-
1381
- function pollOnce(intervalMs) {
1382
- if (!currentCode) return;
1383
- pollAbort = new AbortController();
1384
- fetch('/api/auth/cli-login/poll/' + encodeURIComponent(currentCode), { signal: pollAbort.signal })
1385
- .then(function (r) {
1386
- if (r.status === 410) return r.json().then(function () { throw new Error('Code expired. Click Sign In to start over.'); });
1387
- if (!r.ok) return r.json().then(function (e) { throw new Error(e.error || 'Sign-in poll failed'); });
1388
- return r.json();
1389
- })
1390
- .then(function (d) {
1391
- if (d.status === 'ready') {
1392
- setStatus('Signed in.', 'success');
1393
- loginBtn.textContent = 'Signed In';
1394
- loginBtn.classList.add('authed');
1395
- setTimeout(hideModal, 800);
1396
- return;
1397
- }
1398
- pollHandle = setTimeout(function () { pollOnce(intervalMs); }, intervalMs);
1399
- })
1400
- .catch(function (e) {
1401
- if (e.name === 'AbortError') return;
1402
- setStatus(e.message, 'error');
1403
- });
1404
- }
1405
-
1406
- loginBtn.addEventListener('click', startLogin);
1407
- cancelBtn.addEventListener('click', hideModal);
1408
- modal.addEventListener('click', function (ev) {
1409
- if (ev.target === modal) hideModal();
1410
- });
1411
-
1412
- var copyButtons = modal.querySelectorAll('.btn-copy');
1413
- copyButtons.forEach(function (btn) {
1414
- btn.addEventListener('click', function () {
1415
- var which = btn.getAttribute('data-copy');
1416
- var text = which === 'url' ? modalUrl.textContent : modalCode.textContent;
1417
- if (navigator.clipboard && navigator.clipboard.writeText) {
1418
- navigator.clipboard.writeText(text).then(function () {
1419
- var orig = btn.textContent;
1420
- btn.textContent = 'Copied!';
1421
- setTimeout(function () { btn.textContent = orig; }, 1500);
1422
- });
1423
- }
1424
- });
1425
- });
1426
-
1427
- fetch('/api/config').then(function (r) { return r.json(); }).then(function (c) {
1428
- if (c.hasCredentials) {
1429
- loginBtn.textContent = 'Signed In';
1430
- loginBtn.classList.add('authed');
1431
- }
1432
- }).catch(function () {});
1433
- })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fias/plugin-dev-harness",
3
- "version": "1.11.1",
3
+ "version": "1.12.0",
4
4
  "description": "Development harness for building and testing FIAS plugin arches locally",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",