nxt-highlightjs 22.0.0-alpha.0 → 22.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.
package/README.md CHANGED
@@ -1,64 +1,67 @@
1
- # Angular Highlight.js directives
2
-
3
- [![GitHub license](https://img.shields.io/github/license/Liquid-JS/nxt-components.svg)](https://github.com/Liquid-JS/nxt-components/blob/master/LICENSE)
4
- [![npm](https://img.shields.io/npm/dm/nxt-highlightjs.svg)](https://www.npmjs.com/package/nxt-highlightjs)
5
- [![scope](https://img.shields.io/npm/v/nxt-highlightjs.svg)](https://www.npmjs.com/package/nxt-highlightjs)
6
-
7
- Angular code highlighting directives with optional line numbers and support for SSR.
8
-
9
- ## Quick links
10
-
11
- - [Demo](https://liquid-js.github.io/nxt-components/demo/highlightjs)
12
- - [Getting started](https://liquid-js.github.io/nxt-components/demo/highlightjs/getting-started)
13
- - [Extras](https://liquid-js.github.io/nxt-components/demo/highlightjs/extras)
14
- - [API docs](https://liquid-js.github.io/nxt-components/nxt-highlightjs)
15
-
16
- ### Installing
17
-
18
- ```sh
19
- npm install --save nxt-highlightjs highlight.js
20
- ```
21
-
22
- ### Load and configure Highlight.js
23
-
24
- ```ts
25
- import { ApplicationConfig } from '@angular/core'
26
- import { provideHighlightOptions } from 'nxt-highlightjs'
27
-
28
- export const appConfig: ApplicationConfig = {
29
- providers: [
30
- provideHighlightOptions({
31
- fullLibraryLoader: () => import('highlight.js')
32
- })
33
- ]
34
- }
35
- ```
36
-
37
- Above code loads the entire Highlight.js library. To improve performance you might want to load only the core library and neccesary languages.
38
-
39
- ```ts
40
- import { ApplicationConfig } from '@angular/core'
41
- import { provideHighlightOptions } from 'nxt-highlightjs'
42
-
43
- export const appConfig: ApplicationConfig = {
44
- providers: [
45
- provideHighlightOptions({
46
- coreLibraryLoader: () => import('highlight.js/lib/core'),
47
- lineNumbersLoader: () => import('nxt-highlightjs/line-numbers'), // Optional, add line numbers if needed
48
- languages: {
49
- typescript: () => import('highlight.js/lib/languages/typescript'),
50
- css: () => import('highlight.js/lib/languages/css'),
51
- xml: () => import('highlight.js/lib/languages/xml')
52
- },
53
- themePath: 'path-to-theme.css' // Optional, useful for dynamic theme changes
54
- })
55
- ]
56
- }
57
- ```
58
-
59
- ### Use it in a template
60
-
61
- ```html
62
- <pre><code [nxtHighlight]="code"
63
- language="html"></code></pre>
64
- ```
1
+ # Angular Highlight.js directives
2
+
3
+ [![GitHub license](https://img.shields.io/github/license/Liquid-JS/nxt-components.svg)](https://github.com/Liquid-JS/nxt-components/blob/master/LICENSE)
4
+ [![npm](https://img.shields.io/npm/dm/nxt-highlightjs.svg)](https://www.npmjs.com/package/nxt-highlightjs)
5
+ [![scope](https://img.shields.io/npm/v/nxt-highlightjs.svg)](https://www.npmjs.com/package/nxt-highlightjs)
6
+
7
+ Angular code highlighting directives with optional line numbers and support for SSR.
8
+
9
+ ## Quick links
10
+
11
+ - [Demo](https://liquid-js.github.io/nxt-components/demo/highlightjs)
12
+ - [Getting started](https://liquid-js.github.io/nxt-components/demo/highlightjs/getting-started)
13
+ - [Extras](https://liquid-js.github.io/nxt-components/demo/highlightjs/extras)
14
+ - [API docs](https://liquid-js.github.io/nxt-components/nxt-highlightjs)
15
+
16
+ ### Installing
17
+
18
+ ```sh
19
+ npm install --save nxt-highlightjs highlight.js
20
+ ```
21
+
22
+ ### Load and configure Highlight.js
23
+
24
+ ```ts
25
+ import { ApplicationConfig } from '@angular/core'
26
+ import { provideHighlightOptions } from 'nxt-highlightjs'
27
+
28
+ export const appConfig: ApplicationConfig = {
29
+ providers: [
30
+ provideHighlightOptions({
31
+ fullLibraryLoader: () => import('highlight.js').then(r => r.default)
32
+ })
33
+ ]
34
+ }
35
+ ```
36
+
37
+ Above code loads the entire Highlight.js library. To improve performance you might want to load only the core library and neccesary languages.
38
+
39
+ ```ts
40
+ import { ApplicationConfig } from '@angular/core'
41
+ import { provideHighlightOptions } from 'nxt-highlightjs'
42
+
43
+ export const appConfig: ApplicationConfig = {
44
+ providers: [
45
+ provideHighlightOptions({
46
+ coreLibraryLoader: () => import('highlight.js/lib/core').then(r => r.default),
47
+ lineNumbersLoader: () => import('nxt-highlightjs/line-numbers'), // Optional, add line numbers if needed
48
+ languages: {
49
+ typescript: () => import('highlight.js/lib/languages/typescript').then(r => r.default),
50
+ css: () => import('highlight.js/lib/languages/css').then(r => r.default),
51
+ xml: () => import('highlight.js/lib/languages/xml').then(r => r.default)
52
+ },
53
+ themePath: 'path-to-theme.css' // Optional, useful for dynamic theme changes
54
+ })
55
+ ]
56
+ }
57
+ ```
58
+
59
+ ### Use it in a template
60
+
61
+ ```html
62
+ <pre><code [nxtHighlight]="code"
63
+ language="html"></code></pre>
64
+ ```
65
+
66
+ Until Highlight.js loads, and in a language that isn't loaded, the code shows as plain text. Code that's already
67
+ highlighted, e.g. by server-side rendering, stays as it is until Highlight.js loads, so hydration keeps it.
@@ -1,154 +1,154 @@
1
- import { APP_BASE_HREF } from '@angular/common';
2
- import * as i0 from '@angular/core';
3
- import { InjectionToken, inject, DOCUMENT, PendingTasks, Injectable, Pipe } from '@angular/core';
4
- import { HttpClient, HttpParams } from '@angular/common/http';
5
- import { Observable, shareReplay, EMPTY } from 'rxjs';
6
- import { rxResource } from '@angular/core/rxjs-interop';
7
-
8
- /**
9
- * Injection token used to provide the current location to `codeFromUrl` pipe.
10
- * Used to handle server-side rendering and to stub out during unit tests.
11
- */
12
- const NXT_HIGHLIGHT_FILE_LOCATION = new InjectionToken('NXT_HIGHLIGHT_FILE_LOCATION', {
13
- providedIn: 'root',
14
- factory: CODE_FILE_LOCATION_FACTORY
1
+ import { APP_BASE_HREF } from "@angular/common";
2
+ import * as i0 from "@angular/core";
3
+ import { DOCUMENT, Injectable, InjectionToken, PendingTasks, Pipe, inject } from "@angular/core";
4
+ import { HttpClient, HttpParams } from "@angular/common/http";
5
+ import { EMPTY, Observable, shareReplay } from "rxjs";
6
+ import { rxResource } from "@angular/core/rxjs-interop";
7
+ const NXT_HIGHLIGHT_FILE_LOCATION = new InjectionToken("NXT_HIGHLIGHT_FILE_LOCATION", {
8
+ providedIn: "root",
9
+ factory: CODE_FILE_LOCATION_FACTORY
15
10
  });
16
- /** @internal */
17
11
  function CODE_FILE_LOCATION_FACTORY() {
18
- const location = inject(DOCUMENT)?.location;
19
- const base = inject(APP_BASE_HREF, { optional: true })?.replace(/\/+$/igm, '');
20
- return {
21
- // Note that this needs to be a function, rather than a property, because Angular
22
- // will only resolve it once, but we want the current path on each call.
23
- // getPathname: () => (location ? location.pathname + location.search : ''),
24
- formatPathname: (path) => {
25
- const origin = (location ? location.origin : '').replace(/\/+$/igm, '');
26
- if (path.startsWith('/'))
27
- return origin + path;
28
- let prefix = base ?? origin;
29
- if (prefix)
30
- prefix += '/';
31
- return prefix + path;
32
- }
33
- };
12
+ const location = inject(DOCUMENT)?.location;
13
+ const base = inject(APP_BASE_HREF, { optional: true })?.replace(/\/+$/gim, "");
14
+ return { formatPathname: (path) => {
15
+ const origin = (location ? location.origin : "").replace(/\/+$/gim, "");
16
+ if (path.startsWith("/")) return origin + path;
17
+ let prefix = base ?? origin;
18
+ if (prefix) prefix += "/";
19
+ return prefix + path;
20
+ } };
34
21
  }
35
-
36
- /** @internal */
37
22
  function isUrl(url) {
38
- const regExp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!]))?/;
39
- return regExp.test(url);
23
+ return /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!]))?/.test(url);
40
24
  }
41
- /**
42
- * @internal
43
- */
44
- const NXT_GIST_OPTIONS = new InjectionToken('NXT_GIST_OPTIONS');
25
+ const NXT_GIST_OPTIONS = new InjectionToken("NXT_GIST_OPTIONS");
45
26
  function provideGistOptions(options) {
46
- return [
47
- {
48
- provide: NXT_GIST_OPTIONS,
49
- useValue: options
50
- }
51
- ];
52
- }
53
-
54
- /** @internal */
55
- class CodeLoader {
56
- constructor() {
57
- this.http = inject(HttpClient);
58
- this.options = inject(NXT_GIST_OPTIONS, { optional: true });
59
- this.pendingTasks = inject(PendingTasks);
60
- }
61
- fetchFile(url, options) {
62
- // Check if URL is valid
63
- if (isUrl(url)) {
64
- return this.http.get(url, options).pipe(obs => new Observable(sub => {
65
- const done = this.pendingTasks.add();
66
- const s = obs.subscribe({
67
- next: val => {
68
- sub.next(val);
69
- done();
70
- },
71
- error: err => {
72
- sub.error(err);
73
- console.log(err);
74
- done();
75
- },
76
- complete: () => sub.complete()
77
- });
78
- s.add(() => done());
79
- return s;
80
- }),
81
- // Catch response
82
- shareReplay(1));
83
- }
84
- return EMPTY;
85
- }
86
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: CodeLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
87
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: CodeLoader, providedIn: 'root' }); }
27
+ return [{
28
+ provide: NXT_GIST_OPTIONS,
29
+ useValue: options
30
+ }];
88
31
  }
89
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: CodeLoader, decorators: [{
90
- type: Injectable,
91
- args: [{
92
- providedIn: 'root'
93
- }]
94
- }] });
95
- /**
96
- * Code resource by URL
97
- *
98
- * @param url File raw link
99
- */
32
+ var CodeLoader = class CodeLoader {
33
+ constructor() {
34
+ this.http = inject(HttpClient);
35
+ this.options = inject(NXT_GIST_OPTIONS, { optional: true });
36
+ this.pendingTasks = inject(PendingTasks);
37
+ }
38
+ fetchFile(url, options) {
39
+ if (isUrl(url)) return this.http.get(url, options).pipe((obs) => new Observable((sub) => {
40
+ const done = this.pendingTasks.add();
41
+ const s = obs.subscribe({
42
+ next: (val) => {
43
+ sub.next(val);
44
+ done();
45
+ },
46
+ error: (err) => {
47
+ sub.error(err);
48
+ console.log(err);
49
+ done();
50
+ },
51
+ complete: () => sub.complete()
52
+ });
53
+ s.add(() => done());
54
+ return s;
55
+ }), shareReplay(1));
56
+ return EMPTY;
57
+ }
58
+ static {
59
+ this.ɵfac = i0.ɵɵngDeclareFactory({
60
+ minVersion: "12.0.0",
61
+ version: "22.2.5",
62
+ ngImport: i0,
63
+ type: CodeLoader,
64
+ deps: [],
65
+ target: i0.ɵɵFactoryTarget.Injectable
66
+ });
67
+ }
68
+ static {
69
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
70
+ minVersion: "12.0.0",
71
+ version: "22.2.5",
72
+ ngImport: i0,
73
+ type: CodeLoader,
74
+ providedIn: "root"
75
+ });
76
+ }
77
+ };
78
+ i0.ɵɵngDeclareClassMetadata({
79
+ minVersion: "12.0.0",
80
+ version: "22.2.5",
81
+ ngImport: i0,
82
+ type: CodeLoader,
83
+ decorators: [{
84
+ type: Injectable,
85
+ args: [{ providedIn: "root" }]
86
+ }]
87
+ });
100
88
  function fileResource(url, _options = {}) {
101
- const { formatUrl, ...options } = _options;
102
- const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader);
103
- const location = options?.injector ? options.injector.get(NXT_HIGHLIGHT_FILE_LOCATION) : inject(NXT_HIGHLIGHT_FILE_LOCATION);
104
- return rxResource({
105
- ...options,
106
- params: () => {
107
- const fileUrl = typeof url == 'string' ? url : url();
108
- return isUrl(fileUrl) ? fileUrl : location.formatPathname(fileUrl);
109
- },
110
- stream: ({ params: fileUrl }) => cl.fetchFile(fileUrl, { responseType: 'text' })
111
- });
89
+ const { formatUrl, ...options } = _options;
90
+ const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader);
91
+ const location = options?.injector ? options.injector.get(NXT_HIGHLIGHT_FILE_LOCATION) : inject(NXT_HIGHLIGHT_FILE_LOCATION);
92
+ return rxResource({
93
+ ...options,
94
+ params: () => {
95
+ const fileUrl = typeof url == "string" ? url : url();
96
+ return isUrl(fileUrl) ? fileUrl : location.formatPathname(fileUrl);
97
+ },
98
+ stream: ({ params: fileUrl }) => cl.fetchFile(fileUrl, { responseType: "text" })
99
+ });
112
100
  }
113
- /**
114
- * Gist resource by id
115
- *
116
- * @param id Gist ID
117
- */
118
101
  function gistResource(id, options) {
119
- const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader);
120
- return rxResource({
121
- ...options,
122
- params: () => typeof id == 'string' ? id : id(),
123
- stream: ({ params: gistId }) => {
124
- let params;
125
- if (cl.options?.clientId && cl.options?.clientSecret) {
126
- params = new HttpParams().set('client_id', cl.options.clientId).set('client_secret', cl.options.clientSecret);
127
- }
128
- return cl.fetchFile(`https://api.github.com/gists/${gistId}`, { params, responseType: 'json' });
129
- }
130
- });
102
+ const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader);
103
+ return rxResource({
104
+ ...options,
105
+ params: () => typeof id == "string" ? id : id(),
106
+ stream: ({ params: gistId }) => {
107
+ let params;
108
+ if (cl.options?.clientId && cl.options?.clientSecret) params = new HttpParams().set("client_id", cl.options.clientId).set("client_secret", cl.options.clientSecret);
109
+ return cl.fetchFile(`https://api.github.com/gists/${gistId}`, {
110
+ params,
111
+ responseType: "json"
112
+ });
113
+ }
114
+ });
131
115
  }
132
-
133
- class GistFilePipe {
134
- transform(gist, fileName) {
135
- if (!fileName)
136
- return;
137
- return gist?.files?.[fileName];
138
- }
139
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: GistFilePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
140
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.6", ngImport: i0, type: GistFilePipe, isStandalone: true, name: "gistFile" }); }
141
- }
142
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: GistFilePipe, decorators: [{
143
- type: Pipe,
144
- args: [{
145
- name: 'gistFile'
146
- }]
147
- }] });
148
-
149
- /**
150
- * Generated bundle index. Do not edit.
151
- */
152
-
116
+ var GistFilePipe = class GistFilePipe {
117
+ transform(gist, fileName) {
118
+ if (!fileName) return;
119
+ return gist?.files?.[fileName];
120
+ }
121
+ static {
122
+ this.ɵfac = i0.ɵɵngDeclareFactory({
123
+ minVersion: "12.0.0",
124
+ version: "22.2.5",
125
+ ngImport: i0,
126
+ type: GistFilePipe,
127
+ deps: [],
128
+ target: i0.ɵɵFactoryTarget.Pipe
129
+ });
130
+ }
131
+ static {
132
+ this.ɵpipe = i0.ɵɵngDeclarePipe({
133
+ minVersion: "14.0.0",
134
+ version: "22.2.5",
135
+ ngImport: i0,
136
+ type: GistFilePipe,
137
+ isStandalone: true,
138
+ name: "gistFile"
139
+ });
140
+ }
141
+ };
142
+ i0.ɵɵngDeclareClassMetadata({
143
+ minVersion: "12.0.0",
144
+ version: "22.2.5",
145
+ ngImport: i0,
146
+ type: GistFilePipe,
147
+ decorators: [{
148
+ type: Pipe,
149
+ args: [{ name: "gistFile" }]
150
+ }]
151
+ });
153
152
  export { CODE_FILE_LOCATION_FACTORY, CodeLoader, GistFilePipe, NXT_GIST_OPTIONS, NXT_HIGHLIGHT_FILE_LOCATION, fileResource, gistResource, isUrl, provideGistOptions };
154
- //# sourceMappingURL=nxt-highlightjs-extras.mjs.map
153
+
154
+ //# sourceMappingURL=nxt-highlightjs-extras.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"nxt-highlightjs-extras.mjs","sources":["../../../packages/highlightjs/extras/src/code-file-location.ts","../../../packages/highlightjs/extras/src/gist.model.ts","../../../packages/highlightjs/extras/src/code-loader.ts","../../../packages/highlightjs/extras/src/gist.ts","../../../packages/highlightjs/extras/src/nxt-highlightjs-extras.ts"],"sourcesContent":["import { APP_BASE_HREF } from '@angular/common'\r\nimport { inject, InjectionToken, DOCUMENT } from '@angular/core'\r\n\r\n/**\r\n * Injection token used to provide the current location to `codeFromUrl` pipe.\r\n * Used to handle server-side rendering and to stub out during unit tests.\r\n */\r\nexport const NXT_HIGHLIGHT_FILE_LOCATION = new InjectionToken<CodeFileLocation>('NXT_HIGHLIGHT_FILE_LOCATION', {\r\n providedIn: 'root',\r\n factory: CODE_FILE_LOCATION_FACTORY\r\n})\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface CodeFileLocation {\r\n formatPathname: (path: string) => string\r\n}\r\n\r\n/** @internal */\r\nexport function CODE_FILE_LOCATION_FACTORY() {\r\n const location = inject(DOCUMENT)?.location\r\n const base = inject(APP_BASE_HREF, { optional: true })?.replace(/\\/+$/igm, '')\r\n\r\n return {\r\n // Note that this needs to be a function, rather than a property, because Angular\r\n // will only resolve it once, but we want the current path on each call.\r\n // getPathname: () => (location ? location.pathname + location.search : ''),\r\n formatPathname: (path: string) => {\r\n const origin = (location ? location.origin : '').replace(/\\/+$/igm, '')\r\n if (path.startsWith('/'))\r\n return origin + path\r\n\r\n let prefix = base ?? origin\r\n if (prefix)\r\n prefix += '/'\r\n\r\n return prefix + path\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core'\r\n\r\n/** @internal */\r\nexport function isUrl(url: string): boolean {\r\n const regExp: RegExp = /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!]))?/\r\n return regExp.test(url)\r\n}\r\n\r\nexport interface GistOptions {\r\n clientId: string\r\n clientSecret: string\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport const NXT_GIST_OPTIONS = new InjectionToken<GistOptions>('NXT_GIST_OPTIONS')\r\n\r\nexport function provideGistOptions(options: GistOptions): Provider[] {\r\n return [\r\n {\r\n provide: NXT_GIST_OPTIONS,\r\n useValue: options\r\n }\r\n ]\r\n}\r\n\r\ninterface Owner {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface User {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface ChangeStatus {\r\n total: number\r\n additions: number\r\n deletions: number\r\n}\r\n\r\ninterface History {\r\n user: User\r\n version: string\r\n committed_at: Date\r\n change_status: ChangeStatus\r\n url: string\r\n}\r\n\r\nexport interface GistFile {\r\n filename: string\r\n type: string\r\n language: string\r\n raw_url: string\r\n size: number\r\n truncated: boolean\r\n content: string\r\n}\r\n\r\ninterface Files {\r\n [fileName: string]: GistFile\r\n}\r\n\r\nexport interface Gist {\r\n url: string\r\n forks_url: string\r\n commits_url: string\r\n id: string\r\n node_id: string\r\n git_pull_url: string\r\n git_push_url: string\r\n html_url: string\r\n files: Files\r\n public: boolean\r\n created_at: Date\r\n updated_at: Date\r\n description: string\r\n comments: number\r\n user?: any\r\n comments_url: string\r\n owner: Owner\r\n forks: any[]\r\n history: History[]\r\n truncated: boolean\r\n}\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http'\nimport { inject, Injectable, PendingTasks, Signal } from '@angular/core'\nimport { EMPTY, Observable, shareReplay } from 'rxjs'\nimport { rxResource, RxResourceOptions } from '@angular/core/rxjs-interop'\nimport { Gist, isUrl, NXT_GIST_OPTIONS } from './gist.model'\nimport { NXT_HIGHLIGHT_FILE_LOCATION } from './code-file-location'\n\n/** @internal */\n@Injectable({\n providedIn: 'root'\n})\nexport class CodeLoader {\n\n readonly http = inject(HttpClient)\n readonly options = inject(NXT_GIST_OPTIONS, { optional: true })\n private readonly pendingTasks = inject(PendingTasks)\n\n fetchFile(url: string, options: any): Observable<any> {\n // Check if URL is valid\n if (isUrl(url)) {\n return this.http.get(url, options).pipe(\n obs => new Observable(sub => {\n const done = this.pendingTasks.add()\n const s = obs.subscribe({\n next: val => {\n sub.next(val)\n done()\n },\n error: err => {\n sub.error(err)\n console.log(err)\n done()\n },\n complete: () => sub.complete()\n })\n s.add(() => done())\n return s\n }),\n // Catch response\n shareReplay(1)\n )\n }\n return EMPTY\n }\n\n}\n\n/**\n * Code resource by URL\n *\n * @param url File raw link\n */\nexport function fileResource(url: string | Signal<string>, _options: Omit<RxResourceOptions<string, string>, 'params' | 'stream'> & { formatUrl?: boolean } = {}) {\n const { formatUrl, ...options } = _options\n const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader)\n const location = options?.injector ? options.injector.get(NXT_HIGHLIGHT_FILE_LOCATION) : inject(NXT_HIGHLIGHT_FILE_LOCATION)\n\n return rxResource({\n ...options,\n params: () => {\n const fileUrl = typeof url == 'string' ? url : url()\n return isUrl(fileUrl) ? fileUrl : location.formatPathname(fileUrl)\n },\n stream: ({ params: fileUrl }) => cl.fetchFile(fileUrl, { responseType: 'text' })\n })\n}\n\n/**\n * Gist resource by id\n *\n * @param id Gist ID\n */\nexport function gistResource(id: string | Signal<string>, options?: Omit<RxResourceOptions<Gist, string>, 'params' | 'stream'>) {\n const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader)\n return rxResource({\n ...options,\n params: () => typeof id == 'string' ? id : id(),\n stream: ({ params: gistId }) => {\n let params: HttpParams | undefined\n if (cl.options?.clientId && cl.options?.clientSecret) {\n params = new HttpParams().set('client_id', cl.options.clientId).set('client_secret', cl.options.clientSecret)\n }\n return cl.fetchFile(`https://api.github.com/gists/${gistId}`, { params, responseType: 'json' })\n }\n })\n}\n","import { Pipe, PipeTransform } from '@angular/core'\nimport { Gist, GistFile } from './gist.model'\n\n@Pipe({\n name: 'gistFile'\n})\nexport class GistFilePipe implements PipeTransform {\n transform(gist?: Gist | null, fileName?: string | null): GistFile | undefined {\n if (!fileName)\n return\n return gist?.files?.[fileName]\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nxt-highlightjs-extras.mjs","names":[],"sources":["../../../packages/highlightjs/extras/src/code-file-location.ts","../../../packages/highlightjs/extras/src/gist.model.ts","../../../packages/highlightjs/extras/src/code-loader.ts","../../../packages/highlightjs/extras/src/gist.ts"],"sourcesContent":["import { APP_BASE_HREF } from '@angular/common'\r\nimport { inject, InjectionToken, DOCUMENT } from '@angular/core'\r\n\r\n/**\r\n * Injection token used to provide the current location to `codeFromUrl` pipe.\r\n * Used to handle server-side rendering and to stub out during unit tests.\r\n */\r\nexport const NXT_HIGHLIGHT_FILE_LOCATION = new InjectionToken<CodeFileLocation>('NXT_HIGHLIGHT_FILE_LOCATION', {\r\n providedIn: 'root',\r\n factory: CODE_FILE_LOCATION_FACTORY\r\n})\r\n\r\n/**\r\n * @internal\r\n */\r\nexport interface CodeFileLocation {\r\n formatPathname: (path: string) => string\r\n}\r\n\r\n/** @internal */\r\nexport function CODE_FILE_LOCATION_FACTORY() {\r\n const location = inject(DOCUMENT)?.location\r\n const base = inject(APP_BASE_HREF, { optional: true })?.replace(/\\/+$/igm, '')\r\n\r\n return {\r\n // Note that this needs to be a function, rather than a property, because Angular\r\n // will only resolve it once, but we want the current path on each call.\r\n // getPathname: () => (location ? location.pathname + location.search : ''),\r\n formatPathname: (path: string) => {\r\n const origin = (location ? location.origin : '').replace(/\\/+$/igm, '')\r\n if (path.startsWith('/'))\r\n return origin + path\r\n\r\n let prefix = base ?? origin\r\n if (prefix)\r\n prefix += '/'\r\n\r\n return prefix + path\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core'\r\n\r\n/** @internal */\r\nexport function isUrl(url: string): boolean {\r\n const regExp: RegExp = /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!]))?/\r\n return regExp.test(url)\r\n}\r\n\r\nexport interface GistOptions {\r\n clientId: string\r\n clientSecret: string\r\n}\r\n\r\n/**\r\n * @internal\r\n */\r\nexport const NXT_GIST_OPTIONS = new InjectionToken<GistOptions>('NXT_GIST_OPTIONS')\r\n\r\nexport function provideGistOptions(options: GistOptions): Provider[] {\r\n return [\r\n {\r\n provide: NXT_GIST_OPTIONS,\r\n useValue: options\r\n }\r\n ]\r\n}\r\n\r\ninterface Owner {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface User {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface ChangeStatus {\r\n total: number\r\n additions: number\r\n deletions: number\r\n}\r\n\r\ninterface History {\r\n user: User\r\n version: string\r\n committed_at: Date\r\n change_status: ChangeStatus\r\n url: string\r\n}\r\n\r\nexport interface GistFile {\r\n filename: string\r\n type: string\r\n language: string\r\n raw_url: string\r\n size: number\r\n truncated: boolean\r\n content: string\r\n}\r\n\r\ninterface Files {\r\n [fileName: string]: GistFile\r\n}\r\n\r\nexport interface Gist {\r\n url: string\r\n forks_url: string\r\n commits_url: string\r\n id: string\r\n node_id: string\r\n git_pull_url: string\r\n git_push_url: string\r\n html_url: string\r\n files: Files\r\n public: boolean\r\n created_at: Date\r\n updated_at: Date\r\n description: string\r\n comments: number\r\n user?: any\r\n comments_url: string\r\n owner: Owner\r\n forks: any[]\r\n history: History[]\r\n truncated: boolean\r\n}\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http'\nimport { inject, Injectable, PendingTasks, Signal } from '@angular/core'\nimport { EMPTY, Observable, shareReplay } from 'rxjs'\nimport { rxResource, RxResourceOptions } from '@angular/core/rxjs-interop'\nimport { Gist, isUrl, NXT_GIST_OPTIONS } from './gist.model'\nimport { NXT_HIGHLIGHT_FILE_LOCATION } from './code-file-location'\n\n/** @internal */\n@Injectable({\n providedIn: 'root'\n})\nexport class CodeLoader {\n\n readonly http = inject(HttpClient)\n readonly options = inject(NXT_GIST_OPTIONS, { optional: true })\n private readonly pendingTasks = inject(PendingTasks)\n\n fetchFile(url: string, options: any): Observable<any> {\n // Check if URL is valid\n if (isUrl(url)) {\n return this.http.get(url, options).pipe(\n obs => new Observable(sub => {\n const done = this.pendingTasks.add()\n const s = obs.subscribe({\n next: val => {\n sub.next(val)\n done()\n },\n error: err => {\n sub.error(err)\n console.log(err)\n done()\n },\n complete: () => sub.complete()\n })\n s.add(() => done())\n return s\n }),\n // Catch response\n shareReplay(1)\n )\n }\n return EMPTY\n }\n\n}\n\n/**\n * Code resource by URL\n *\n * @param url File raw link\n */\nexport function fileResource(url: string | Signal<string>, _options: Omit<RxResourceOptions<string, string>, 'params' | 'stream'> & { formatUrl?: boolean } = {}) {\n const { formatUrl, ...options } = _options\n const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader)\n const location = options?.injector ? options.injector.get(NXT_HIGHLIGHT_FILE_LOCATION) : inject(NXT_HIGHLIGHT_FILE_LOCATION)\n\n return rxResource({\n ...options,\n params: () => {\n const fileUrl = typeof url == 'string' ? url : url()\n return isUrl(fileUrl) ? fileUrl : location.formatPathname(fileUrl)\n },\n stream: ({ params: fileUrl }) => cl.fetchFile(fileUrl, { responseType: 'text' })\n })\n}\n\n/**\n * Gist resource by id\n *\n * @param id Gist ID\n */\nexport function gistResource(id: string | Signal<string>, options?: Omit<RxResourceOptions<Gist, string>, 'params' | 'stream'>) {\n const cl = options?.injector ? options.injector.get(CodeLoader) : inject(CodeLoader)\n return rxResource({\n ...options,\n params: () => typeof id == 'string' ? id : id(),\n stream: ({ params: gistId }) => {\n let params: HttpParams | undefined\n if (cl.options?.clientId && cl.options?.clientSecret) {\n params = new HttpParams().set('client_id', cl.options.clientId).set('client_secret', cl.options.clientSecret)\n }\n return cl.fetchFile(`https://api.github.com/gists/${gistId}`, { params, responseType: 'json' })\n }\n })\n}\n","import { Pipe, PipeTransform } from '@angular/core'\nimport { Gist, GistFile } from './gist.model'\n\n@Pipe({\n name: 'gistFile'\n})\nexport class GistFilePipe implements PipeTransform {\n transform(gist?: Gist | null, fileName?: string | null): GistFile | undefined {\n if (!fileName)\n return\n return gist?.files?.[fileName]\n }\n}\n"],"mappings":"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"}