Skip to content

Commit 1bc4c24

Browse files
committed
bump ordpool-parser to 9754454 + migrate test URLs to ordpool.space
Pulls in v2.1.2 of ordpool-parser: - Decode-failure sentinels (INVALID_COMPRESSED_DATA_MESSAGE, MAX_DECOMPRESSED_SIZE_MESSAGE) are now intercepted by the parser's preview pipeline. getPreview() returns a clean failure HTML page instead of leaking the sentinel string into <img>/<audio>/code-viewer outputs. getContentTypeInstructions() gains a 'decode-failure' return shape -- the existing default else branch in inscription-viewer.html routes it to <app-preview-viewer>, which calls getPreview() and renders the failure HTML. Zero frontend code changes needed. - The inscription parser is fault-tolerant when an inscription declares Content-Encoding: br on a body that isn't valid brotli (block 869,599 has one such tx, 5125c1...4634, mis-labeled gzip). Other change: every `// test here: http://localhost:...` URL comment across the digital-artifact viewer components and the backend's ordpool.routes.ts has been migrated to https://ordpool.space/... The runtime fallback in accelerate-checkout.component.ts (live code, not a comment) is left as-is.
1 parent 513402d commit 1bc4c24

13 files changed

Lines changed: 135 additions & 89 deletions

File tree

backend/package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
"express": "~4.22.1",
5353
"maxmind": "~4.3.11",
5454
"mysql2": "~3.20.0",
55-
"ordpool-parser": "github:ordpool-space/ordpool-parser#766800004ada38593b771fb671799891b521bcc8",
55+
"ordpool-parser": "github:ordpool-space/ordpool-parser#9754454ba80b9fcb8dc058b026eb4f8fc5ffca9a",
5656
"rust-gbt": "file:./rust-gbt",
5757
"redis": "^4.7.0",
5858
"socks-proxy-agent": "~7.0.0",

backend/src/api/explorer/_ordpool/ordpool.routes.ts

Lines changed: 68 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,79 @@ import { Application, Request, Response } from 'express';
22
import { InscriptionPreviewService, ParsedInscription, PreviewInstructions } from 'ordpool-parser';
33

44
import config from '../../../config';
5+
import OrdpoolMissingStats from '../../ordpool-missing-stats';
6+
import ordpoolSkippedBlocksRepository from '../../../repositories/OrdpoolSkippedBlocksRepository';
57
import ordpoolInscriptionsApi from './ordpool-inscriptions.api';
68
import { Aggregation, ChartType, Interval } from './ordpool-statistics-interface';
79
import ordpoolStatisticsApi from './ordpool-statistics.api';
810

11+
/** If the indexer hasn't recorded a per-block success in this many minutes,
12+
* the /internal/indexer-progress endpoint returns 503 and the heartbeat
13+
* script (deploy-happyserver/scripts/healthcheck-ping.sh) skips its OK ping,
14+
* triggering a Healthchecks.io grace-expiry alert. */
15+
const MAX_LAG_MINUTES = 30;
16+
917
class GeneralOrdpoolRoutes {
1018

1119
public initRoutes(app: Application): void {
1220
app
1321
.get(config.MEMPOOL.API_URL_PREFIX + 'ordpool/statistics/:type/:interval/:aggregation', this.$getOrdpoolStatistics)
22+
.get(config.MEMPOOL.API_URL_PREFIX + 'internal/indexer-progress', this.$getIndexerProgress)
1423
.get('/content/:inscriptionId', this.getInscriptionContent)
1524
.get('/preview/:inscriptionId', this.getInscriptionPreview);
1625
}
1726

27+
/**
28+
* Internal liveness endpoint. Returns 200 with the indexer's last-success
29+
* timestamp + skipped-block count when the indexer is making progress
30+
* (lag < MAX_LAG_MINUTES). Returns 503 when stale. Localhost-only — the
31+
* cloudflared tunnel forwards /api/v1/* but production access from the
32+
* outside is rejected here, since this endpoint exposes internal state.
33+
*/
34+
private async $getIndexerProgress(req: Request, res: Response): Promise<void> {
35+
const remote = req.ip || req.socket.remoteAddress || '';
36+
const isLocal = remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1';
37+
if (!isLocal) {
38+
res.status(403).send('Forbidden');
39+
return;
40+
}
41+
42+
try {
43+
const lastSuccessAt = OrdpoolMissingStats.getLastSuccessAt();
44+
const skippedCount = await ordpoolSkippedBlocksRepository.getSkippedCount();
45+
46+
const lagMs = lastSuccessAt === null ? null : Date.now() - lastSuccessAt.getTime();
47+
const lagMinutes = lagMs === null ? null : Math.round(lagMs / 60000);
48+
const fresh = lagMs !== null && lagMs <= MAX_LAG_MINUTES * 60 * 1000;
49+
50+
res.setHeader('Cache-Control', 'no-store');
51+
res.status(fresh ? 200 : 503).json({
52+
ok: fresh,
53+
lastSuccessAt: lastSuccessAt === null ? null : lastSuccessAt.toISOString(),
54+
lagMinutes,
55+
maxLagMinutes: MAX_LAG_MINUTES,
56+
skippedCount,
57+
});
58+
} catch (e) {
59+
res.status(500).send(e instanceof Error ? e.message : String(e));
60+
}
61+
}
62+
1863
// '1h' | 2h | '24h | '3d' | '1w' | '1m' | '3m' | '6m' | '1y' | '2y' | '3y' | '4y'
1964
// 'block' | 'hour' | 'day'
2065

2166
// HACK -- Ordpool Stats
22-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/24h/block
23-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/3d/block
24-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/1y/block
67+
// https://ordpool.space/api/v1/ordpool/statistics/mints/24h/block
68+
// https://ordpool.space/api/v1/ordpool/statistics/mints/3d/block
69+
// https://ordpool.space/api/v1/ordpool/statistics/mints/1y/block
2570
//
26-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/24h/hour
27-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/3d/hour
28-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/1y/hour
71+
// https://ordpool.space/api/v1/ordpool/statistics/mints/24h/hour
72+
// https://ordpool.space/api/v1/ordpool/statistics/mints/3d/hour
73+
// https://ordpool.space/api/v1/ordpool/statistics/mints/1y/hour
2974
//
30-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/24h/day
31-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/3d/day
32-
// http://127.0.0.1:8999/api/v1/ordpool/statistics/mints/1y/day
75+
// https://ordpool.space/api/v1/ordpool/statistics/mints/24h/day
76+
// https://ordpool.space/api/v1/ordpool/statistics/mints/3d/day
77+
// https://ordpool.space/api/v1/ordpool/statistics/mints/1y/day
3378
private async $getOrdpoolStatistics(req: Request, res: Response): Promise<void> {
3479
try {
3580

@@ -49,9 +94,9 @@ class GeneralOrdpoolRoutes {
4994
}
5095

5196
// Test cases
52-
// SVG with gzip: http://127.0.0.1:8999/content/4c83f2e1d12d6f71e9f69159aff48f7946ce04c5ffcc3a3feee4080bac343722i0
53-
// Delegate: http://127.0.0.1:8999/content/6b6f65ba4bc2cbb8cec1e1ca5e1d426e442a05729cdbac6009cca185f7d95babi0
54-
// Complex SVG with JavaScript (only works when rendered server-side): http://127.0.0.1:8999/content/77709919918d38c8a89761e3cd300d22ef312948044217327f54e62cc01b47a0i0
97+
// SVG with gzip: https://ordpool.space/content/4c83f2e1d12d6f71e9f69159aff48f7946ce04c5ffcc3a3feee4080bac343722i0
98+
// Delegate: https://ordpool.space/content/6b6f65ba4bc2cbb8cec1e1ca5e1d426e442a05729cdbac6009cca185f7d95babi0
99+
// Complex SVG with JavaScript (only works when rendered server-side): https://ordpool.space/content/77709919918d38c8a89761e3cd300d22ef312948044217327f54e62cc01b47a0i0
55100
private async getInscriptionContent(req: Request, res: Response): Promise<void> {
56101
const inscriptionId = req.params.inscriptionId;
57102

@@ -77,17 +122,17 @@ class GeneralOrdpoolRoutes {
77122
}
78123

79124
// Test cases
80-
// Direct Render (Iframe mode): http://localhost:8999/preview/751007cf3090703f241894af5c057fc8850d650a577a800447d4f21f5d2cecdei0
81-
// Audio: http://localhost:8999/preview/ad99172fce60028406f62725b91b5c508edd95bf21310de5afeb0966ddd89be3i0
82-
// Image: http://localhost:8999/preview/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0
83-
// Markdown: http://localhost:8999/preview/c133c03e2ed44bb8ada79b1640b6649129de75a8f31d8e6ad573ede442f91cdbi0
84-
// Model: http://localhost:8999/preview/25013a3ab212e0ca5b3ccbd858ff988f506b77080c51963c948c055028af2051i0
85-
// Pdf: http://localhost:8999/preview/85b10531435304cbe47d268106b58b57a4416c76573d4b50fa544432597ad670i0i0
86-
// Pure Text: http://localhost:8999/preview/430901147831e41111aced3895ee4b9742cf72ac3cffa132624bd38c551ef379i0
87-
// Text, but JSON: http://localhost:8999/preview/b84deb50dcee499351e62bbbdcc9b306f8ac36aefc3fc1f1c5ede2bfa7164501i0
88-
// Text, but CODE: http://localhost:8999/preview/6dc2c16a74dedcae46300b2058ebadc7ca78aea78236459662375c8d7d9804dbi0
89-
// Unknown: http://localhost:8999/preview/06158001c0be9d375c10a56266d8028b80ebe1ef5e2a9c9a4904dbe31b72e01ci0
90-
// Video: http://localhost:8999/preview/700f348e1acef6021cdee8bf09e4183d6a3f4d573b4dc5585defd54009a0148ci0
125+
// Direct Render (Iframe mode): https://ordpool.space/preview/751007cf3090703f241894af5c057fc8850d650a577a800447d4f21f5d2cecdei0
126+
// Audio: https://ordpool.space/preview/ad99172fce60028406f62725b91b5c508edd95bf21310de5afeb0966ddd89be3i0
127+
// Image: https://ordpool.space/preview/6fb976ab49dcec017f1e201e84395983204ae1a7c2abf7ced0a85d692e442799i0
128+
// Markdown: https://ordpool.space/preview/c133c03e2ed44bb8ada79b1640b6649129de75a8f31d8e6ad573ede442f91cdbi0
129+
// Model: https://ordpool.space/preview/25013a3ab212e0ca5b3ccbd858ff988f506b77080c51963c948c055028af2051i0
130+
// Pdf: https://ordpool.space/preview/85b10531435304cbe47d268106b58b57a4416c76573d4b50fa544432597ad670i0i0
131+
// Pure Text: https://ordpool.space/preview/430901147831e41111aced3895ee4b9742cf72ac3cffa132624bd38c551ef379i0
132+
// Text, but JSON: https://ordpool.space/preview/b84deb50dcee499351e62bbbdcc9b306f8ac36aefc3fc1f1c5ede2bfa7164501i0
133+
// Text, but CODE: https://ordpool.space/preview/6dc2c16a74dedcae46300b2058ebadc7ca78aea78236459662375c8d7d9804dbi0
134+
// Unknown: https://ordpool.space/preview/06158001c0be9d375c10a56266d8028b80ebe1ef5e2a9c9a4904dbe31b72e01ci0
135+
// Video: https://ordpool.space/preview/700f348e1acef6021cdee8bf09e4183d6a3f4d573b4dc5585defd54009a0148ci0
91136
private async getInscriptionPreview(req: Request, res: Response): Promise<void> {
92137
const inscriptionId = req.params.inscriptionId;
93138

frontend/package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@
9090
"ngx-echarts": "~20.0.2",
9191
"ngx-highlightjs": "^10.0.0",
9292
"ngx-infinite-scroll": "^20.0.0",
93-
"ordpool-parser": "github:ordpool-space/ordpool-parser#766800004ada38593b771fb671799891b521bcc8",
93+
"ordpool-parser": "github:ordpool-space/ordpool-parser#9754454ba80b9fcb8dc058b026eb4f8fc5ffca9a",
9494
"qrcode": "1.5.1",
9595
"rxjs": "~7.8.1",
9696
"sats-connect": "^1.1.2",

frontend/src/app/components/_ordpool/digital-artifact-viewer/atomical-viewer/atomical-viewer.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ParsedAtomical } from 'ordpool-parser';
33

44
/**
55
* Test cases:
6-
* http://localhost:4200/tx/1d2f39f54320631d0432fa495a45a4f298a2ca1b18adef8e4356e327d003a694 (etching Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z)
6+
* https://ordpool.space/tx/1d2f39f54320631d0432fa495a45a4f298a2ca1b18adef8e4356e327d003a694 (etching Z•Z•Z•Z•Z•FEHU•Z•Z•Z•Z•Z)
77
*/
88
@Component({
99
selector: 'app-atomical-viewer',

frontend/src/app/components/_ordpool/digital-artifact-viewer/cat21-viewer/cat21-viewer.component.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,26 @@ import { environment } from 'src/environments/environment';
44

55
/**
66
* Test cases:
7-
* http://localhost:4200/tx/98316dcb21daaa221865208fe0323616ee6dd84e6020b78bc6908e914ac03892
8-
* http://localhost:4200/tx/90dcf7825be098d1700014f15c6e4b5f99371d61cc7fc40cd5c3ae9228c64290
9-
* http://localhost:4200/tx/4130bd5520fff85dd98aeb8a3e03895062afb2cfd5215f878a9df835b261980e
10-
* http://localhost:4200/tx/76448f79c6c90281ec4d15f3a027c48d3a1f72e9de20f4ca3461932384866513
11-
* http://localhost:4200/tx/499e011170e99189b2fb43bf3de790d10a7ff4c6c855bc9f7986e0db82a19c67
12-
* http://localhost:4200/tx/7fd952b2723eccdff0f0169931ed7fcf7d7a58581e6affc9209d30060f224a65
13-
* http://localhost:4200/tx/5ee1320ff65acbe01cb5074ec89deca1220dc30a29c672a6b97a2936b2613f4c
14-
* http://localhost:4200/tx/917320c3a6a92f0c30e1876c164a1b06f57aae8be3c37aff74d8ec1f1a7da240
15-
* http://localhost:4200/tx/d2dd3b67658416b27657fdb72d9a19021c1ebe3f797bf659182190c566ee4e57
16-
* http://localhost:4200/tx/eccac793d22d66a14c3fd6cd5adf5002d1347b503d3fe5171178bd4edf4cf57d
17-
* http://localhost:4200/tx/dc0628339faf50149bc7fffbb25544328fabc10ee16ac7326e1754f08025d7ca
18-
* http://localhost:4200/tx/2a6514a04d7b3ea839f177b6aec9418c24262629d885f09fdd83420853c2d7cc
19-
* http://localhost:4200/tx/5a68ffaea166743b41f8ad02bbb77933e1b29729b338098280574cd7482de87c
20-
* http://localhost:4200/tx/8145338a41e2b8c8b275f38aa7b5b669f4d22ddf1b627f2632a157fb906104a0
21-
* http://localhost:4200/tx/bab0ca815cc56a281ff510067984f38236f533e9100d737a9fd28bd12521ac6f
22-
* http://localhost:4200/tx/6d895bcdb8af42669305f3360b35c403b35064ed7ff3e6845983016adb29af01
23-
* http://localhost:4200/tx/e8b98486b151fcc4570dbd526f6ef50d5c194e54e248592d04bb092d5c08c430
7+
* https://ordpool.space/tx/98316dcb21daaa221865208fe0323616ee6dd84e6020b78bc6908e914ac03892
8+
* https://ordpool.space/tx/90dcf7825be098d1700014f15c6e4b5f99371d61cc7fc40cd5c3ae9228c64290
9+
* https://ordpool.space/tx/4130bd5520fff85dd98aeb8a3e03895062afb2cfd5215f878a9df835b261980e
10+
* https://ordpool.space/tx/76448f79c6c90281ec4d15f3a027c48d3a1f72e9de20f4ca3461932384866513
11+
* https://ordpool.space/tx/499e011170e99189b2fb43bf3de790d10a7ff4c6c855bc9f7986e0db82a19c67
12+
* https://ordpool.space/tx/7fd952b2723eccdff0f0169931ed7fcf7d7a58581e6affc9209d30060f224a65
13+
* https://ordpool.space/tx/5ee1320ff65acbe01cb5074ec89deca1220dc30a29c672a6b97a2936b2613f4c
14+
* https://ordpool.space/tx/917320c3a6a92f0c30e1876c164a1b06f57aae8be3c37aff74d8ec1f1a7da240
15+
* https://ordpool.space/tx/d2dd3b67658416b27657fdb72d9a19021c1ebe3f797bf659182190c566ee4e57
16+
* https://ordpool.space/tx/eccac793d22d66a14c3fd6cd5adf5002d1347b503d3fe5171178bd4edf4cf57d
17+
* https://ordpool.space/tx/dc0628339faf50149bc7fffbb25544328fabc10ee16ac7326e1754f08025d7ca
18+
* https://ordpool.space/tx/2a6514a04d7b3ea839f177b6aec9418c24262629d885f09fdd83420853c2d7cc
19+
* https://ordpool.space/tx/5a68ffaea166743b41f8ad02bbb77933e1b29729b338098280574cd7482de87c
20+
* https://ordpool.space/tx/8145338a41e2b8c8b275f38aa7b5b669f4d22ddf1b627f2632a157fb906104a0
21+
* https://ordpool.space/tx/bab0ca815cc56a281ff510067984f38236f533e9100d737a9fd28bd12521ac6f
22+
* https://ordpool.space/tx/6d895bcdb8af42669305f3360b35c403b35064ed7ff3e6845983016adb29af01
23+
* https://ordpool.space/tx/e8b98486b151fcc4570dbd526f6ef50d5c194e54e248592d04bb092d5c08c430
2424
*
2525
* A large cat:
26-
* http://localhost:4200/tx/b0d6d810f4b3a6c6f92c2d5f502877f30a7a343f8f937a41985ea1db8bf82f14
26+
* https://ordpool.space/tx/b0d6d810f4b3a6c6f92c2d5f502877f30a7a343f8f937a41985ea1db8bf82f14
2727
*
2828
*/
2929
@Component({

frontend/src/app/components/_ordpool/digital-artifact-viewer/code-viewer/code-viewer.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ export class CodeViewerComponent {
3030
constructor(private cd: ChangeDetectorRef) { }
3131

3232

33-
// css: http://localhost:4200/tx/73eb12c506adaf02e219229b1c800ea1caa70c86a981e8fdb9e231237957224fi0
34-
// js: http://localhost:4200/tx/6dc2c16a74dedcae46300b2058ebadc7ca78aea78236459662375c8d7d9804db
33+
// css: https://ordpool.space/tx/73eb12c506adaf02e219229b1c800ea1caa70c86a981e8fdb9e231237957224fi0
34+
// js: https://ordpool.space/tx/6dc2c16a74dedcae46300b2058ebadc7ca78aea78236459662375c8d7d9804db
3535
formatWithPrettier(source: string, contentType: string ) {
3636

3737
let parser = '';

frontend/src/app/components/_ordpool/digital-artifact-viewer/inscription-viewer/inscription-viewer.component.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import { ElectrsApiService } from '../../../../services/electrs-api.service';
77
/*
88
More test cases:
99
10-
- Batch inscription with pointer: http://localhost:4200/tx/11d3f4b39e8ab97995bab1eacf7dcbf1345ec59c07261c0197e18bf29b88d8da
11-
- Inscriptions on multiple inputs: http://localhost:4200/tx/092111e882a8025f3f05ab791982e8cc7fd7395afe849a5949fd56255b5c41cc
12-
- Content with brotli encoding: http://localhost:4200/tx/6dc2c16a74dedcae46300b2058ebadc7ca78aea78236459662375c8d7d9804db
13-
- Content with gzip encoding: http://localhost:4200/tx/2c0c49fc122d223b7178a74064e59ffaa2db7ce7e541ef5c1a9188064f2f24ab
14-
- Metadata and Metaprotocol: http://localhost:4200/tx/49cbc5cbac92cf917dd4539d62720a3e528d17e22ef5fc47070a17ec0d3cf307
15-
- Multiple Parents: http://localhost:4200/tx/f988fe4b414a3f3d4a815dd1b1675dea0ba6140b1d698d8970273c781fb95746
16-
- Delegatation (basic support): http://localhost:4200/tx/6b6f65ba4bc2cbb8cec1e1ca5e1d426e442a05729cdbac6009cca185f7d95bab
17-
- Complex SVG: http://localhost:4200/tx/77709919918d38c8a89761e3cd300d22ef312948044217327f54e62cc01b47a0
10+
- Batch inscription with pointer: https://ordpool.space/tx/11d3f4b39e8ab97995bab1eacf7dcbf1345ec59c07261c0197e18bf29b88d8da
11+
- Inscriptions on multiple inputs: https://ordpool.space/tx/092111e882a8025f3f05ab791982e8cc7fd7395afe849a5949fd56255b5c41cc
12+
- Content with brotli encoding: https://ordpool.space/tx/6dc2c16a74dedcae46300b2058ebadc7ca78aea78236459662375c8d7d9804db
13+
- Content with gzip encoding: https://ordpool.space/tx/2c0c49fc122d223b7178a74064e59ffaa2db7ce7e541ef5c1a9188064f2f24ab
14+
- Metadata and Metaprotocol: https://ordpool.space/tx/49cbc5cbac92cf917dd4539d62720a3e528d17e22ef5fc47070a17ec0d3cf307
15+
- Multiple Parents: https://ordpool.space/tx/f988fe4b414a3f3d4a815dd1b1675dea0ba6140b1d698d8970273c781fb95746
16+
- Delegatation (basic support): https://ordpool.space/tx/6b6f65ba4bc2cbb8cec1e1ca5e1d426e442a05729cdbac6009cca185f7d95bab
17+
- Complex SVG: https://ordpool.space/tx/77709919918d38c8a89761e3cd300d22ef312948044217327f54e62cc01b47a0
18+
- Decode failure (Content-Encoding: br on a gzip body, block 869,599): https://ordpool.space/tx/5125c1269bd9c4605764fe76d253078d4c35897646004b8fa9837ad41e94a634
1819
*/
1920

2021
@Component({

frontend/src/app/components/_ordpool/digital-artifact-viewer/json-viewer/json-viewer.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
22
import { formatJSON } from 'ordpool-parser';
33

4-
// json: http://localhost:4200/tx/49cbc5cbac92cf917dd4539d62720a3e528d17e22ef5fc47070a17ec0d3cf307
4+
// json: https://ordpool.space/tx/49cbc5cbac92cf917dd4539d62720a3e528d17e22ef5fc47070a17ec0d3cf307
55
@Component({
66
selector: 'app-json-viewer',
77
templateUrl: './json-viewer.component.html',

0 commit comments

Comments
 (0)