1
1
import { describe , it , expect } from 'vitest' ;
2
2
import * as prettier from 'prettier' ;
3
3
import { createRequire } from 'node:module' ;
4
+ import os from 'node:os' ;
5
+ import { join } from 'node:path' ;
6
+ import { $ } from 'execa' ;
7
+ import { readFile , mkdtemp , writeFile } from 'node:fs/promises' ;
4
8
9
+ const monorepoRoot = join ( import . meta. dirname , '../../../../' ) ;
5
10
const require = createRequire ( import . meta. url ) ;
6
11
7
12
/**
@@ -15,7 +20,7 @@ describe('Prettier', () => {
15
20
it ( `SANITY: we've symlinked to the in-repo copy of @glimmer/syntax` , async ( ) => {
16
21
let workspacePath = require . resolve ( '@glimmer/syntax' ) ;
17
22
let prettierPath = require . resolve ( 'prettier' ) ;
18
- let prettierGlimmer = require . resolve ( '@glimmer/syntax' , { paths : [ prettierPath ] } ) ;
23
+ let prettierGlimmer = require . resolve ( '@glimmer/syntax' , { paths : [ prettierPath ] } ) ;
19
24
20
25
expect ( prettierGlimmer ) . toBe ( workspacePath ) ;
21
26
} ) ;
@@ -34,4 +39,108 @@ describe('Prettier', () => {
34
39
</div>"
35
40
` ) ;
36
41
} ) ;
42
+
43
+ /**
44
+ * This is important because we don't test the code we ship to npm
45
+ * (the code we ship to npm goes through a build process, and we opted
46
+ * to not do that for in-repo dev ergonomics)
47
+ *
48
+ * Process:
49
+ * 1. build @glimmer/syntax (and dependencies)
50
+ * 2. creat a tmp folder
51
+ * 3. create a project in that tmp folder
52
+ * 4. pack and add the tarballs to the project
53
+ * 6. See if a basic import and call to pre-process works
54
+ */
55
+ it ( 'Uses the real build, and not our monorepo infra' , async ( ) => {
56
+ /**
57
+ * pnpm packs tgz's with the name format ${hyphenated-package-name}-${version}.tgz
58
+ */
59
+ async function versionOf ( name ) {
60
+ let manifestPath = join ( monorepoRoot , 'packages' , name , 'package.json' ) ;
61
+ let manifestString = await readFile ( manifestPath ) ;
62
+ return JSON . parse ( manifestString . toString ( ) ) . version ;
63
+ }
64
+
65
+ let tarballs = {
66
+ syntax : `glimmer-syntax-${ await versionOf ( '@glimmer/syntax' ) } ` ,
67
+ util : `glimmer-util-${ await versionOf ( '@glimmer/util' ) } ` ,
68
+ wireFormat : `glimmer-wire-format-${ await versionOf ( '@glimmer/wire-format' ) } ` ,
69
+ } ;
70
+
71
+ let file = `console.log((await import('@glimmer/syntax')).preprocess('<h1></h1>'));` ;
72
+ let manifest = JSON . stringify ( {
73
+ name : 'real-test' ,
74
+ type : 'module' ,
75
+ private : true ,
76
+ devDependencies : {
77
+ '@glimmer/syntax' : `file://./${ tarballs . syntax } ` ,
78
+ '@glimmer/util' : `file://./${ tarballs . util } ` ,
79
+ '@glimmer/wire-format' : `file://./${ tarballs . wireFormat } ` ,
80
+ } ,
81
+ pnpm : {
82
+ overrides : {
83
+ '@glimmer/syntax' : `file://./${ tarballs . syntax } .tgz` ,
84
+ '@glimmer/util' : `file://./${ tarballs . util } .tgz` ,
85
+ '@glimmer/wire-format' : `file://./${ tarballs . wireFormat } .tgz` ,
86
+ } ,
87
+ } ,
88
+ } ) ;
89
+
90
+ async function newTmpDir ( ) {
91
+ const tmpDir = await mkdtemp (
92
+ join ( os . tmpdir ( ) , `glimmer-node-integration-testing-${ Date . now ( ) } -` )
93
+ ) ;
94
+
95
+ return tmpDir ;
96
+ }
97
+
98
+ function inDir ( dir : string , cmd : string ) {
99
+ return $ ( { cwd : dir , preferLocal : true , shell : true } ) ( cmd ) ;
100
+ }
101
+ function inRoot ( cmd : string ) {
102
+ return inDir ( monorepoRoot , cmd ) ;
103
+ }
104
+
105
+ function inTmp ( cmd : string ) {
106
+ return inDir ( tmp , cmd ) ;
107
+ }
108
+
109
+ //////////
110
+ // 1 build
111
+ // When turbo is set up with "dependsOn": "["^prepack"], we see these packages
112
+ // - @glimmer/syntax
113
+ // - @glimmer/util
114
+ // - @glimmer/wire-format
115
+ //
116
+ // So these 3 packages need to be packed and installed
117
+ await inRoot ( `pnpm turbo --filter "@glimmer/syntax" prepack` ) ;
118
+
119
+ //////////
120
+ // 2 create a space that doesn't mess up the repo
121
+ let tmp = await newTmpDir ( ) ;
122
+
123
+ console . debug ( `Project can be inspected at ${ tmp } ` ) ;
124
+
125
+ //////////
126
+ // 3 create a project that represents real consumer usage
127
+ await writeFile ( join ( tmp , 'package.json' ) , manifest ) ;
128
+ await writeFile ( join ( tmp , 'index.js' ) , file ) ;
129
+
130
+ //////////
131
+ // 4 install the tarballs using stable names so we don't have to
132
+ // dynamically build the package.json
133
+ let packToTemp = `pnpm pack --pack-destination ${ tmp } ` ;
134
+ await inDir ( join ( monorepoRoot , 'packages/@glimmer/syntax' ) , packToTemp ) ;
135
+ await inDir ( join ( monorepoRoot , 'packages/@glimmer/util' ) , packToTemp ) ;
136
+ await inDir ( join ( monorepoRoot , 'packages/@glimmer/wire-format' ) , packToTemp ) ;
137
+ await inTmp ( `pnpm install` ) ;
138
+
139
+ //////////
140
+ // 5 does it work?
141
+ let result = await inTmp ( `node index.js` ) ;
142
+ let stdout = result . stdout ;
143
+
144
+ expect ( stdout ) . toMatchInlineSnapshot ( ) ;
145
+ } ) ;
37
146
} ) ;
0 commit comments