@analogjs/platform 3.0.0-alpha.88 → 3.0.0-alpha.89

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 (31) hide show
  1. package/package.json +2 -2
  2. package/src/lib/content/marked/marked-setup.service.js +7 -5
  3. package/src/lib/content/marked/marked-setup.service.js.map +1 -1
  4. package/src/lib/content/shiki/shiki-highlighter.js +2 -4
  5. package/src/lib/content/shiki/shiki-highlighter.js.map +1 -1
  6. package/src/lib/content/utils/escape-html.d.ts +7 -0
  7. package/src/lib/content/utils/escape-html.js +16 -0
  8. package/src/lib/content/utils/escape-html.js.map +1 -0
  9. package/src/lib/nx-plugin/src/generators/app/files/template-angular/vite.config.ts__template__ +1 -1
  10. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v17/vite.config.ts__template__ +1 -1
  11. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v18/vite.config.ts__template__ +1 -1
  12. package/src/lib/nx-plugin/src/generators/app/files/template-angular-v19/vite.config.ts__template__ +1 -1
  13. package/src/lib/nx-plugin/src/generators/app/generator.js +4 -0
  14. package/src/lib/nx-plugin/src/generators/app/generator.js.map +1 -1
  15. package/src/lib/nx-plugin/src/generators/app/lib/add-angular-app.js +4 -9
  16. package/src/lib/nx-plugin/src/generators/app/lib/add-angular-app.js.map +1 -1
  17. package/src/lib/nx-plugin/src/generators/app/schema.d.ts +1 -0
  18. package/src/lib/nx-plugin/src/generators/app/schema.json +6 -0
  19. package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.d.ts +2 -0
  20. package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js +4 -0
  21. package/src/lib/nx-plugin/src/generators/app/versions/minimum-supported-versions.js.map +1 -1
  22. package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.d.ts +5 -5
  23. package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js.map +1 -1
  24. package/src/lib/nx-plugin/src/generators/preset/__snapshots__/generator.spec.ts.snap +2 -1
  25. package/src/lib/nx-plugin/src/generators/preset/generator.js +5 -1
  26. package/src/lib/nx-plugin/src/generators/preset/generator.js.map +1 -1
  27. package/src/lib/nx-plugin/src/generators/preset/schema.d.ts +1 -0
  28. package/src/lib/nx-plugin/src/generators/preset/schema.json +6 -0
  29. package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.d.ts +5 -5
  30. package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js +5 -5
  31. package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/platform",
3
- "version": "3.0.0-alpha.88",
3
+ "version": "3.0.0-alpha.89",
4
4
  "description": "The fullstack meta-framework for Angular",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -31,7 +31,7 @@
31
31
  "url": "https://github.com/sponsors/brandonroberts"
32
32
  },
33
33
  "dependencies": {
34
- "@analogjs/vite-plugin-angular": "3.0.0-alpha.88",
34
+ "@analogjs/vite-plugin-angular": "3.0.0-alpha.89",
35
35
  "es-toolkit": "^1.45.1",
36
36
  "front-matter": "^4.0.2",
37
37
  "h3": "^2.0.1-rc.31",
@@ -1,3 +1,4 @@
1
+ import { escapeHtml, sanitizeLanguage } from "../utils/escape-html.js";
1
2
  import { marked } from "marked";
2
3
  import { gfmHeadingId } from "marked-gfm-heading-id";
3
4
  import { mangle } from "marked-mangle";
@@ -13,13 +14,14 @@ var MarkedSetupService = class {
13
14
  breaks: false,
14
15
  renderer: {
15
16
  code({ text, lang }) {
16
- if (lang === "mermaid") return "<pre class=\"mermaid\">" + text + "</pre>";
17
- if (!lang) return "<pre><code>" + text + "</code></pre>";
18
- if (highlighter?.augmentCodeBlock) return highlighter?.augmentCodeBlock(text, lang);
19
- return `<pre class="language-${lang}"><code class="language-${lang}">${text}</code></pre>`;
17
+ const language = sanitizeLanguage(lang);
18
+ if (language === "mermaid") return "<pre class=\"mermaid\">" + escapeHtml(text) + "</pre>";
19
+ if (!language) return "<pre><code>" + escapeHtml(text) + "</code></pre>";
20
+ if (highlighter?.augmentCodeBlock) return highlighter?.augmentCodeBlock(text, language);
21
+ return `<pre class="language-${language}"><code class="language-${language}">${escapeHtml(text)}</code></pre>`;
20
22
  },
21
23
  codespan({ text }) {
22
- return `<code>${text}</code>`;
24
+ return `<code>${escapeHtml(text)}</code>`;
23
25
  },
24
26
  paragraph({ tokens }) {
25
27
  return `<p>${this.parser.parseInline(tokens)}</p>`;
@@ -1 +1 @@
1
- {"version":3,"file":"marked-setup.service.js","names":[],"sources":["../../../../../src/lib/content/marked/marked-setup.service.ts"],"sourcesContent":["import { marked, Parser, MarkedExtension } from 'marked';\nimport { gfmHeadingId } from 'marked-gfm-heading-id';\nimport { mangle } from 'marked-mangle';\n\nimport { MarkedContentHighlighter } from './marked-content-highlighter.js';\nimport { WithMarkedOptions } from './index.js';\n\nexport class MarkedSetupService {\n private readonly marked: typeof marked;\n\n constructor(\n private readonly options?: WithMarkedOptions | undefined,\n private readonly highlighter?: MarkedContentHighlighter | undefined,\n ) {\n const analogMarkedExtension: MarkedExtension = {\n pedantic: false,\n gfm: true,\n breaks: false,\n renderer: {\n code({ text, lang }) {\n // Let's do a language based detection like on GitHub\n // So we can still have non-interpreted mermaid code\n if (lang === 'mermaid') {\n return '<pre class=\"mermaid\">' + text + '</pre>';\n }\n\n if (!lang) {\n return '<pre><code>' + text + '</code></pre>';\n }\n\n if (highlighter?.augmentCodeBlock) {\n return highlighter?.augmentCodeBlock(text, lang);\n }\n\n return `<pre class=\"language-${lang}\"><code class=\"language-${lang}\">${text}</code></pre>`;\n },\n codespan({ text }) {\n return `<code>${text}</code>`;\n },\n paragraph({ tokens }) {\n const text = this.parser.parseInline(tokens);\n return `<p>${text}</p>`;\n },\n },\n };\n\n const extensions = [\n analogMarkedExtension,\n gfmHeadingId(),\n ...(options?.extensions || []),\n ];\n\n if (this.options?.mangle) {\n extensions.push(mangle());\n }\n\n if (this.highlighter) {\n extensions.push(this.highlighter.getHighlightExtension());\n }\n\n marked.use(...extensions);\n\n this.marked = marked;\n }\n\n getMarkedInstance(): typeof marked {\n return this.marked;\n }\n}\n"],"mappings":";;;;AAOA,IAAa,qBAAb,MAAgC;CAG9B,YACE,SACA,aACA;AAFiB,OAAA,UAAA;AACA,OAAA,cAAA;EAkCjB,MAAM,aAAa;GAhC4B;IAC7C,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;KACR,KAAK,EAAE,MAAM,QAAQ;AAGnB,UAAI,SAAS,UACX,QAAO,4BAA0B,OAAO;AAG1C,UAAI,CAAC,KACH,QAAO,gBAAgB,OAAO;AAGhC,UAAI,aAAa,iBACf,QAAO,aAAa,iBAAiB,MAAM,KAAK;AAGlD,aAAO,wBAAwB,KAAK,0BAA0B,KAAK,IAAI,KAAK;;KAE9E,SAAS,EAAE,QAAQ;AACjB,aAAO,SAAS,KAAK;;KAEvB,UAAU,EAAE,UAAU;AAEpB,aAAO,MADM,KAAK,OAAO,YAAY,OAAO,CAC1B;;KAErB;IACF;GAIC,cAAc;GACd,GAAI,SAAS,cAAc,EAAE;GAC9B;AAED,MAAI,KAAK,SAAS,OAChB,YAAW,KAAK,QAAQ,CAAC;AAG3B,MAAI,KAAK,YACP,YAAW,KAAK,KAAK,YAAY,uBAAuB,CAAC;AAG3D,SAAO,IAAI,GAAG,WAAW;AAEzB,OAAK,SAAS;;CAGhB,oBAAmC;AACjC,SAAO,KAAK"}
1
+ {"version":3,"file":"marked-setup.service.js","names":[],"sources":["../../../../../src/lib/content/marked/marked-setup.service.ts"],"sourcesContent":["import { marked, Parser, MarkedExtension } from 'marked';\nimport { gfmHeadingId } from 'marked-gfm-heading-id';\nimport { mangle } from 'marked-mangle';\n\nimport { MarkedContentHighlighter } from './marked-content-highlighter.js';\nimport { WithMarkedOptions } from './index.js';\nimport { escapeHtml, sanitizeLanguage } from '../utils/escape-html.js';\n\nexport class MarkedSetupService {\n private readonly marked: typeof marked;\n\n constructor(\n private readonly options?: WithMarkedOptions | undefined,\n private readonly highlighter?: MarkedContentHighlighter | undefined,\n ) {\n const analogMarkedExtension: MarkedExtension = {\n pedantic: false,\n gfm: true,\n breaks: false,\n renderer: {\n code({ text, lang }) {\n // Let's do a language based detection like on GitHub\n // So we can still have non-interpreted mermaid code\n const language = sanitizeLanguage(lang);\n if (language === 'mermaid') {\n return '<pre class=\"mermaid\">' + escapeHtml(text) + '</pre>';\n }\n\n if (!language) {\n return '<pre><code>' + escapeHtml(text) + '</code></pre>';\n }\n\n if (highlighter?.augmentCodeBlock) {\n return highlighter?.augmentCodeBlock(text, language);\n }\n\n return `<pre class=\"language-${language}\"><code class=\"language-${language}\">${escapeHtml(text)}</code></pre>`;\n },\n codespan({ text }) {\n return `<code>${escapeHtml(text)}</code>`;\n },\n paragraph({ tokens }) {\n const text = this.parser.parseInline(tokens);\n return `<p>${text}</p>`;\n },\n },\n };\n\n const extensions = [\n analogMarkedExtension,\n gfmHeadingId(),\n ...(options?.extensions || []),\n ];\n\n if (this.options?.mangle) {\n extensions.push(mangle());\n }\n\n if (this.highlighter) {\n extensions.push(this.highlighter.getHighlightExtension());\n }\n\n marked.use(...extensions);\n\n this.marked = marked;\n }\n\n getMarkedInstance(): typeof marked {\n return this.marked;\n }\n}\n"],"mappings":";;;;;AAQA,IAAa,qBAAb,MAAgC;CAG9B,YACE,SACA,aACA;AAFiB,OAAA,UAAA;AACA,OAAA,cAAA;EAmCjB,MAAM,aAAa;GAjC4B;IAC7C,UAAU;IACV,KAAK;IACL,QAAQ;IACR,UAAU;KACR,KAAK,EAAE,MAAM,QAAQ;MAGnB,MAAM,WAAW,iBAAiB,KAAK;AACvC,UAAI,aAAa,UACf,QAAO,4BAA0B,WAAW,KAAK,GAAG;AAGtD,UAAI,CAAC,SACH,QAAO,gBAAgB,WAAW,KAAK,GAAG;AAG5C,UAAI,aAAa,iBACf,QAAO,aAAa,iBAAiB,MAAM,SAAS;AAGtD,aAAO,wBAAwB,SAAS,0BAA0B,SAAS,IAAI,WAAW,KAAK,CAAC;;KAElG,SAAS,EAAE,QAAQ;AACjB,aAAO,SAAS,WAAW,KAAK,CAAC;;KAEnC,UAAU,EAAE,UAAU;AAEpB,aAAO,MADM,KAAK,OAAO,YAAY,OAAO,CAC1B;;KAErB;IACF;GAIC,cAAc;GACd,GAAI,SAAS,cAAc,EAAE;GAC9B;AAED,MAAI,KAAK,SAAS,OAChB,YAAW,KAAK,QAAQ,CAAC;AAG3B,MAAI,KAAK,YACP,YAAW,KAAK,KAAK,YAAY,uBAAuB,CAAC;AAG3D,SAAO,IAAI,GAAG,WAAW;AAEzB,OAAK,SAAS;;CAGhB,oBAAmC;AACjC,SAAO,KAAK"}
@@ -1,3 +1,4 @@
1
+ import { escapeHtml } from "../utils/escape-html.js";
1
2
  import { MarkedContentHighlighter } from "../marked/marked-content-highlighter.js";
2
3
  import markedShiki from "marked-shiki";
3
4
  import { createHighlighter } from "shiki";
@@ -16,9 +17,6 @@ var defaultHighlighterOptions = {
16
17
  ],
17
18
  themes: ["github-dark", "github-light"]
18
19
  };
19
- function escapeHtml(code) {
20
- return code.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
21
- }
22
20
  var ShikiHighlighter = class extends MarkedContentHighlighter {
23
21
  constructor(highlighterOptions, highlightOptions, container, hasLoadMermaid = false, skipLangs = []) {
24
22
  super();
@@ -33,7 +31,7 @@ var ShikiHighlighter = class extends MarkedContentHighlighter {
33
31
  return markedShiki({
34
32
  container: this.container,
35
33
  highlight: async (code, lang, props) => {
36
- if (this.hasLoadMermaid && lang === "mermaid") return `<pre class="mermaid">${code}</pre>`;
34
+ if (this.hasLoadMermaid && lang === "mermaid") return `<pre class="mermaid">${escapeHtml(code)}</pre>`;
37
35
  if (this.skipLangs.includes(lang)) return `<pre class="language-${lang}"><code class="language-${lang}">${escapeHtml(code)}</code></pre>`;
38
36
  const { codeToHtml } = await this.highlighter;
39
37
  return codeToHtml(code, Object.assign({
@@ -1 +1 @@
1
- {"version":3,"file":"shiki-highlighter.js","names":[],"sources":["../../../../../src/lib/content/shiki/shiki-highlighter.ts"],"sourcesContent":["import markedShiki from 'marked-shiki';\nimport {\n type BundledLanguage,\n type BundledTheme,\n type CodeOptionsMeta,\n type CodeOptionsMultipleThemes,\n type CodeOptionsSingleTheme,\n type CodeToHastOptionsCommon,\n createHighlighter,\n} from 'shiki';\n\nimport { MarkedContentHighlighter } from '../marked/marked-content-highlighter.js';\n\nexport type ShikiHighlighterOptions = Parameters<typeof createHighlighter>[0];\nexport type ShikiHighlightOptions = Partial<\n Omit<CodeToHastOptionsCommon<BundledLanguage>, 'lang'>\n> &\n CodeOptionsMeta &\n Partial<CodeOptionsSingleTheme<BundledTheme>> &\n Partial<CodeOptionsMultipleThemes<BundledTheme>>;\n\nexport const defaultHighlighterOptions: {\n langs: string[];\n themes: string[];\n} = {\n langs: [\n 'json',\n 'ts',\n 'tsx',\n 'js',\n 'jsx',\n 'html',\n 'css',\n 'angular-html',\n 'angular-ts',\n ],\n themes: ['github-dark', 'github-light'],\n};\n\nfunction escapeHtml(code: string): string {\n return code\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;');\n}\n\nexport class ShikiHighlighter extends MarkedContentHighlighter {\n private readonly highlighter: ReturnType<typeof createHighlighter>;\n\n constructor(\n private highlighterOptions: ShikiHighlighterOptions,\n private highlightOptions: ShikiHighlightOptions,\n private container: string,\n private hasLoadMermaid = false,\n private skipLangs: string[] = [],\n ) {\n super();\n this.highlighter = createHighlighter(this.highlighterOptions);\n }\n getHighlightExtension(): import('marked').MarkedExtension {\n return markedShiki({\n container: this.container,\n highlight: async (code, lang, props) => {\n if (this.hasLoadMermaid && lang === 'mermaid') {\n return `<pre class=\"mermaid\">${code}</pre>`;\n }\n\n if (this.skipLangs.includes(lang as string)) {\n const escapedCode = escapeHtml(code);\n\n return `<pre class=\"language-${lang}\"><code class=\"language-${lang}\">${escapedCode}</code></pre>`;\n }\n\n const { codeToHtml } = await this.highlighter;\n return codeToHtml(\n code,\n Object.assign(\n {\n lang,\n // required by `transformerMeta*`\n meta: { __raw: props.join(' ') },\n theme: 'github-dark',\n },\n this.highlightOptions,\n ),\n );\n },\n });\n }\n}\n"],"mappings":";;;;AAqBA,IAAa,4BAGT;CACF,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ,CAAC,eAAe,eAAe;CACxC;AAED,SAAS,WAAW,MAAsB;AACxC,QAAO,KACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,QAAQ;;AAG7B,IAAa,mBAAb,cAAsC,yBAAyB;CAG7D,YACE,oBACA,kBACA,WACA,iBAAyB,OACzB,YAA8B,EAAE,EAChC;AACA,SAAO;AANC,OAAA,qBAAA;AACA,OAAA,mBAAA;AACA,OAAA,YAAA;AACA,OAAA,iBAAA;AACA,OAAA,YAAA;AAGR,OAAK,cAAc,kBAAkB,KAAK,mBAAmB;;CAE/D,wBAA0D;AACxD,SAAO,YAAY;GACjB,WAAW,KAAK;GAChB,WAAW,OAAO,MAAM,MAAM,UAAU;AACtC,QAAI,KAAK,kBAAkB,SAAS,UAClC,QAAO,wBAAwB,KAAK;AAGtC,QAAI,KAAK,UAAU,SAAS,KAAe,CAGzC,QAAO,wBAAwB,KAAK,0BAA0B,KAAK,IAF/C,WAAW,KAAK,CAE+C;IAGrF,MAAM,EAAE,eAAe,MAAM,KAAK;AAClC,WAAO,WACL,MACA,OAAO,OACL;KACE;KAEA,MAAM,EAAE,OAAO,MAAM,KAAK,IAAI,EAAE;KAChC,OAAO;KACR,EACD,KAAK,iBACN,CACF;;GAEJ,CAAC"}
1
+ {"version":3,"file":"shiki-highlighter.js","names":[],"sources":["../../../../../src/lib/content/shiki/shiki-highlighter.ts"],"sourcesContent":["import markedShiki from 'marked-shiki';\nimport {\n type BundledLanguage,\n type BundledTheme,\n type CodeOptionsMeta,\n type CodeOptionsMultipleThemes,\n type CodeOptionsSingleTheme,\n type CodeToHastOptionsCommon,\n createHighlighter,\n} from 'shiki';\n\nimport { MarkedContentHighlighter } from '../marked/marked-content-highlighter.js';\nimport { escapeHtml } from '../utils/escape-html.js';\n\nexport type ShikiHighlighterOptions = Parameters<typeof createHighlighter>[0];\nexport type ShikiHighlightOptions = Partial<\n Omit<CodeToHastOptionsCommon<BundledLanguage>, 'lang'>\n> &\n CodeOptionsMeta &\n Partial<CodeOptionsSingleTheme<BundledTheme>> &\n Partial<CodeOptionsMultipleThemes<BundledTheme>>;\n\nexport const defaultHighlighterOptions: {\n langs: string[];\n themes: string[];\n} = {\n langs: [\n 'json',\n 'ts',\n 'tsx',\n 'js',\n 'jsx',\n 'html',\n 'css',\n 'angular-html',\n 'angular-ts',\n ],\n themes: ['github-dark', 'github-light'],\n};\n\nexport class ShikiHighlighter extends MarkedContentHighlighter {\n private readonly highlighter: ReturnType<typeof createHighlighter>;\n\n constructor(\n private highlighterOptions: ShikiHighlighterOptions,\n private highlightOptions: ShikiHighlightOptions,\n private container: string,\n private hasLoadMermaid = false,\n private skipLangs: string[] = [],\n ) {\n super();\n this.highlighter = createHighlighter(this.highlighterOptions);\n }\n getHighlightExtension(): import('marked').MarkedExtension {\n return markedShiki({\n container: this.container,\n highlight: async (code, lang, props) => {\n if (this.hasLoadMermaid && lang === 'mermaid') {\n return `<pre class=\"mermaid\">${escapeHtml(code)}</pre>`;\n }\n\n if (this.skipLangs.includes(lang as string)) {\n const escapedCode = escapeHtml(code);\n\n return `<pre class=\"language-${lang}\"><code class=\"language-${lang}\">${escapedCode}</code></pre>`;\n }\n\n const { codeToHtml } = await this.highlighter;\n return codeToHtml(\n code,\n Object.assign(\n {\n lang,\n // required by `transformerMeta*`\n meta: { __raw: props.join(' ') },\n theme: 'github-dark',\n },\n this.highlightOptions,\n ),\n );\n },\n });\n }\n}\n"],"mappings":";;;;;AAsBA,IAAa,4BAGT;CACF,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,QAAQ,CAAC,eAAe,eAAe;CACxC;AAED,IAAa,mBAAb,cAAsC,yBAAyB;CAG7D,YACE,oBACA,kBACA,WACA,iBAAyB,OACzB,YAA8B,EAAE,EAChC;AACA,SAAO;AANC,OAAA,qBAAA;AACA,OAAA,mBAAA;AACA,OAAA,YAAA;AACA,OAAA,iBAAA;AACA,OAAA,YAAA;AAGR,OAAK,cAAc,kBAAkB,KAAK,mBAAmB;;CAE/D,wBAA0D;AACxD,SAAO,YAAY;GACjB,WAAW,KAAK;GAChB,WAAW,OAAO,MAAM,MAAM,UAAU;AACtC,QAAI,KAAK,kBAAkB,SAAS,UAClC,QAAO,wBAAwB,WAAW,KAAK,CAAC;AAGlD,QAAI,KAAK,UAAU,SAAS,KAAe,CAGzC,QAAO,wBAAwB,KAAK,0BAA0B,KAAK,IAF/C,WAAW,KAAK,CAE+C;IAGrF,MAAM,EAAE,eAAe,MAAM,KAAK;AAClC,WAAO,WACL,MACA,OAAO,OACL;KACE;KAEA,MAAM,EAAE,OAAO,MAAM,KAAK,IAAI,EAAE;KAChC,OAAO;KACR,EACD,KAAK,iBACN,CACF;;GAEJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function escapeHtml(value: string): string;
2
+ /**
3
+ * Reduces a fenced code-block info string to a safe language identifier so it
4
+ * cannot break out of the `class="language-..."` attribute it is interpolated
5
+ * into.
6
+ */
7
+ export declare function sanitizeLanguage(lang: string | undefined): string;
@@ -0,0 +1,16 @@
1
+ //#region packages/platform/src/lib/content/utils/escape-html.ts
2
+ function escapeHtml(value) {
3
+ return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("\"", "&quot;").replaceAll("'", "&#39;");
4
+ }
5
+ /**
6
+ * Reduces a fenced code-block info string to a safe language identifier so it
7
+ * cannot break out of the `class="language-..."` attribute it is interpolated
8
+ * into.
9
+ */
10
+ function sanitizeLanguage(lang) {
11
+ return (lang ?? "").match(/^[a-zA-Z0-9-+#.]*/)?.[0] ?? "";
12
+ }
13
+ //#endregion
14
+ export { escapeHtml, sanitizeLanguage };
15
+
16
+ //# sourceMappingURL=escape-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape-html.js","names":[],"sources":["../../../../../src/lib/content/utils/escape-html.ts"],"sourcesContent":["export function escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#39;');\n}\n\n/**\n * Reduces a fenced code-block info string to a safe language identifier so it\n * cannot break out of the `class=\"language-...\"` attribute it is interpolated\n * into.\n */\nexport function sanitizeLanguage(lang: string | undefined): string {\n return (lang ?? '').match(/^[a-zA-Z0-9-+#.]*/)?.[0] ?? '';\n}\n"],"mappings":";AAAA,SAAgB,WAAW,OAAuB;AAChD,QAAO,MACJ,WAAW,KAAK,QAAQ,CACxB,WAAW,KAAK,OAAO,CACvB,WAAW,KAAK,OAAO,CACvB,WAAW,MAAK,SAAS,CACzB,WAAW,KAAK,QAAQ;;;;;;;AAQ7B,SAAgB,iBAAiB,MAAkC;AACjE,SAAQ,QAAQ,IAAI,MAAM,oBAAoB,GAAG,MAAM"}
@@ -9,7 +9,7 @@ import tailwindcss from '@tailwindcss/vite';
9
9
  // https://vitejs.dev/config/
10
10
  export default defineConfig(({ mode }) => {
11
11
  return {
12
- root: __dirname,
12
+ root: import.meta.dirname,
13
13
  cacheDir: `<%= offsetFromRoot %>node_modules/.vite`,
14
14
  build: {
15
15
  outDir: '<%= offsetFromRoot %>dist/<%= projectRoot %>/client',
@@ -9,7 +9,7 @@ import tailwindcss from '@tailwindcss/vite';
9
9
  // https://vitejs.dev/config/
10
10
  export default defineConfig(({ mode }) => {
11
11
  return {
12
- root: __dirname,
12
+ root: import.meta.dirname,
13
13
  publicDir: 'src/public',
14
14
  cacheDir: `<%= offsetFromRoot %>node_modules/.vite`,
15
15
  build: {
@@ -9,7 +9,7 @@ import tailwindcss from '@tailwindcss/vite';
9
9
  // https://vitejs.dev/config/
10
10
  export default defineConfig(({ mode }) => {
11
11
  return {
12
- root: __dirname,
12
+ root: import.meta.dirname,
13
13
  cacheDir: `<%= offsetFromRoot %>node_modules/.vite`,
14
14
  build: {
15
15
  outDir: '<%= offsetFromRoot %>dist/<%= projectRoot %>/client',
@@ -9,7 +9,7 @@ import tailwindcss from '@tailwindcss/vite';
9
9
  // https://vitejs.dev/config/
10
10
  export default defineConfig(({ mode }) => {
11
11
  return {
12
- root: __dirname,
12
+ root: import.meta.dirname,
13
13
  cacheDir: `<%= offsetFromRoot %>node_modules/.vite`,
14
14
  build: {
15
15
  outDir: '<%= offsetFromRoot %>dist/<%= projectRoot %>/client',
@@ -42,6 +42,10 @@ function normalizeOptions(tree, options) {
42
42
  async function appGenerator(tree, options) {
43
43
  const nxVersion = require_version_utils.getInstalledPackageVersion(tree, "nx");
44
44
  if (nxVersion && require_minimum_supported_versions.belowMinimumSupportedNxVersion(nxVersion)) throw new Error(_nx_devkit.stripIndents`Nx v17.0.0 or newer is required to install Analog`);
45
+ if (options.linter === "oxlint") {
46
+ if (!nxVersion) throw new Error(_nx_devkit.stripIndents`The oxlint linter is only supported in Nx workspaces`);
47
+ if (require_minimum_supported_versions.belowMinimumSupportedOxlintNxVersion(nxVersion)) throw new Error(_nx_devkit.stripIndents`Nx v${require_minimum_supported_versions.MINIMUM_SUPPORTED_OXLINT_NX_VERSION} or newer is required to use the oxlint linter`);
48
+ }
45
49
  const normalizedOptions = normalizeOptions(tree, options);
46
50
  if (nxVersion) await require_add_angular_app.addAngularApp(tree, normalizedOptions);
47
51
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/app/generator.ts"],"sourcesContent":["import {\n formatFiles,\n getWorkspaceLayout,\n installPackagesTask,\n names,\n offsetFromRoot as determineOffsetFromRoot,\n stripIndents,\n Tree,\n addDependenciesToPackageJson,\n updateJson,\n} from '@nx/devkit';\nimport { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter';\nimport { AnalogNxApplicationGeneratorOptions } from './schema';\nimport { major, coerce } from 'semver';\nimport { getInstalledPackageVersion } from '../../utils/version-utils';\nimport { addHomePage } from './lib/add-home-page';\nimport { belowMinimumSupportedNxVersion } from './versions/minimum-supported-versions';\nimport { addAngularApp } from './lib/add-angular-app';\nimport setupAnalogGenerator from '../init/generator';\nimport { addFiles } from './lib/add-files';\nimport { addAgentContext } from './lib/add-agent-context';\nimport { addTailwindConfig } from './lib/add-tailwind-config';\nimport { cleanupFiles } from './lib/cleanup-files';\nimport { addAnalogProjectConfig } from './lib/add-analog-project-config';\nimport { updateIndex } from './lib/update-index-html';\n\nexport interface NormalizedOptions\n extends AnalogNxApplicationGeneratorOptions, ReturnType<typeof names> {\n projectName: string;\n projectRoot: string;\n projectDirectory: string;\n parsedTags: string[];\n offsetFromRoot: string;\n appsDir: string;\n nxPackageNamespace: string;\n isNx: boolean;\n}\n\nfunction normalizeOptions(\n tree: Tree,\n options: AnalogNxApplicationGeneratorOptions,\n): NormalizedOptions {\n const isNx = tree.exists('/nx.json');\n const appsDir = isNx ? getWorkspaceLayout(tree).appsDir : 'projects';\n const allNames = names(options.analogAppName);\n const projectDirectory = allNames.fileName;\n const projectName = projectDirectory.replace(new RegExp('/', 'g'), '-');\n const projectRoot = `${appsDir}/${projectDirectory}`;\n const parsedTags = options.tags\n ? options.tags.split(',').map((s) => s.trim())\n : [];\n const offsetFromRoot = determineOffsetFromRoot(projectRoot);\n const nxPackageNamespace = '@nx';\n const addTailwind = options.addTailwind ?? true;\n\n return {\n ...options,\n ...allNames,\n projectName,\n projectRoot,\n projectDirectory,\n parsedTags,\n offsetFromRoot,\n appsDir,\n nxPackageNamespace,\n addTailwind,\n isNx,\n };\n}\n\nasync function appGenerator(\n tree: Tree,\n options: AnalogNxApplicationGeneratorOptions,\n): Promise<() => void> {\n const nxVersion = getInstalledPackageVersion(tree, 'nx');\n\n if (nxVersion && belowMinimumSupportedNxVersion(nxVersion)) {\n throw new Error(\n stripIndents`Nx v17.0.0 or newer is required to install Analog`,\n );\n }\n\n const normalizedOptions = normalizeOptions(tree, options);\n\n if (nxVersion) {\n await addAngularApp(tree, normalizedOptions);\n } else {\n const angularAppSchematic = wrapAngularDevkitSchematic(\n '@schematics/angular',\n 'application',\n );\n await angularAppSchematic(tree, {\n projectRoot: normalizedOptions.projectRoot,\n name: normalizedOptions.analogAppName,\n });\n addAnalogProjectConfig(\n tree,\n normalizedOptions.projectRoot,\n normalizedOptions.projectName,\n normalizedOptions.parsedTags,\n normalizedOptions.name,\n normalizedOptions.appsDir,\n normalizedOptions.nxPackageNamespace,\n );\n }\n\n await setupAnalogGenerator(tree, {\n project: normalizedOptions.analogAppName,\n vitest: true,\n });\n\n const angularVersion = getInstalledPackageVersion(tree, '@angular/core');\n const coercedAngularVersion = coerce(angularVersion ?? '');\n if (!coercedAngularVersion) {\n throw new Error('Could not determine installed Angular version.');\n }\n const majorAngularVersion = major(coercedAngularVersion);\n addFiles(tree, normalizedOptions, majorAngularVersion);\n addDependenciesToPackageJson(\n tree,\n {\n 'front-matter': '^4.0.2',\n marked: '^18.0.0',\n mermaid: '^10.2.4',\n prismjs: '^1.29.0',\n },\n {},\n );\n\n updateJson<{ dependencies: Record<string, string> }>(\n tree,\n '/package.json',\n (json) => {\n json.dependencies['@angular/platform-server'] = `~${angularVersion}`;\n\n return json;\n },\n );\n\n updateIndex(tree, normalizedOptions.analogAppName);\n\n if (normalizedOptions.addTailwind) {\n await addTailwindConfig(tree, normalizedOptions.projectName);\n }\n\n addHomePage(tree, normalizedOptions, majorAngularVersion);\n\n if (!normalizedOptions.skipAgentContext) {\n addAgentContext(tree, normalizedOptions.projectRoot);\n }\n\n cleanupFiles(tree, normalizedOptions);\n\n if (!normalizedOptions.skipFormat) {\n await formatFiles(tree);\n }\n\n return () => {\n installPackagesTask(tree);\n };\n}\n\nexport default appGenerator;\n"],"mappings":";;;;;;;;;;;;;;;;AAsCA,SAAS,iBACP,MACA,SACmB;CACnB,MAAM,OAAO,KAAK,OAAO,WAAW;CACpC,MAAM,UAAU,QAAA,GAAA,WAAA,oBAA0B,KAAK,CAAC,UAAU;CAC1D,MAAM,YAAA,GAAA,WAAA,OAAiB,QAAQ,cAAc;CAC7C,MAAM,mBAAmB,SAAS;CAClC,MAAM,cAAc,iBAAiB,wBAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI;CACvE,MAAM,cAAc,GAAG,QAAQ,GAAG;CAClC,MAAM,aAAa,QAAQ,OACvB,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,GAC5C,EAAE;CACN,MAAM,kBAAA,GAAA,WAAA,gBAAyC,YAAY;CAC3D,MAAM,qBAAqB;CAC3B,MAAM,cAAc,QAAQ,eAAe;AAE3C,QAAO;EACL,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,eAAe,aACb,MACA,SACqB;CACrB,MAAM,YAAY,sBAAA,2BAA2B,MAAM,KAAK;AAExD,KAAI,aAAa,mCAAA,+BAA+B,UAAU,CACxD,OAAM,IAAI,MACR,WAAA,YAAY,oDACb;CAGH,MAAM,oBAAoB,iBAAiB,MAAM,QAAQ;AAEzD,KAAI,UACF,OAAM,wBAAA,cAAc,MAAM,kBAAkB;MACvC;AAKL,SAAA,GAAA,yBAAA,4BAHE,uBACA,cACD,CACyB,MAAM;GAC9B,aAAa,kBAAkB;GAC/B,MAAM,kBAAkB;GACzB,CAAC;AACF,oCAAA,uBACE,MACA,kBAAkB,aAClB,kBAAkB,aAClB,kBAAkB,YAClB,kBAAkB,MAClB,kBAAkB,SAClB,kBAAkB,mBACnB;;AAGH,OAAM,sCAAqB,MAAM;EAC/B,SAAS,kBAAkB;EAC3B,QAAQ;EACT,CAAC;CAEF,MAAM,iBAAiB,sBAAA,2BAA2B,MAAM,gBAAgB;CACxE,MAAM,yBAAA,GAAA,OAAA,QAA+B,kBAAkB,GAAG;AAC1D,KAAI,CAAC,sBACH,OAAM,IAAI,MAAM,iDAAiD;CAEnE,MAAM,uBAAA,GAAA,OAAA,OAA4B,sBAAsB;AACxD,mBAAA,SAAS,MAAM,mBAAmB,oBAAoB;AACtD,EAAA,GAAA,WAAA,8BACE,MACA;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,SAAS;EACV,EACD,EAAE,CACH;AAED,EAAA,GAAA,WAAA,YACE,MACA,kBACC,SAAS;AACR,OAAK,aAAa,8BAA8B,IAAI;AAEpD,SAAO;GAEV;AAED,2BAAA,YAAY,MAAM,kBAAkB,cAAc;AAElD,KAAI,kBAAkB,YACpB,OAAM,4BAAA,kBAAkB,MAAM,kBAAkB,YAAY;AAG9D,uBAAA,YAAY,MAAM,mBAAmB,oBAAoB;AAEzD,KAAI,CAAC,kBAAkB,iBACrB,2BAAA,gBAAgB,MAAM,kBAAkB,YAAY;AAGtD,uBAAA,aAAa,MAAM,kBAAkB;AAErC,KAAI,CAAC,kBAAkB,WACrB,QAAA,GAAA,WAAA,aAAkB,KAAK;AAGzB,cAAa;AACX,GAAA,GAAA,WAAA,qBAAoB,KAAK"}
1
+ {"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/app/generator.ts"],"sourcesContent":["import {\n formatFiles,\n getWorkspaceLayout,\n installPackagesTask,\n names,\n offsetFromRoot as determineOffsetFromRoot,\n stripIndents,\n Tree,\n addDependenciesToPackageJson,\n updateJson,\n} from '@nx/devkit';\nimport { wrapAngularDevkitSchematic } from '@nx/devkit/ngcli-adapter';\nimport { AnalogNxApplicationGeneratorOptions } from './schema';\nimport { major, coerce } from 'semver';\nimport { getInstalledPackageVersion } from '../../utils/version-utils';\nimport { addHomePage } from './lib/add-home-page';\nimport {\n belowMinimumSupportedNxVersion,\n belowMinimumSupportedOxlintNxVersion,\n MINIMUM_SUPPORTED_OXLINT_NX_VERSION,\n} from './versions/minimum-supported-versions';\nimport { addAngularApp } from './lib/add-angular-app';\nimport setupAnalogGenerator from '../init/generator';\nimport { addFiles } from './lib/add-files';\nimport { addAgentContext } from './lib/add-agent-context';\nimport { addTailwindConfig } from './lib/add-tailwind-config';\nimport { cleanupFiles } from './lib/cleanup-files';\nimport { addAnalogProjectConfig } from './lib/add-analog-project-config';\nimport { updateIndex } from './lib/update-index-html';\n\nexport interface NormalizedOptions\n extends AnalogNxApplicationGeneratorOptions, ReturnType<typeof names> {\n projectName: string;\n projectRoot: string;\n projectDirectory: string;\n parsedTags: string[];\n offsetFromRoot: string;\n appsDir: string;\n nxPackageNamespace: string;\n isNx: boolean;\n}\n\nfunction normalizeOptions(\n tree: Tree,\n options: AnalogNxApplicationGeneratorOptions,\n): NormalizedOptions {\n const isNx = tree.exists('/nx.json');\n const appsDir = isNx ? getWorkspaceLayout(tree).appsDir : 'projects';\n const allNames = names(options.analogAppName);\n const projectDirectory = allNames.fileName;\n const projectName = projectDirectory.replace(new RegExp('/', 'g'), '-');\n const projectRoot = `${appsDir}/${projectDirectory}`;\n const parsedTags = options.tags\n ? options.tags.split(',').map((s) => s.trim())\n : [];\n const offsetFromRoot = determineOffsetFromRoot(projectRoot);\n const nxPackageNamespace = '@nx';\n const addTailwind = options.addTailwind ?? true;\n\n return {\n ...options,\n ...allNames,\n projectName,\n projectRoot,\n projectDirectory,\n parsedTags,\n offsetFromRoot,\n appsDir,\n nxPackageNamespace,\n addTailwind,\n isNx,\n };\n}\n\nasync function appGenerator(\n tree: Tree,\n options: AnalogNxApplicationGeneratorOptions,\n): Promise<() => void> {\n const nxVersion = getInstalledPackageVersion(tree, 'nx');\n\n if (nxVersion && belowMinimumSupportedNxVersion(nxVersion)) {\n throw new Error(\n stripIndents`Nx v17.0.0 or newer is required to install Analog`,\n );\n }\n\n if (options.linter === 'oxlint') {\n if (!nxVersion) {\n throw new Error(\n stripIndents`The oxlint linter is only supported in Nx workspaces`,\n );\n }\n if (belowMinimumSupportedOxlintNxVersion(nxVersion)) {\n throw new Error(\n stripIndents`Nx v${MINIMUM_SUPPORTED_OXLINT_NX_VERSION} or newer is required to use the oxlint linter`,\n );\n }\n }\n\n const normalizedOptions = normalizeOptions(tree, options);\n\n if (nxVersion) {\n await addAngularApp(tree, normalizedOptions);\n } else {\n const angularAppSchematic = wrapAngularDevkitSchematic(\n '@schematics/angular',\n 'application',\n );\n await angularAppSchematic(tree, {\n projectRoot: normalizedOptions.projectRoot,\n name: normalizedOptions.analogAppName,\n });\n addAnalogProjectConfig(\n tree,\n normalizedOptions.projectRoot,\n normalizedOptions.projectName,\n normalizedOptions.parsedTags,\n normalizedOptions.name,\n normalizedOptions.appsDir,\n normalizedOptions.nxPackageNamespace,\n );\n }\n\n await setupAnalogGenerator(tree, {\n project: normalizedOptions.analogAppName,\n vitest: true,\n });\n\n const angularVersion = getInstalledPackageVersion(tree, '@angular/core');\n const coercedAngularVersion = coerce(angularVersion ?? '');\n if (!coercedAngularVersion) {\n throw new Error('Could not determine installed Angular version.');\n }\n const majorAngularVersion = major(coercedAngularVersion);\n addFiles(tree, normalizedOptions, majorAngularVersion);\n addDependenciesToPackageJson(\n tree,\n {\n 'front-matter': '^4.0.2',\n marked: '^18.0.0',\n mermaid: '^10.2.4',\n prismjs: '^1.29.0',\n },\n {},\n );\n\n updateJson<{ dependencies: Record<string, string> }>(\n tree,\n '/package.json',\n (json) => {\n json.dependencies['@angular/platform-server'] = `~${angularVersion}`;\n\n return json;\n },\n );\n\n updateIndex(tree, normalizedOptions.analogAppName);\n\n if (normalizedOptions.addTailwind) {\n await addTailwindConfig(tree, normalizedOptions.projectName);\n }\n\n addHomePage(tree, normalizedOptions, majorAngularVersion);\n\n if (!normalizedOptions.skipAgentContext) {\n addAgentContext(tree, normalizedOptions.projectRoot);\n }\n\n cleanupFiles(tree, normalizedOptions);\n\n if (!normalizedOptions.skipFormat) {\n await formatFiles(tree);\n }\n\n return () => {\n installPackagesTask(tree);\n };\n}\n\nexport default appGenerator;\n"],"mappings":";;;;;;;;;;;;;;;;AA0CA,SAAS,iBACP,MACA,SACmB;CACnB,MAAM,OAAO,KAAK,OAAO,WAAW;CACpC,MAAM,UAAU,QAAA,GAAA,WAAA,oBAA0B,KAAK,CAAC,UAAU;CAC1D,MAAM,YAAA,GAAA,WAAA,OAAiB,QAAQ,cAAc;CAC7C,MAAM,mBAAmB,SAAS;CAClC,MAAM,cAAc,iBAAiB,wBAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI;CACvE,MAAM,cAAc,GAAG,QAAQ,GAAG;CAClC,MAAM,aAAa,QAAQ,OACvB,QAAQ,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC,GAC5C,EAAE;CACN,MAAM,kBAAA,GAAA,WAAA,gBAAyC,YAAY;CAC3D,MAAM,qBAAqB;CAC3B,MAAM,cAAc,QAAQ,eAAe;AAE3C,QAAO;EACL,GAAG;EACH,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;AAGH,eAAe,aACb,MACA,SACqB;CACrB,MAAM,YAAY,sBAAA,2BAA2B,MAAM,KAAK;AAExD,KAAI,aAAa,mCAAA,+BAA+B,UAAU,CACxD,OAAM,IAAI,MACR,WAAA,YAAY,oDACb;AAGH,KAAI,QAAQ,WAAW,UAAU;AAC/B,MAAI,CAAC,UACH,OAAM,IAAI,MACR,WAAA,YAAY,uDACb;AAEH,MAAI,mCAAA,qCAAqC,UAAU,CACjD,OAAM,IAAI,MACR,WAAA,YAAY,OAAO,mCAAA,oCAAoC,gDACxD;;CAIL,MAAM,oBAAoB,iBAAiB,MAAM,QAAQ;AAEzD,KAAI,UACF,OAAM,wBAAA,cAAc,MAAM,kBAAkB;MACvC;AAKL,SAAA,GAAA,yBAAA,4BAHE,uBACA,cACD,CACyB,MAAM;GAC9B,aAAa,kBAAkB;GAC/B,MAAM,kBAAkB;GACzB,CAAC;AACF,oCAAA,uBACE,MACA,kBAAkB,aAClB,kBAAkB,aAClB,kBAAkB,YAClB,kBAAkB,MAClB,kBAAkB,SAClB,kBAAkB,mBACnB;;AAGH,OAAM,sCAAqB,MAAM;EAC/B,SAAS,kBAAkB;EAC3B,QAAQ;EACT,CAAC;CAEF,MAAM,iBAAiB,sBAAA,2BAA2B,MAAM,gBAAgB;CACxE,MAAM,yBAAA,GAAA,OAAA,QAA+B,kBAAkB,GAAG;AAC1D,KAAI,CAAC,sBACH,OAAM,IAAI,MAAM,iDAAiD;CAEnE,MAAM,uBAAA,GAAA,OAAA,OAA4B,sBAAsB;AACxD,mBAAA,SAAS,MAAM,mBAAmB,oBAAoB;AACtD,EAAA,GAAA,WAAA,8BACE,MACA;EACE,gBAAgB;EAChB,QAAQ;EACR,SAAS;EACT,SAAS;EACV,EACD,EAAE,CACH;AAED,EAAA,GAAA,WAAA,YACE,MACA,kBACC,SAAS;AACR,OAAK,aAAa,8BAA8B,IAAI;AAEpD,SAAO;GAEV;AAED,2BAAA,YAAY,MAAM,kBAAkB,cAAc;AAElD,KAAI,kBAAkB,YACpB,OAAM,4BAAA,kBAAkB,MAAM,kBAAkB,YAAY;AAG9D,uBAAA,YAAY,MAAM,mBAAmB,oBAAoB;AAEzD,KAAI,CAAC,kBAAkB,iBACrB,2BAAA,gBAAgB,MAAM,kBAAkB,YAAY;AAGtD,uBAAA,aAAa,MAAM,kBAAkB;AAErC,KAAI,CAAC,kBAAkB,WACrB,QAAA,GAAA,WAAA,aAAkB,KAAK;AAGzB,cAAa;AACX,GAAA,GAAA,WAAA,qBAAoB,KAAK"}
@@ -4,22 +4,17 @@ let _nx_devkit = require("@nx/devkit");
4
4
  async function addAngularApp(tree, options) {
5
5
  const isNx = tree.exists("/nx.json");
6
6
  const appsDir = isNx ? (0, _nx_devkit.getWorkspaceLayout)(tree).appsDir : "projects";
7
- const appOptions = {
7
+ const { applicationGenerator } = await import("@nx/angular/generators");
8
+ await applicationGenerator(tree, {
8
9
  name: options.analogAppName,
9
10
  directory: `${appsDir}/${options.analogAppName}`,
10
- linter: !isNx || process.env.NODE_ENV === "test" ? "none" : "eslint",
11
- e2eTestRunner: "none",
12
- unitTestRunner: "vitest",
11
+ linter: !isNx ? "none" : options.linter ?? (process.env.NODE_ENV === "test" ? "none" : "eslint"),
12
+ unitTestRunner: "none",
13
13
  standalone: true,
14
14
  ssr: false,
15
15
  bundler: "esbuild",
16
- serverRouting: false,
17
16
  skipFormat: true,
18
17
  tags: options.tags
19
- };
20
- await (await import("@nx/angular/generators")).applicationGenerator(tree, {
21
- ...appOptions,
22
- directory: `${appsDir}/${options.analogAppName}`
23
18
  });
24
19
  }
25
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"add-angular-app.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/app/lib/add-angular-app.ts"],"sourcesContent":["import { getWorkspaceLayout, Tree } from '@nx/devkit';\nimport { NormalizedOptions } from '../generator';\n\nexport async function addAngularApp(\n tree: Tree,\n options: NormalizedOptions,\n): Promise<void> {\n const isNx = tree.exists('/nx.json');\n const appsDir = isNx ? getWorkspaceLayout(tree).appsDir : 'projects';\n\n const appOptions: typeof import('@nx/angular/src/generators/application/schema') =\n {\n name: options.analogAppName,\n directory: `${appsDir}/${options.analogAppName}`,\n linter: !isNx || process.env['NODE_ENV'] === 'test' ? 'none' : 'eslint',\n e2eTestRunner: 'none',\n unitTestRunner: 'vitest',\n standalone: true,\n ssr: false,\n bundler: 'esbuild',\n serverRouting: false,\n skipFormat: true,\n tags: options.tags,\n };\n\n await (\n await import(\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n '@nx/angular/generators'\n )\n ).applicationGenerator(tree, {\n ...appOptions,\n directory: `${appsDir}/${options.analogAppName}`,\n });\n}\n"],"mappings":";;;AAGA,eAAsB,cACpB,MACA,SACe;CACf,MAAM,OAAO,KAAK,OAAO,WAAW;CACpC,MAAM,UAAU,QAAA,GAAA,WAAA,oBAA0B,KAAK,CAAC,UAAU;CAE1D,MAAM,aACJ;EACE,MAAM,QAAQ;EACd,WAAW,GAAG,QAAQ,GAAG,QAAQ;EACjC,QAAQ,CAAC,QAAA,QAAA,IAAA,aAAoC,SAAS,SAAS;EAC/D,eAAe;EACf,gBAAgB;EAChB,YAAY;EACZ,KAAK;EACL,SAAS;EACT,eAAe;EACf,YAAY;EACZ,MAAM,QAAQ;EACf;AAEH,QACE,MAAM,OAGJ,2BAEF,qBAAqB,MAAM;EAC3B,GAAG;EACH,WAAW,GAAG,QAAQ,GAAG,QAAQ;EAClC,CAAC"}
1
+ {"version":3,"file":"add-angular-app.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/app/lib/add-angular-app.ts"],"sourcesContent":["import { getWorkspaceLayout, Tree } from '@nx/devkit';\nimport { NormalizedOptions } from '../generator';\n\nexport async function addAngularApp(\n tree: Tree,\n options: NormalizedOptions,\n): Promise<void> {\n const isNx = tree.exists('/nx.json');\n const appsDir = isNx ? getWorkspaceLayout(tree).appsDir : 'projects';\n\n const { applicationGenerator } = await import('@nx/angular/generators');\n type ApplicationSchema = Parameters<typeof applicationGenerator>[1];\n const appOptions: ApplicationSchema = {\n name: options.analogAppName,\n directory: `${appsDir}/${options.analogAppName}`,\n linter: !isNx\n ? 'none'\n : (options.linter ??\n (process.env['NODE_ENV'] === 'test' ? 'none' : 'eslint')),\n // Analog sets up its own Vitest configuration in the init generator, so the\n // Angular generator should not scaffold a test runner. Nx 23 also removed\n // the `'vitest'` option in favour of `'vitest-angular'`/`'vitest-analog'`.\n unitTestRunner: 'none' as ApplicationSchema['unitTestRunner'],\n standalone: true,\n ssr: false,\n bundler: 'esbuild',\n skipFormat: true,\n tags: options.tags,\n };\n\n await applicationGenerator(tree, appOptions);\n}\n"],"mappings":";;;AAGA,eAAsB,cACpB,MACA,SACe;CACf,MAAM,OAAO,KAAK,OAAO,WAAW;CACpC,MAAM,UAAU,QAAA,GAAA,WAAA,oBAA0B,KAAK,CAAC,UAAU;CAE1D,MAAM,EAAE,yBAAyB,MAAM,OAAO;AAoB9C,OAAM,qBAAqB,MAlBW;EACpC,MAAM,QAAQ;EACd,WAAW,GAAG,QAAQ,GAAG,QAAQ;EACjC,QAAQ,CAAC,OACL,SACC,QAAQ,WAAA,QAAA,IAAA,aACoB,SAAS,SAAS;EAInD,gBAAgB;EAChB,YAAY;EACZ,KAAK;EACL,SAAS;EACT,YAAY;EACZ,MAAM,QAAQ;EACf,CAE2C"}
@@ -2,6 +2,7 @@ export interface AnalogNxApplicationGeneratorOptions {
2
2
  analogAppName: string;
3
3
  tags?: string;
4
4
  addTailwind?: boolean;
5
+ linter?: 'eslint' | 'oxlint' | 'none';
5
6
  skipFormat?: boolean;
6
7
  // Set by the preset, which seeds agent context at the workspace root instead.
7
8
  skipAgentContext?: boolean;
@@ -20,6 +20,12 @@
20
20
  "x-prompt": "Add TailwindCSS for styling?",
21
21
  "default": false
22
22
  },
23
+ "linter": {
24
+ "description": "The tool to use for running lint checks. `oxlint` requires Nx 23.2 or newer.",
25
+ "type": "string",
26
+ "enum": ["eslint", "oxlint", "none"],
27
+ "default": "eslint"
28
+ },
23
29
  "tags": {
24
30
  "type": "string",
25
31
  "description": "Add tags to the project (used for linting)",
@@ -2,3 +2,5 @@ export declare const MINIMUM_SUPPORTED_NX_VERSION = "17.0.0";
2
2
  export declare const MINIMUM_SUPPORTED_ANGULAR_VERSION = "17.0.0";
3
3
  export declare const belowMinimumSupportedNxVersion: (nxVersion: string) => boolean;
4
4
  export declare const belowMinimumSupportedAngularVersion: (angularVersion: string) => boolean;
5
+ export declare const MINIMUM_SUPPORTED_OXLINT_NX_VERSION = "23.2.0";
6
+ export declare const belowMinimumSupportedOxlintNxVersion: (nxVersion: string) => boolean;
@@ -3,7 +3,11 @@ let semver = require("semver");
3
3
  //#region packages/nx-plugin/src/generators/app/versions/minimum-supported-versions.ts
4
4
  var MINIMUM_SUPPORTED_NX_VERSION = "17.0.0";
5
5
  var belowMinimumSupportedNxVersion = (nxVersion) => (0, semver.lt)((0, semver.coerce)(nxVersion), MINIMUM_SUPPORTED_NX_VERSION);
6
+ var MINIMUM_SUPPORTED_OXLINT_NX_VERSION = "23.2.0";
7
+ var belowMinimumSupportedOxlintNxVersion = (nxVersion) => (0, semver.lt)((0, semver.coerce)(nxVersion), MINIMUM_SUPPORTED_OXLINT_NX_VERSION);
6
8
  //#endregion
9
+ exports.MINIMUM_SUPPORTED_OXLINT_NX_VERSION = MINIMUM_SUPPORTED_OXLINT_NX_VERSION;
7
10
  exports.belowMinimumSupportedNxVersion = belowMinimumSupportedNxVersion;
11
+ exports.belowMinimumSupportedOxlintNxVersion = belowMinimumSupportedOxlintNxVersion;
8
12
 
9
13
  //# sourceMappingURL=minimum-supported-versions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"minimum-supported-versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/app/versions/minimum-supported-versions.ts"],"sourcesContent":["import { lt, coerce } from 'semver';\n\nexport const MINIMUM_SUPPORTED_NX_VERSION = '17.0.0';\nexport const MINIMUM_SUPPORTED_ANGULAR_VERSION = '17.0.0';\n\nexport const belowMinimumSupportedNxVersion = (nxVersion: string): boolean =>\n lt(coerce(nxVersion)!, MINIMUM_SUPPORTED_NX_VERSION);\n\nexport const belowMinimumSupportedAngularVersion = (\n angularVersion: string,\n): boolean => lt(coerce(angularVersion)!, MINIMUM_SUPPORTED_ANGULAR_VERSION);\n"],"mappings":";;;AAEA,IAAa,+BAA+B;AAG5C,IAAa,kCAAkC,eAAA,GAAA,OAAA,KAAA,GAAA,OAAA,QACnC,UAAU,EAAG,6BAA6B"}
1
+ {"version":3,"file":"minimum-supported-versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/generators/app/versions/minimum-supported-versions.ts"],"sourcesContent":["import { lt, coerce } from 'semver';\n\nexport const MINIMUM_SUPPORTED_NX_VERSION = '17.0.0';\nexport const MINIMUM_SUPPORTED_ANGULAR_VERSION = '17.0.0';\n\nexport const belowMinimumSupportedNxVersion = (nxVersion: string): boolean =>\n lt(coerce(nxVersion)!, MINIMUM_SUPPORTED_NX_VERSION);\n\nexport const belowMinimumSupportedAngularVersion = (\n angularVersion: string,\n): boolean => lt(coerce(angularVersion)!, MINIMUM_SUPPORTED_ANGULAR_VERSION);\n\nexport const MINIMUM_SUPPORTED_OXLINT_NX_VERSION = '23.2.0';\nexport const belowMinimumSupportedOxlintNxVersion = (\n nxVersion: string,\n): boolean => lt(coerce(nxVersion)!, MINIMUM_SUPPORTED_OXLINT_NX_VERSION);\n"],"mappings":";;;AAEA,IAAa,+BAA+B;AAG5C,IAAa,kCAAkC,eAAA,GAAA,OAAA,KAAA,GAAA,OAAA,QACnC,UAAU,EAAG,6BAA6B;AAMtD,IAAa,sCAAsC;AACnD,IAAa,wCACX,eAAA,GAAA,OAAA,KAAA,GAAA,OAAA,QACsB,UAAU,EAAG,oCAAoC"}
@@ -1,9 +1,9 @@
1
1
  export declare const V18_X_NX_DEVKIT = "^20.0.0";
2
2
  export declare const V18_X_NX_ANGULAR = "^20.0.0";
3
- export declare const V18_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.88";
4
- export declare const V18_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.88";
5
- export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.88";
6
- export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.88";
3
+ export declare const V18_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.89";
4
+ export declare const V18_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.89";
5
+ export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.89";
6
+ export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.89";
7
7
  export declare const V18_X_FRONT_MATTER = "^4.0.2";
8
8
  export declare const V18_X_MARKED = "^18.0.0";
9
9
  export declare const V18_X_MARKED_GFM_HEADING_ID = "^4.1.1";
@@ -15,7 +15,7 @@ export declare const V18_X_TAILWINDCSS = "^4.2.2";
15
15
  export declare const V18_X_TAILWINDCSS_POSTCSS = "^4.2.2";
16
16
  export declare const V18_X_TAILWINDCSS_VITE = "^4.2.2";
17
17
  export declare const V18_X_POSTCSS = "^8.5.6";
18
- export declare const V18_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.88";
18
+ export declare const V18_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.89";
19
19
  export declare const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = "^19.0.0";
20
20
  export declare const V18_X_NX_VITE = "^21.0.0";
21
21
  export declare const V18_X_NX_LINTER = "^21.0.0";
@@ -1 +1 @@
1
- {"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../../nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"sourcesContent":["// V18_X\n// dependencies\nexport const V18_X_NX_DEVKIT = '^20.0.0';\nexport const V18_X_NX_ANGULAR = '^20.0.0';\nexport const V18_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.88';\nexport const V18_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.88';\nexport const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.88';\nexport const V18_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.88';\nexport const V18_X_FRONT_MATTER = '^4.0.2';\nexport const V18_X_MARKED = '^18.0.0';\nexport const V18_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V18_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V18_X_MARKED_MANGLE = '^1.1.10';\nexport const V18_X_MERMAID = '^10.2.4';\nexport const V18_X_PRISMJS = '^1.29.0';\nexport const V18_X_TAILWINDCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_POSTCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_VITE = '^4.2.2';\nexport const V18_X_POSTCSS = '^8.5.6';\n\n// devDependencies\nexport const V18_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.88';\nexport const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = '^19.0.0';\nexport const V18_X_NX_VITE = '^21.0.0';\nexport const V18_X_NX_LINTER = '^21.0.0';\nexport const V18_X_JSDOM = '^22.1.0';\nexport const V18_X_VITE = '^8.0.0';\nexport const V18_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V18_X_VITEST = '^4.0.0';\nexport const V18_X_ZOD = '^3.21.4';\n"],"mappings":";AAeA,IAAa,oBAAoB;AACjC,IAAa,4BAA4B;AACzC,IAAa,yBAAyB;AACtC,IAAa,gBAAgB"}
1
+ {"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../../nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"sourcesContent":["// V18_X\n// dependencies\nexport const V18_X_NX_DEVKIT = '^20.0.0';\nexport const V18_X_NX_ANGULAR = '^20.0.0';\nexport const V18_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.89';\nexport const V18_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.89';\nexport const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.89';\nexport const V18_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.89';\nexport const V18_X_FRONT_MATTER = '^4.0.2';\nexport const V18_X_MARKED = '^18.0.0';\nexport const V18_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V18_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V18_X_MARKED_MANGLE = '^1.1.10';\nexport const V18_X_MERMAID = '^10.2.4';\nexport const V18_X_PRISMJS = '^1.29.0';\nexport const V18_X_TAILWINDCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_POSTCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_VITE = '^4.2.2';\nexport const V18_X_POSTCSS = '^8.5.6';\n\n// devDependencies\nexport const V18_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.89';\nexport const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = '^19.0.0';\nexport const V18_X_NX_VITE = '^21.0.0';\nexport const V18_X_NX_LINTER = '^21.0.0';\nexport const V18_X_JSDOM = '^22.1.0';\nexport const V18_X_VITE = '^8.0.0';\nexport const V18_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V18_X_VITEST = '^4.0.0';\nexport const V18_X_ZOD = '^3.21.4';\n"],"mappings":";AAeA,IAAa,oBAAoB;AACjC,IAAa,4BAA4B;AACzC,IAAa,yBAAyB;AACtC,IAAa,gBAAgB"}
@@ -71,6 +71,7 @@ exports[`preset generator > should match project.json 1`] = `
71
71
  "executor": "@nx/web:file-server",
72
72
  "options": {
73
73
  "buildTarget": "my-app:build",
74
+ "port": 4200,
74
75
  "staticFilePath": "dist/my-app/browser",
75
76
  "spa": true
76
77
  }
@@ -107,7 +108,7 @@ import tailwindcss from '@tailwindcss/vite';
107
108
  // https://vitejs.dev/config/
108
109
  export default defineConfig(({ mode }) => {
109
110
  return {
110
- root: __dirname,
111
+ root: import.meta.dirname,
111
112
  cacheDir: \`../node_modules/.vite\`,
112
113
  build: {
113
114
  outDir: '../dist/./my-app/client',
@@ -1,11 +1,15 @@
1
1
  require("../../../_virtual/_rolldown/runtime.js");
2
+ const require_minimum_supported_versions = require("../app/versions/minimum-supported-versions.js");
2
3
  let _nx_devkit = require("@nx/devkit");
3
4
  let node_path = require("node:path");
4
5
  //#region packages/nx-plugin/src/generators/preset/generator.ts
5
6
  async function generator_default(tree, options) {
6
7
  (0, _nx_devkit.ensurePackage)("@nx/angular", _nx_devkit.NX_VERSION);
7
8
  (0, _nx_devkit.ensurePackage)("@nx/vite", _nx_devkit.NX_VERSION);
8
- (0, _nx_devkit.ensurePackage)("@nx/eslint", _nx_devkit.NX_VERSION);
9
+ if (options.linter === "oxlint") {
10
+ if (require_minimum_supported_versions.belowMinimumSupportedOxlintNxVersion(_nx_devkit.NX_VERSION)) throw new Error(`Nx v${require_minimum_supported_versions.MINIMUM_SUPPORTED_OXLINT_NX_VERSION} or newer is required to use the oxlint linter`);
11
+ (0, _nx_devkit.ensurePackage)("@nx/oxlint", _nx_devkit.NX_VERSION);
12
+ } else if (options.linter !== "none") (0, _nx_devkit.ensurePackage)("@nx/eslint", _nx_devkit.NX_VERSION);
9
13
  (0, _nx_devkit.ensurePackage)("@angular-devkit/core", "latest");
10
14
  (0, _nx_devkit.ensurePackage)("rxjs", "latest");
11
15
  const generatorModule = await Promise.resolve().then(() => require("../app/generator.js"));
@@ -1 +1 @@
1
- {"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/preset/generator.ts"],"sourcesContent":["import {\n ensurePackage,\n generateFiles,\n NX_VERSION,\n Tree,\n updateJson,\n} from '@nx/devkit';\nimport { join } from 'node:path';\nimport { PresetGeneratorSchema } from './schema';\n\nexport default async function (\n tree: Tree,\n options: PresetGeneratorSchema,\n): Promise<() => void> {\n ensurePackage('@nx/angular', NX_VERSION);\n ensurePackage('@nx/vite', NX_VERSION);\n ensurePackage('@nx/eslint', NX_VERSION);\n ensurePackage('@angular-devkit/core', 'latest');\n ensurePackage('rxjs', 'latest');\n\n const generatorModule = await import('../app/generator');\n const appGenerator =\n 'default' in generatorModule ? generatorModule.default : generatorModule;\n\n const installTask = await appGenerator(tree, {\n ...options,\n skipAgentContext: true,\n });\n\n // Seed agent context at the workspace root so AI coding assistants pick up\n // Analog conventions (see node_modules/@analogjs/platform/AGENTS.md).\n generateFiles(\n tree,\n join(__dirname, '..', 'app', 'files', 'agents'),\n '.',\n options,\n );\n\n if (tree.exists('/tsconfig.base.json')) {\n updateJson<{\n compilerOptions?: {\n baseUrl?: string;\n };\n }>(tree, '/tsconfig.base.json', (json) => {\n delete json.compilerOptions?.baseUrl;\n return json;\n });\n }\n\n return installTask;\n}\n"],"mappings":";;;;AAUA,eAAA,kBACE,MACA,SACqB;AACrB,EAAA,GAAA,WAAA,eAAc,eAAe,WAAA,WAAW;AACxC,EAAA,GAAA,WAAA,eAAc,YAAY,WAAA,WAAW;AACrC,EAAA,GAAA,WAAA,eAAc,cAAc,WAAA,WAAW;AACvC,EAAA,GAAA,WAAA,eAAc,wBAAwB,SAAS;AAC/C,EAAA,GAAA,WAAA,eAAc,QAAQ,SAAS;CAE/B,MAAM,kBAAkB,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,sBAAA,CAAA;CAI9B,MAAM,cAAc,OAFlB,aAAa,kBAAkB,gBAAgB,UAAU,iBAEpB,MAAM;EAC3C,GAAG;EACH,kBAAkB;EACnB,CAAC;AAIF,EAAA,GAAA,WAAA,eACE,OAAA,GAAA,UAAA,MACK,WAAW,MAAM,OAAO,SAAS,SAAS,EAC/C,KACA,QACD;AAED,KAAI,KAAK,OAAO,sBAAsB,CACpC,EAAA,GAAA,WAAA,YAIG,MAAM,wBAAwB,SAAS;AACxC,SAAO,KAAK,iBAAiB;AAC7B,SAAO;GACP;AAGJ,QAAO"}
1
+ {"version":3,"file":"generator.js","names":[],"sources":["../../../../../../../../nx-plugin/src/generators/preset/generator.ts"],"sourcesContent":["import {\n ensurePackage,\n generateFiles,\n NX_VERSION,\n Tree,\n updateJson,\n} from '@nx/devkit';\nimport { join } from 'node:path';\nimport {\n belowMinimumSupportedOxlintNxVersion,\n MINIMUM_SUPPORTED_OXLINT_NX_VERSION,\n} from '../app/versions/minimum-supported-versions';\nimport { PresetGeneratorSchema } from './schema';\n\nexport default async function (\n tree: Tree,\n options: PresetGeneratorSchema,\n): Promise<() => void> {\n ensurePackage('@nx/angular', NX_VERSION);\n ensurePackage('@nx/vite', NX_VERSION);\n if (options.linter === 'oxlint') {\n if (belowMinimumSupportedOxlintNxVersion(NX_VERSION)) {\n throw new Error(\n `Nx v${MINIMUM_SUPPORTED_OXLINT_NX_VERSION} or newer is required to use the oxlint linter`,\n );\n }\n ensurePackage('@nx/oxlint', NX_VERSION);\n } else if (options.linter !== 'none') {\n ensurePackage('@nx/eslint', NX_VERSION);\n }\n ensurePackage('@angular-devkit/core', 'latest');\n ensurePackage('rxjs', 'latest');\n\n const generatorModule = await import('../app/generator');\n const appGenerator =\n 'default' in generatorModule ? generatorModule.default : generatorModule;\n\n const installTask = await appGenerator(tree, {\n ...options,\n skipAgentContext: true,\n });\n\n // Seed agent context at the workspace root so AI coding assistants pick up\n // Analog conventions (see node_modules/@analogjs/platform/AGENTS.md).\n generateFiles(\n tree,\n join(__dirname, '..', 'app', 'files', 'agents'),\n '.',\n options,\n );\n\n if (tree.exists('/tsconfig.base.json')) {\n updateJson<{\n compilerOptions?: {\n baseUrl?: string;\n };\n }>(tree, '/tsconfig.base.json', (json) => {\n delete json.compilerOptions?.baseUrl;\n return json;\n });\n }\n\n return installTask;\n}\n"],"mappings":";;;;;AAcA,eAAA,kBACE,MACA,SACqB;AACrB,EAAA,GAAA,WAAA,eAAc,eAAe,WAAA,WAAW;AACxC,EAAA,GAAA,WAAA,eAAc,YAAY,WAAA,WAAW;AACrC,KAAI,QAAQ,WAAW,UAAU;AAC/B,MAAI,mCAAA,qCAAqC,WAAA,WAAW,CAClD,OAAM,IAAI,MACR,OAAO,mCAAA,oCAAoC,gDAC5C;AAEH,GAAA,GAAA,WAAA,eAAc,cAAc,WAAA,WAAW;YAC9B,QAAQ,WAAW,OAC5B,EAAA,GAAA,WAAA,eAAc,cAAc,WAAA,WAAW;AAEzC,EAAA,GAAA,WAAA,eAAc,wBAAwB,SAAS;AAC/C,EAAA,GAAA,WAAA,eAAc,QAAQ,SAAS;CAE/B,MAAM,kBAAkB,MAAA,QAAA,SAAA,CAAA,WAAA,QAAM,sBAAA,CAAA;CAI9B,MAAM,cAAc,OAFlB,aAAa,kBAAkB,gBAAgB,UAAU,iBAEpB,MAAM;EAC3C,GAAG;EACH,kBAAkB;EACnB,CAAC;AAIF,EAAA,GAAA,WAAA,eACE,OAAA,GAAA,UAAA,MACK,WAAW,MAAM,OAAO,SAAS,SAAS,EAC/C,KACA,QACD;AAED,KAAI,KAAK,OAAO,sBAAsB,CACpC,EAAA,GAAA,WAAA,YAIG,MAAM,wBAAwB,SAAS;AACxC,SAAO,KAAK,iBAAiB;AAC7B,SAAO;GACP;AAGJ,QAAO"}
@@ -2,5 +2,6 @@ export interface PresetGeneratorSchema {
2
2
  analogAppName: string;
3
3
  tags?: string;
4
4
  addTailwind?: boolean;
5
+ linter?: 'eslint' | 'oxlint' | 'none';
5
6
  skipFormat?: boolean;
6
7
  }
@@ -16,6 +16,12 @@
16
16
  "x-prompt": "Add TailwindCSS for styling?",
17
17
  "default": true
18
18
  },
19
+ "linter": {
20
+ "description": "The tool to use for running lint checks. `oxlint` requires Nx 23.2 or newer.",
21
+ "type": "string",
22
+ "enum": ["eslint", "oxlint", "none"],
23
+ "default": "eslint"
24
+ },
19
25
  "tags": {
20
26
  "type": "string",
21
27
  "description": "Add tags to the project (used for linting)",
@@ -1,13 +1,13 @@
1
- export declare const V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.88";
2
- export declare const V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.88";
1
+ export declare const V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.89";
2
+ export declare const V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.89";
3
3
  export declare const V19_X_MARKED = "^18.0.0";
4
4
  export declare const V19_X_MARKED_GFM_HEADING_ID = "^4.1.1";
5
5
  export declare const V19_X_MARKED_HIGHLIGHT = "^2.2.1";
6
6
  export declare const V19_X_MARKED_MANGLE = "^1.1.10";
7
7
  export declare const V19_X_PRISMJS = "^1.29.0";
8
- export declare const V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.88";
9
- export declare const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.88";
10
- export declare const V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.88";
8
+ export declare const V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.89";
9
+ export declare const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.89";
10
+ export declare const V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.89";
11
11
  export declare const V19_X_NX_ANGULAR = "^22.0.0";
12
12
  export declare const V19_X_NX_VITE = "^22.0.0";
13
13
  export declare const V19_X_JSDOM = "^22.0.0";
@@ -1,14 +1,14 @@
1
1
  //#region packages/nx-plugin/src/utils/versions/ng_19_X/versions.ts
2
- var V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.88";
3
- var V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.88";
2
+ var V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.89";
3
+ var V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.89";
4
4
  var V19_X_MARKED = "^18.0.0";
5
5
  var V19_X_MARKED_GFM_HEADING_ID = "^4.1.1";
6
6
  var V19_X_MARKED_HIGHLIGHT = "^2.2.1";
7
7
  var V19_X_MARKED_MANGLE = "^1.1.10";
8
8
  var V19_X_PRISMJS = "^1.29.0";
9
- var V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.88";
10
- var V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.88";
11
- var V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.88";
9
+ var V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.89";
10
+ var V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.89";
11
+ var V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.89";
12
12
  var V19_X_NX_VITE = "^22.0.0";
13
13
  var V19_X_JSDOM = "^22.0.0";
14
14
  var V19_X_VITE_TSCONFIG_PATHS = "^4.2.0";
@@ -1 +1 @@
1
- {"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/utils/versions/ng_19_X/versions.ts"],"sourcesContent":["// V19_X\nexport const V19_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.88';\nexport const V19_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.88';\nexport const V19_X_MARKED = '^18.0.0';\nexport const V19_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V19_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V19_X_MARKED_MANGLE = '^1.1.10';\nexport const V19_X_PRISMJS = '^1.29.0';\n\n// devDependencies\nexport const V19_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.88';\nexport const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.88';\nexport const V19_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.88';\nexport const V19_X_NX_ANGULAR = '^22.0.0';\nexport const V19_X_NX_VITE = '^22.0.0';\nexport const V19_X_JSDOM = '^22.0.0';\nexport const V19_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V19_X_VITEST = '^3.0.0';\nexport const V19_X_VITE = '^6.0.0';\nexport const NX_X_LATEST_VITE = '^8.0.0';\nexport const NX_X_LATEST_VITEST = '^4.0.0';\nexport const NX_X_LATEST_NX = '^23.0.0';\n"],"mappings":";AACA,IAAa,yBAAyB;AACtC,IAAa,0BAA0B;AACvC,IAAa,eAAe;AAC5B,IAAa,8BAA8B;AAC3C,IAAa,yBAAyB;AACtC,IAAa,sBAAsB;AACnC,IAAa,gBAAgB;AAG7B,IAAa,2BAA2B;AACxC,IAAa,sCAAsC;AACnD,IAAa,iCAAiC;AAE9C,IAAa,gBAAgB;AAC7B,IAAa,cAAc;AAC3B,IAAa,4BAA4B;AACzC,IAAa,eAAe;AAC5B,IAAa,aAAa;AAC1B,IAAa,mBAAmB;AAChC,IAAa,qBAAqB;AAClC,IAAa,iBAAiB"}
1
+ {"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/utils/versions/ng_19_X/versions.ts"],"sourcesContent":["// V19_X\nexport const V19_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.89';\nexport const V19_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.89';\nexport const V19_X_MARKED = '^18.0.0';\nexport const V19_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V19_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V19_X_MARKED_MANGLE = '^1.1.10';\nexport const V19_X_PRISMJS = '^1.29.0';\n\n// devDependencies\nexport const V19_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.89';\nexport const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.89';\nexport const V19_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.89';\nexport const V19_X_NX_ANGULAR = '^22.0.0';\nexport const V19_X_NX_VITE = '^22.0.0';\nexport const V19_X_JSDOM = '^22.0.0';\nexport const V19_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V19_X_VITEST = '^3.0.0';\nexport const V19_X_VITE = '^6.0.0';\nexport const NX_X_LATEST_VITE = '^8.0.0';\nexport const NX_X_LATEST_VITEST = '^4.0.0';\nexport const NX_X_LATEST_NX = '^23.0.0';\n"],"mappings":";AACA,IAAa,yBAAyB;AACtC,IAAa,0BAA0B;AACvC,IAAa,eAAe;AAC5B,IAAa,8BAA8B;AAC3C,IAAa,yBAAyB;AACtC,IAAa,sBAAsB;AACnC,IAAa,gBAAgB;AAG7B,IAAa,2BAA2B;AACxC,IAAa,sCAAsC;AACnD,IAAa,iCAAiC;AAE9C,IAAa,gBAAgB;AAC7B,IAAa,cAAc;AAC3B,IAAa,4BAA4B;AACzC,IAAa,eAAe;AAC5B,IAAa,aAAa;AAC1B,IAAa,mBAAmB;AAChC,IAAa,qBAAqB;AAClC,IAAa,iBAAiB"}