create-analog 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (87) hide show
  1. package/files/styles.css +4 -85
  2. package/index.js +25 -93
  3. package/package.json +3 -3
  4. package/template-angular-v17/package.json +8 -8
  5. package/template-angular-v18/package.json +9 -9
  6. package/template-angular-v18/vite.config.ts +1 -1
  7. package/{template-angular-v16 → template-angular-v19}/README.md +1 -1
  8. package/{template-angular-v16 → template-angular-v19}/_gitignore +2 -0
  9. package/{template-angular-v16 → template-angular-v19}/angular.json +1 -1
  10. package/{template-angular-v16 → template-angular-v19}/index.html +1 -1
  11. package/template-angular-v19/package.json +53 -0
  12. package/{template-latest → template-angular-v19}/src/app/app.component.ts +0 -1
  13. package/{template-angular-v16 → template-angular-v19}/src/app/app.config.server.ts +3 -8
  14. package/template-angular-v19/src/app/app.config.ts +20 -0
  15. package/template-angular-v19/src/app/pages/index.page.ts +54 -0
  16. package/template-angular-v19/src/main.server.ts +8 -0
  17. package/{template-angular-v16 → template-angular-v19}/src/main.ts +2 -2
  18. package/{template-angular-v16 → template-angular-v19}/src/styles.css +5 -0
  19. package/{template-angular-v16 → template-angular-v19}/tsconfig.app.json +2 -3
  20. package/{template-angular-v16 → template-angular-v19}/tsconfig.json +3 -6
  21. package/{template-angular-v16 → template-angular-v19}/tsconfig.spec.json +3 -3
  22. package/{template-angular-v16 → template-angular-v19}/vite.config.ts +5 -4
  23. package/template-blog/.vscode/extensions.json +1 -1
  24. package/template-blog/angular.json +1 -1
  25. package/template-blog/package.json +24 -18
  26. package/template-blog/src/app/app.config.ts +8 -3
  27. package/{template-latest/src/app/app.component.spec.ts → template-blog/src/app/app.spec.ts} +1 -1
  28. package/template-blog/src/app/{app.component.ts → app.ts} +0 -1
  29. package/template-blog/src/app/pages/blog/[slug].page.ts +0 -1
  30. package/template-blog/src/app/pages/blog/index.page.ts +0 -1
  31. package/template-blog/src/test-setup.ts +6 -5
  32. package/template-blog/tsconfig.json +5 -3
  33. package/template-blog/vite.config.ts +3 -3
  34. package/template-latest/.vscode/extensions.json +1 -1
  35. package/template-latest/angular.json +1 -1
  36. package/template-latest/package.json +24 -18
  37. package/template-latest/src/app/app.config.ts +8 -3
  38. package/template-latest/src/app/{app-root.spec.ts → app.spec.ts} +4 -4
  39. package/template-latest/src/app/app.ts +17 -0
  40. package/template-latest/src/app/pages/analog-welcome.ts +263 -0
  41. package/template-latest/src/app/pages/index.page.ts +5 -47
  42. package/template-latest/src/styles.css +3 -79
  43. package/template-latest/src/test-setup.ts +6 -5
  44. package/template-latest/tsconfig.json +5 -3
  45. package/template-latest/vite.config.ts +4 -2
  46. package/template-minimal/.vscode/extensions.json +1 -1
  47. package/template-minimal/angular.json +1 -1
  48. package/template-minimal/package.json +24 -18
  49. package/template-minimal/src/app/app.config.ts +8 -3
  50. package/template-minimal/src/app/{app.component.ts → app.ts} +0 -1
  51. package/template-minimal/src/app/pages/index.page.ts +0 -1
  52. package/template-minimal/tsconfig.json +1 -1
  53. package/template-minimal/vite.config.ts +3 -3
  54. package/files/analog-env.d.ts +0 -13
  55. package/files/postcss.config.cjs +0 -6
  56. package/files/tailwind.config.ts +0 -9
  57. package/template-angular-v16/package.json +0 -54
  58. package/template-angular-v16/src/app/app.component.spec.ts +0 -17
  59. package/template-angular-v16/src/app/app.component.ts +0 -20
  60. package/template-angular-v16/src/app/app.config.ts +0 -12
  61. package/template-angular-v16/src/app/pages/index.page.ts +0 -49
  62. package/template-angular-v16/src/main.server.ts +0 -26
  63. package/template-angular-v18/src/app/app-root.ag +0 -16
  64. package/template-angular-v18/src/app/app-root.spec.ts +0 -20
  65. package/template-angular-v18/src/app/pages/index.page.ag +0 -53
  66. package/template-blog/src/app/app-root.ag +0 -25
  67. package/template-blog/src/app/app-root.spec.ts +0 -20
  68. package/template-blog/src/app/pages/blog/[slug].page.ag +0 -24
  69. package/template-blog/src/app/pages/blog/index.page.ag +0 -32
  70. package/template-latest/src/app/app-root.ag +0 -16
  71. package/template-latest/src/app/pages/index.page.ag +0 -53
  72. package/template-minimal/src/app/app-root.ag +0 -7
  73. package/template-minimal/src/app/pages/index.page.ag +0 -32
  74. /package/{template-angular-v16 → template-angular-v19}/.editorconfig +0 -0
  75. /package/{template-angular-v16 → template-angular-v19}/.vscode/extensions.json +0 -0
  76. /package/{template-angular-v16 → template-angular-v19}/.vscode/launch.json +0 -0
  77. /package/{template-angular-v16 → template-angular-v19}/.vscode/tasks.json +0 -0
  78. /package/{template-angular-v16/src/assets → template-angular-v19/public}/.gitkeep +0 -0
  79. /package/{template-angular-v16/src/assets → template-angular-v19/public}/analog.svg +0 -0
  80. /package/{template-angular-v16 → template-angular-v19/public}/favicon.ico +0 -0
  81. /package/{template-angular-v16/src/assets → template-angular-v19/public}/vite.svg +0 -0
  82. /package/{template-blog → template-angular-v19}/src/app/app.component.spec.ts +0 -0
  83. /package/{template-angular-v16/src/server/routes → template-angular-v19/src/server/routes/api}/v1/hello.ts +0 -0
  84. /package/{template-angular-v16/src/test.ts → template-angular-v19/src/test-setup.ts} +0 -0
  85. /package/{template-angular-v16 → template-angular-v19}/src/vite-env.d.ts +0 -0
  86. /package/template-blog/src/server/routes/{v1 → api/v1}/hello.ts +0 -0
  87. /package/template-latest/src/server/routes/{v1 → api/v1}/hello.ts +0 -0
package/files/styles.css CHANGED
@@ -1,89 +1,8 @@
1
- /* Tailwind directives */
2
- @tailwind base;
3
- @tailwind components;
4
- @tailwind utilities;
1
+ @import 'tailwindcss';
5
2
 
6
3
  /* You can add global styles to this file, and also import other style files */
7
- :root {
8
- font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
9
- font-size: 16px;
10
- line-height: 24px;
11
- font-weight: 400;
12
-
13
- color-scheme: light dark;
14
- color: rgba(255, 255, 255, 0.87);
15
- background-color: #242424;
16
-
17
- font-synthesis: none;
18
- text-rendering: optimizeLegibility;
19
- -webkit-font-smoothing: antialiased;
20
- -moz-osx-font-smoothing: grayscale;
21
- -webkit-text-size-adjust: 100%;
22
- }
23
-
24
- a {
25
- font-weight: 500;
26
- color: #646cff;
27
- text-decoration: inherit;
28
- }
29
-
30
- a:hover {
31
- color: #535bf2;
32
- }
33
-
4
+ html,
34
5
  body {
35
- margin: 0;
36
- display: flex;
37
- place-items: center;
38
- min-width: 320px;
39
- min-height: 100vh;
40
- }
41
-
42
- h1 {
43
- font-size: 3.2em;
44
- line-height: 1.1;
45
- }
46
-
47
- button {
48
- border-radius: 8px;
49
- border: 1px solid transparent;
50
- padding: 0.6em 1.2em;
51
- font-size: 1em;
52
- font-weight: 500;
53
- font-family: inherit;
54
- background-color: #1a1a1a;
55
- cursor: pointer;
56
- transition: border-color 0.25s;
57
- }
58
-
59
- button:hover {
60
- border-color: #646cff;
61
- }
62
-
63
- button:focus,
64
- button:focus-visible {
65
- outline: 4px auto -webkit-focus-ring-color;
66
- }
67
-
68
- .card {
69
- padding: 2em;
70
- }
71
-
72
- .logo {
73
- @apply box-content;
74
- }
75
-
76
- @media (prefers-color-scheme: light) {
77
- :root {
78
- color: #213547;
79
- background-color: #ffffff;
80
- }
81
-
82
- a:hover {
83
- color: #747bff;
84
- }
85
-
86
- button {
87
- background-color: #f9f9f9;
88
- }
6
+ display: block;
7
+ height: 100%;
89
8
  }
package/index.js CHANGED
@@ -42,7 +42,7 @@ const HIGHLIGHTERS = {
42
42
  highlighter: 'withPrismHighlighter',
43
43
  entryPoint: 'prism-highlighter',
44
44
  dependencies: {
45
- 'marked-highlight': '^2.0.1',
45
+ 'marked-highlight': '^2.2.1',
46
46
  prismjs: '^1.29.0',
47
47
  },
48
48
  },
@@ -50,7 +50,7 @@ const HIGHLIGHTERS = {
50
50
  highlighter: 'withShikiHighlighter',
51
51
  entryPoint: 'shiki-highlighter',
52
52
  dependencies: {
53
- marked: '^7.0.0',
53
+ marked: '^15.0.7',
54
54
  'marked-shiki': '^1.1.0',
55
55
  shiki: '^1.6.1',
56
56
  },
@@ -65,7 +65,6 @@ async function init() {
65
65
  let targetDir = formatTargetDir(argv._[0]);
66
66
  let template = argv.template || argv.t;
67
67
  let skipTailwind = fromBoolArg(argv.skipTailwind);
68
- let useAnalogSFC = fromBoolArg(argv.analogSFC);
69
68
 
70
69
  const defaultTargetDir = 'analog-project';
71
70
  const getProjectName = () =>
@@ -135,11 +134,6 @@ async function init() {
135
134
  })),
136
135
  initial: 1,
137
136
  },
138
- {
139
- type: useAnalogSFC === undefined ? 'confirm' : null,
140
- name: 'analogSFC',
141
- message: 'Would you like to use Analog SFCs?',
142
- },
143
137
  {
144
138
  type: skipTailwind === undefined ? 'confirm' : null,
145
139
  name: 'tailwind',
@@ -150,7 +144,7 @@ async function init() {
150
144
  onCancel: () => {
151
145
  throw new Error(red('✖') + ' Operation cancelled');
152
146
  },
153
- }
147
+ },
154
148
  );
155
149
  } catch (cancelled) {
156
150
  console.log(cancelled.message);
@@ -163,7 +157,6 @@ async function init() {
163
157
  overwrite,
164
158
  packageName,
165
159
  variant,
166
- analogSFC,
167
160
  tailwind,
168
161
  syntaxHighlighter,
169
162
  } = result;
@@ -181,14 +174,13 @@ async function init() {
181
174
  // determine syntax highlighter
182
175
  let highlighter = syntaxHighlighter ?? (template === 'blog' ? 'prism' : null);
183
176
  skipTailwind = skipTailwind ?? !tailwind;
184
- useAnalogSFC = useAnalogSFC ?? analogSFC;
185
177
 
186
178
  console.log(`\nScaffolding project in ${root}...`);
187
179
 
188
180
  const templateDir = path.resolve(
189
181
  fileURLToPath(import.meta.url),
190
182
  '..',
191
- `template-${template}`
183
+ `template-${template}`,
192
184
  );
193
185
 
194
186
  const filesDir = path.resolve(fileURLToPath(import.meta.url), '..', `files`);
@@ -211,15 +203,20 @@ async function init() {
211
203
  }
212
204
 
213
205
  if (!skipTailwind) {
214
- addTailwindConfig(write, filesDir);
215
- addPostCssConfig(write, filesDir);
216
206
  addTailwindDirectives(write, filesDir);
217
207
  }
218
208
 
209
+ replacePlaceholders(root, 'vite.config.ts', {
210
+ __TAILWIND_IMPORT__: !skipTailwind
211
+ ? `\nimport tailwindcss from '@tailwindcss/vite';`
212
+ : '',
213
+ __TAILWIND_PLUGIN__: !skipTailwind ? '\n tailwindcss()' : '',
214
+ });
215
+
219
216
  const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);
220
217
  const pkgManager = pkgInfo ? pkgInfo.name : 'npm';
221
218
  const pkg = JSON.parse(
222
- fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8')
219
+ fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8'),
223
220
  );
224
221
 
225
222
  pkg.name = packageName || getProjectName();
@@ -230,7 +227,7 @@ async function init() {
230
227
  }
231
228
 
232
229
  if (!skipTailwind) {
233
- addTailwindDevDependencies(pkg);
230
+ addTailwindDependencies(pkg);
234
231
  }
235
232
 
236
233
  if (pkgManager === 'yarn') {
@@ -243,7 +240,6 @@ async function init() {
243
240
  write('package.json', JSON.stringify(pkg, null, 2));
244
241
 
245
242
  setProjectTitle(root, getProjectName());
246
- setComponentFormat(root, filesDir, write, template, useAnalogSFC);
247
243
 
248
244
  console.log(`\nInitializing git repository:`);
249
245
  execSync(`git init ${targetDir} && cd ${targetDir} && git add .`);
@@ -284,7 +280,7 @@ function copy(src, dest) {
284
280
  */
285
281
  function isValidPackageName(projectName) {
286
282
  return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(
287
- projectName
283
+ projectName,
288
284
  );
289
285
  }
290
286
 
@@ -366,40 +362,23 @@ function getStartCommand(pkgManager) {
366
362
  function addTailwindDirectives(write, filesDir) {
367
363
  write(
368
364
  'src/styles.css',
369
- fs.readFileSync(path.join(filesDir, `styles.css`), 'utf-8')
370
- );
371
- }
372
-
373
- function addPostCssConfig(write, filesDir) {
374
- write(
375
- 'postcss.config.cjs',
376
- fs.readFileSync(path.join(filesDir, `postcss.config.cjs`), 'utf-8')
377
- );
378
- }
379
-
380
- function addTailwindConfig(write, filesDir) {
381
- write(
382
- 'tailwind.config.ts',
383
- fs.readFileSync(path.join(filesDir, `tailwind.config.ts`), 'utf-8')
365
+ fs.readFileSync(path.join(filesDir, `styles.css`), 'utf-8'),
384
366
  );
385
367
  }
386
368
 
387
- function addTailwindDevDependencies(pkg) {
388
- ['tailwindcss@^3.3.1', 'postcss@^8.4.21', 'autoprefixer@^10.4.14'].forEach(
389
- (packageName) => {
390
- const [name, version] = packageName.split('@');
391
- pkg.devDependencies[name] = version;
392
- }
393
- );
369
+ function addTailwindDependencies(pkg) {
370
+ pkg.dependencies['tailwindcss'] = '^4.1.4';
371
+ pkg.dependencies['postcss'] = '^8.5.3';
372
+ pkg.dependencies['@tailwindcss/vite'] = '^4.1.4';
394
373
  }
395
374
 
396
375
  function addYarnDevDependencies(pkg, template) {
397
376
  // v18
398
- if (template === 'latest' || template === 'blog') {
399
- pkg.devDependencies['@nx/angular'] = '^19.1.0';
400
- pkg.devDependencies['@nx/devkit'] = '^19.1.0';
401
- pkg.devDependencies['@nx/vite'] = '^19.1.0';
402
- pkg.devDependencies['nx'] = '^19.1.0';
377
+ if (template === 'latest' || template === 'blog' || template === 'minimal') {
378
+ pkg.devDependencies['@nx/angular'] = '^21.0.0';
379
+ pkg.devDependencies['@nx/devkit'] = '^21.0.0';
380
+ pkg.devDependencies['@nx/vite'] = '^21.0.0';
381
+ pkg.devDependencies['nx'] = '^21.0.0';
403
382
  } else if (template === 'angular-v17') {
404
383
  pkg.devDependencies['@angular-devkit/build-angular'] = '^17.2.0';
405
384
  }
@@ -436,47 +415,6 @@ function setProjectTitle(root, title) {
436
415
  });
437
416
  }
438
417
 
439
- function setComponentFormat(root, filesDir, write, template, useAnalogSFC) {
440
- const getSFCConfig = () => {
441
- const sfcConfigOption =
442
- 'vite: { experimental: { supportAnalogFormat: true } }';
443
-
444
- return template === 'latest'
445
- ? `{ ${sfcConfigOption} }`
446
- : `\n ${sfcConfigOption},`;
447
- };
448
-
449
- replacePlaceholders(root, 'vite.config.ts', {
450
- __ANALOG_SFC_CONFIG__: useAnalogSFC ? getSFCConfig() : '',
451
- });
452
- replacePlaceholders(root, ['src/main.ts', 'src/main.server.ts'], {
453
- __APP_COMPONENT__: useAnalogSFC ? 'App' : 'AppComponent',
454
- __APP_COMPONENT_IMPORT__: useAnalogSFC
455
- ? "import App from './app/app-root.ag';"
456
- : "import { AppComponent } from './app/app.component';",
457
- });
458
-
459
- const cmpForDelete = useAnalogSFC ? 'app.component' : 'app-root';
460
- const deleteExt = useAnalogSFC ? 'ts' : 'ag';
461
- deleteFiles(root, [
462
- useAnalogSFC ? `src/app/${cmpForDelete}.ts` : `src/app/${cmpForDelete}.ag`,
463
- template === 'blog'
464
- ? [
465
- `src/app/pages/blog/index.page.${deleteExt}`,
466
- `src/app/pages/blog/[slug].page.${deleteExt}`,
467
- ]
468
- : `src/app/pages/index.page.${deleteExt}`,
469
- template !== 'minimal' && `src/app/${cmpForDelete}.spec.ts`,
470
- ]);
471
-
472
- if (useAnalogSFC) {
473
- write(
474
- 'src/analog-env.d.ts',
475
- fs.readFileSync(path.join(filesDir, 'analog-env.d.ts'), 'utf-8')
476
- );
477
- }
478
- }
479
-
480
418
  function replacePlaceholders(root, files, config) {
481
419
  for (const file of toFlatArray(files)) {
482
420
  const filePath = path.join(root, file);
@@ -484,18 +422,12 @@ function replacePlaceholders(root, files, config) {
484
422
  const newFileContent = Object.keys(config).reduce(
485
423
  (content, placeholder) =>
486
424
  content.replace(RegExp(placeholder, 'g'), config[placeholder]),
487
- fileContent
425
+ fileContent,
488
426
  );
489
427
  fs.writeFileSync(filePath, newFileContent);
490
428
  }
491
429
  }
492
430
 
493
- function deleteFiles(root, files) {
494
- for (const file of toFlatArray(files)) {
495
- fs.unlinkSync(path.join(root, file));
496
- }
497
- }
498
-
499
431
  function toFlatArray(value) {
500
432
  return (Array.isArray(value) ? value : [value]).filter(Boolean).flat();
501
433
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-analog",
3
- "version": "2.0.0-alpha.2",
3
+ "version": "2.0.0-alpha.21",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Brandon Roberts",
@@ -10,9 +10,9 @@
10
10
  },
11
11
  "files": [
12
12
  "index.js",
13
- "template-angular-v16",
14
13
  "template-angular-v17",
15
14
  "template-angular-v18",
15
+ "template-angular-v19",
16
16
  "template-blog",
17
17
  "template-latest",
18
18
  "template-minimal",
@@ -20,7 +20,7 @@
20
20
  ],
21
21
  "main": "index.js",
22
22
  "engines": {
23
- "node": "^18.13.0 || ^20.0.0"
23
+ "node": ">=20.0.0"
24
24
  },
25
25
  "repository": {
26
26
  "type": "git",
@@ -15,8 +15,8 @@
15
15
  "test": "ng test"
16
16
  },
17
17
  "dependencies": {
18
- "@analogjs/content": "^2.0.0-alpha.2",
19
- "@analogjs/router": "^2.0.0-alpha.2",
18
+ "@analogjs/content": "^2.0.0-alpha.21",
19
+ "@analogjs/router": "^2.0.0-alpha.21",
20
20
  "@angular/animations": "^17.2.0",
21
21
  "@angular/common": "^17.2.0",
22
22
  "@angular/compiler": "^17.2.0",
@@ -28,9 +28,9 @@
28
28
  "@angular/router": "^17.2.0",
29
29
  "@nx/angular": "~18.0.0",
30
30
  "front-matter": "^4.0.2",
31
- "marked": "^5.0.2",
32
- "marked-gfm-heading-id": "^3.1.0",
33
- "marked-highlight": "^2.0.1",
31
+ "marked": "^15.0.7",
32
+ "marked-gfm-heading-id": "^4.1.1",
33
+ "marked-highlight": "^2.2.1",
34
34
  "mermaid": "^10.2.4",
35
35
  "prismjs": "^1.29.0",
36
36
  "rxjs": "~7.5.6",
@@ -38,9 +38,9 @@
38
38
  "zone.js": "~0.14.0"
39
39
  },
40
40
  "devDependencies": {
41
- "@analogjs/platform": "^2.0.0-alpha.2",
42
- "@analogjs/vite-plugin-angular": "^2.0.0-alpha.2",
43
- "@analogjs/vitest-angular": "^2.0.0-alpha.2",
41
+ "@analogjs/platform": "^2.0.0-alpha.21",
42
+ "@analogjs/vite-plugin-angular": "^2.0.0-alpha.21",
43
+ "@analogjs/vitest-angular": "^2.0.0-alpha.21",
44
44
  "@angular-devkit/build-angular": "^17.2.0",
45
45
  "@angular/cli": "^17.2.0",
46
46
  "@angular/compiler-cli": "^17.2.0",
@@ -15,8 +15,8 @@
15
15
  },
16
16
  "private": true,
17
17
  "dependencies": {
18
- "@analogjs/content": "^2.0.0-alpha.2",
19
- "@analogjs/router": "^2.0.0-alpha.2",
18
+ "@analogjs/content": "^2.0.0-alpha.21",
19
+ "@analogjs/router": "^2.0.0-alpha.21",
20
20
  "@angular/animations": "^18.0.0",
21
21
  "@angular/build": "^18.0.0",
22
22
  "@angular/common": "^18.0.0",
@@ -28,19 +28,19 @@
28
28
  "@angular/platform-server": "^18.0.0",
29
29
  "@angular/router": "^18.0.0",
30
30
  "front-matter": "^4.0.2",
31
- "marked": "^5.0.2",
32
- "marked-gfm-heading-id": "^3.1.0",
33
- "marked-highlight": "^2.0.1",
34
- "marked-mangle": "^1.1.7",
31
+ "marked": "^15.0.7",
32
+ "marked-gfm-heading-id": "^4.1.1",
33
+ "marked-highlight": "^2.2.1",
34
+ "marked-mangle": "^1.1.10",
35
35
  "prismjs": "^1.29.0",
36
36
  "rxjs": "~7.8.0",
37
37
  "tslib": "^2.3.0",
38
38
  "zone.js": "~0.14.3"
39
39
  },
40
40
  "devDependencies": {
41
- "@analogjs/platform": "^2.0.0-alpha.2",
42
- "@analogjs/vite-plugin-angular": "^2.0.0-alpha.2",
43
- "@analogjs/vitest-angular": "^2.0.0-alpha.2",
41
+ "@analogjs/platform": "^2.0.0-alpha.21",
42
+ "@analogjs/vite-plugin-angular": "^2.0.0-alpha.21",
43
+ "@analogjs/vitest-angular": "^2.0.0-alpha.21",
44
44
  "@angular/cli": "^18.0.0",
45
45
  "@angular/compiler-cli": "^18.0.0",
46
46
  "jsdom": "^22.0.0",
@@ -11,7 +11,7 @@ export default defineConfig(({ mode }) => ({
11
11
  resolve: {
12
12
  mainFields: ['module'],
13
13
  },
14
- plugins: [analog(__ANALOG_SFC_CONFIG__)],
14
+ plugins: [analog()],
15
15
  test: {
16
16
  globals: true,
17
17
  environment: 'jsdom',
@@ -1,4 +1,4 @@
1
- # Analog App
1
+ # __PROJECT_TITLE__
2
2
 
3
3
  This project was generated with [Analog](https://analogjs.org), the fullstack meta-framework for Angular.
4
4
 
@@ -30,6 +30,8 @@ yarn-error.log
30
30
 
31
31
  # Miscellaneous
32
32
  /.angular/cache
33
+ /.nx/cache
34
+ /.nx/workspace-data
33
35
  .sass-cache/
34
36
  /connect.lock
35
37
  /coverage
@@ -5,7 +5,7 @@
5
5
  "projects": {
6
6
  "my-app": {
7
7
  "projectType": "application",
8
- "root": "",
8
+ "root": ".",
9
9
  "sourceRoot": "src",
10
10
  "prefix": "app",
11
11
  "architect": {
@@ -2,7 +2,7 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
- <title>MyApp</title>
5
+ <title>__PROJECT_TITLE__</title>
6
6
  <base href="/" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1" />
8
8
  <link rel="icon" type="image/x-icon" href="/favicon.ico" />
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "my-app",
3
+ "version": "0.0.0",
4
+ "type": "module",
5
+ "engines": {
6
+ "node": ">=18.19.1"
7
+ },
8
+ "scripts": {
9
+ "ng": "ng",
10
+ "dev": "ng serve",
11
+ "start": "ng serve",
12
+ "build": "ng build",
13
+ "watch": "ng build --watch --configuration development",
14
+ "test": "ng test"
15
+ },
16
+ "private": true,
17
+ "dependencies": {
18
+ "@analogjs/content": "^1.17.0-beta.6",
19
+ "@analogjs/router": "^1.17.0-beta.6",
20
+ "@angular/animations": "^19.0.0",
21
+ "@angular/common": "^19.0.0",
22
+ "@angular/compiler": "^19.0.0",
23
+ "@angular/core": "^19.0.0",
24
+ "@angular/forms": "^19.0.0",
25
+ "@angular/platform-browser": "^19.0.0",
26
+ "@angular/platform-browser-dynamic": "^19.0.0",
27
+ "@angular/platform-server": "^19.0.0",
28
+ "@angular/router": "^19.0.0",
29
+ "front-matter": "^4.0.2",
30
+ "marked": "^15.0.7",
31
+ "marked-gfm-heading-id": "^4.1.1",
32
+ "marked-highlight": "^2.2.1",
33
+ "marked-mangle": "^1.1.10",
34
+ "prismjs": "^1.29.0",
35
+ "rxjs": "~7.8.0",
36
+ "tslib": "^2.3.0",
37
+ "zone.js": "~0.15.0"
38
+ },
39
+ "devDependencies": {
40
+ "@analogjs/platform": "^1.17.0-beta.6",
41
+ "@analogjs/vite-plugin-angular": "^1.17.0-beta.6",
42
+ "@analogjs/vitest-angular": "^1.17.0-beta.6",
43
+ "@angular-devkit/build-angular": "^19.0.0",
44
+ "@angular/build": "^19.0.0",
45
+ "@angular/cli": "^19.0.0",
46
+ "@angular/compiler-cli": "^19.0.0",
47
+ "jsdom": "^22.0.0",
48
+ "typescript": "~5.8.0",
49
+ "vite": "^6.0.0",
50
+ "vite-tsconfig-paths": "^4.2.0",
51
+ "vitest": "^3.0.0"
52
+ }
53
+ }
@@ -3,7 +3,6 @@ import { RouterOutlet } from '@angular/router';
3
3
 
4
4
  @Component({
5
5
  selector: 'app-root',
6
- standalone: true,
7
6
  imports: [RouterOutlet],
8
7
  template: `<router-outlet />`,
9
8
  styles: `
@@ -1,15 +1,10 @@
1
1
  import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
2
- import {
3
- provideServerRendering,
4
- ɵSERVER_CONTEXT as SERVER_CONTEXT,
5
- } from '@angular/platform-server';
2
+ import { provideServerRendering } from '@angular/platform-server';
3
+
6
4
  import { appConfig } from './app.config';
7
5
 
8
6
  const serverConfig: ApplicationConfig = {
9
- providers: [
10
- provideServerRendering(),
11
- { provide: SERVER_CONTEXT, useValue: 'ssr-analog' },
12
- ],
7
+ providers: [provideServerRendering()],
13
8
  };
14
9
 
15
10
  export const config = mergeApplicationConfig(appConfig, serverConfig);
@@ -0,0 +1,20 @@
1
+ import {
2
+ provideHttpClient,
3
+ withFetch,
4
+ withInterceptors,
5
+ } from '@angular/common/http';
6
+ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
7
+ import { provideClientHydration } from '@angular/platform-browser';
8
+ import { provideFileRouter, requestContextInterceptor } from '@analogjs/router';
9
+
10
+ export const appConfig: ApplicationConfig = {
11
+ providers: [
12
+ provideZoneChangeDetection({ eventCoalescing: true }),
13
+ provideFileRouter(),
14
+ provideHttpClient(
15
+ withFetch(),
16
+ withInterceptors([requestContextInterceptor])
17
+ ),
18
+ provideClientHydration(),
19
+ ],
20
+ };
@@ -0,0 +1,54 @@
1
+ import { Component, signal } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-home',
5
+ template: `
6
+ <div>
7
+ <a href="https://analogjs.org/" target="_blank">
8
+ <img alt="Analog Logo" class="logo analog" src="/analog.svg" />
9
+ </a>
10
+ </div>
11
+
12
+ <h2>Analog</h2>
13
+
14
+ <h3>The fullstack meta-framework for Angular!</h3>
15
+
16
+ <div class="card">
17
+ <button type="button" (click)="increment()">Count {{ count() }}</button>
18
+ </div>
19
+
20
+ <p class="read-the-docs">
21
+ <a href="https://analogjs.org" target="_blank">Docs</a> |
22
+ <a href="https://github.com/analogjs/analog" target="_blank">GitHub</a> |
23
+ <a href="https://github.com/sponsors/brandonroberts" target="_blank">
24
+ Sponsor
25
+ </a>
26
+ </p>
27
+ `,
28
+ styles: `
29
+ .logo {
30
+ will-change: filter;
31
+ }
32
+
33
+ .logo:hover {
34
+ filter: drop-shadow(0 0 2em #646cffaa);
35
+ }
36
+
37
+ .read-the-docs > * {
38
+ color: #fff;
39
+ }
40
+
41
+ @media (prefers-color-scheme: light) {
42
+ .read-the-docs > * {
43
+ color: #213547;
44
+ }
45
+ }
46
+ `,
47
+ })
48
+ export default class HomeComponent {
49
+ count = signal(0);
50
+
51
+ increment() {
52
+ this.count.update((count) => count + 1);
53
+ }
54
+ }
@@ -0,0 +1,8 @@
1
+ import 'zone.js/node';
2
+ import '@angular/platform-server/init';
3
+ import { render } from '@analogjs/router/server';
4
+
5
+ __APP_COMPONENT_IMPORT__
6
+ import { config } from './app/app.config.server';
7
+
8
+ export default render(__APP_COMPONENT__, config);
@@ -1,7 +1,7 @@
1
1
  import 'zone.js';
2
2
  import { bootstrapApplication } from '@angular/platform-browser';
3
3
 
4
- import { AppComponent } from './app/app.component';
4
+ __APP_COMPONENT_IMPORT__
5
5
  import { appConfig } from './app/app.config';
6
6
 
7
- bootstrapApplication(AppComponent, appConfig);
7
+ bootstrapApplication(__APP_COMPONENT__, appConfig);