@compiled/parcel-transformer 0.14.7 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,7 +9,9 @@ const generator_1 = __importDefault(require("@babel/generator"));
9
9
  const utils_1 = require("@compiled/utils");
10
10
  const plugin_1 = require("@parcel/plugin");
11
11
  const source_map_1 = __importDefault(require("@parcel/source-map"));
12
- const utils_2 = require("./utils");
12
+ // @ts-expect-error missing type
13
+ const utils_2 = require("@parcel/utils");
14
+ const utils_3 = require("./utils");
13
15
  const configFiles = [
14
16
  '.compiledcssrc',
15
17
  '.compiledcssrc.json',
@@ -80,33 +82,19 @@ exports.default = new plugin_1.Transformer({
80
82
  },
81
83
  plugins: (_d = config.transformerBabelPlugins) !== null && _d !== void 0 ? _d : undefined,
82
84
  });
83
- return {
84
- type: 'babel',
85
- version: '7.0.0',
86
- program,
87
- };
85
+ if (program) {
86
+ return {
87
+ type: 'babel',
88
+ version: '7.0.0',
89
+ program,
90
+ };
91
+ }
92
+ return undefined;
88
93
  },
89
94
  async transform({ asset, config, options }) {
90
95
  var _a, _b, _c, _d, _e;
91
- const distStyleRules = [];
92
- let someCode = await asset.getCode();
93
- for (const match of someCode.matchAll(/(import ['"](?<importSpec>.+\.compiled\.css)['"];)|(require\(['"](?<requireSpec>.+\.compiled\.css)['"]\);)/g)) {
94
- const specifierPath = ((_a = match.groups) === null || _a === void 0 ? void 0 : _a.importSpec) || ((_b = match.groups) === null || _b === void 0 ? void 0 : _b.requireSpec);
95
- if (!specifierPath)
96
- continue;
97
- someCode = someCode.replace(match[0], '');
98
- asset.setCode(someCode);
99
- const cssFilePath = (0, path_1.isAbsolute)(specifierPath)
100
- ? specifierPath
101
- : (0, path_1.join)((0, path_1.dirname)(asset.filePath), specifierPath);
102
- const cssContent = (await asset.fs.readFile(cssFilePath)).toString().split('\n');
103
- if (!asset.meta.styleRules) {
104
- asset.meta.styleRules = [];
105
- }
106
- asset.meta.styleRules.push(...cssContent);
107
- }
108
96
  const ast = await asset.getAST();
109
- if (!ast) {
97
+ if (!((ast === null || ast === void 0 ? void 0 : ast.type) === 'babel' && ast.program)) {
110
98
  // We will only receive ASTs for assets we're interested in.
111
99
  // Since this is undefined (or in node modules) we aren't interested in it.
112
100
  return [asset];
@@ -116,20 +104,21 @@ exports.default = new plugin_1.Transformer({
116
104
  const includedFiles = [];
117
105
  const code = asset.isASTDirty() ? undefined : await asset.getCode();
118
106
  const result = await (0, core_1.transformFromAstAsync)(ast.program, code, {
119
- code: true,
120
- ast: false,
107
+ code: false,
108
+ ast: true,
121
109
  filename: asset.filePath,
122
110
  babelrc: false,
123
111
  configFile: false,
124
- sourceMaps: true,
112
+ sourceMaps: !!asset.env.sourceMap,
113
+ compact: false,
125
114
  parserOpts: {
126
- plugins: (_c = config.parserBabelPlugins) !== null && _c !== void 0 ? _c : undefined,
115
+ plugins: (_a = config.parserBabelPlugins) !== null && _a !== void 0 ? _a : undefined,
127
116
  },
128
117
  plugins: [
129
- ...((_d = config.transformerBabelPlugins) !== null && _d !== void 0 ? _d : []),
118
+ ...((_b = config.transformerBabelPlugins) !== null && _b !== void 0 ? _b : []),
130
119
  asset.isSource && [
131
120
  '@compiled/babel-plugin',
132
- Object.assign(Object.assign({}, config), { classNameCompressionMap: config.extract && config.classNameCompressionMap, onIncludedFiles: (files) => includedFiles.push(...files), resolver: config.resolver ? config.resolver : (0, utils_2.createDefaultResolver)(config), cache: false }),
121
+ Object.assign(Object.assign({}, config), { classNameCompressionMap: config.extract && config.classNameCompressionMap, onIncludedFiles: (files) => includedFiles.push(...files), resolver: config.resolver ? config.resolver : (0, utils_3.createDefaultResolver)(config), cache: false }),
133
122
  ],
134
123
  extract && [
135
124
  '@compiled/babel-plugin-strip-runtime',
@@ -143,33 +132,57 @@ exports.default = new plugin_1.Transformer({
143
132
  name: 'compiled',
144
133
  },
145
134
  });
146
- const output = (result === null || result === void 0 ? void 0 : result.code) || '';
147
135
  includedFiles.forEach((file) => {
148
136
  // Included files are those which have been statically evaluated into this asset.
149
137
  // This tells parcel that if any of those files change this asset should be transformed
150
138
  // again.
151
139
  asset.invalidateOnFileChange(file);
152
140
  });
153
- asset.setCode(output);
154
141
  if (extract) {
155
142
  // Store styleRules to asset.meta to be used by @compiled/parcel-optimizer
156
143
  const metadata = result === null || result === void 0 ? void 0 : result.metadata;
157
- asset.meta.styleRules = [...((_e = metadata.styleRules) !== null && _e !== void 0 ? _e : []), ...distStyleRules];
144
+ asset.meta.styleRules = [
145
+ ...((_d = (_c = asset.meta) === null || _c === void 0 ? void 0 : _c.styleRules) !== null && _d !== void 0 ? _d : []),
146
+ ...((_e = metadata.styleRules) !== null && _e !== void 0 ? _e : []),
147
+ ];
148
+ }
149
+ if (result === null || result === void 0 ? void 0 : result.ast) {
150
+ asset.setAST({
151
+ type: 'babel',
152
+ version: '7.0.0',
153
+ program: result.ast,
154
+ });
158
155
  }
159
156
  return [asset];
160
157
  },
161
- async generate({ asset, ast }) {
162
- // TODO: We're using babels standard generator. Internally parcel does some hacks in
163
- // the official Babel transformer to make it faster - using ASTree directly.
164
- // Perhaps we should do the same thing.
165
- const { code, map: babelMap } = (0, generator_1.default)(ast.program, {
166
- filename: asset.filePath,
167
- sourceMaps: true,
168
- sourceFileName: asset.filePath,
158
+ async generate({ asset, ast, options }) {
159
+ const originalSourceMap = await asset.getMap();
160
+ const sourceFileName = (0, utils_2.relativeUrl)(options.projectRoot, asset.filePath);
161
+ // @ts-expect-error RawMappings should exist here
162
+ const { code, rawMappings } = (0, generator_1.default)(ast.program, {
163
+ sourceFileName,
164
+ sourceMaps: !!asset.env.sourceMap,
165
+ comments: true,
169
166
  });
167
+ const map = new source_map_1.default(options.projectRoot);
168
+ if (rawMappings) {
169
+ map.addIndexedMappings(rawMappings);
170
+ }
171
+ if (originalSourceMap) {
172
+ // The babel AST already contains the correct mappings, but not the source contents.
173
+ // We need to copy over the source contents from the original map.
174
+ // @ts-expect-error getSourcesContentMap exists
175
+ const sourcesContent = originalSourceMap.getSourcesContentMap();
176
+ for (const filePath in sourcesContent) {
177
+ const content = sourcesContent[filePath];
178
+ if (content != null) {
179
+ map.setSourceContent(filePath, content);
180
+ }
181
+ }
182
+ }
170
183
  return {
171
184
  content: code,
172
- map: babelMap ? new source_map_1.default().addVLQMap(babelMap) : null,
185
+ map,
173
186
  };
174
187
  },
175
188
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@compiled/parcel-transformer",
3
- "version": "0.14.7",
3
+ "version": "0.15.1",
4
4
  "description": "A familiar and performant compile time CSS-in-JS library for React.",
5
5
  "homepage": "https://compiledcssinjs.com/docs/pkg-parcel-transformer",
6
6
  "bugs": "https://github.com/atlassian-labs/compiled/issues/new?assignees=&labels=bug&template=bug_report.md",
@@ -27,6 +27,7 @@
27
27
  "@compiled/utils": "^0.9.2",
28
28
  "@parcel/plugin": "^2.8.3",
29
29
  "@parcel/source-map": "^2.1.1",
30
+ "@parcel/utils": "^2.8.3",
30
31
  "enhanced-resolve": "^5.15.0"
31
32
  },
32
33
  "devDependencies": {
@@ -34,7 +35,8 @@
34
35
  "@parcel/fs": "^2.8.3",
35
36
  "@parcel/types": "^2.8.3",
36
37
  "@types/babel__core": "^7.20.3",
37
- "prettier": "^2.8.8"
38
+ "prettier": "^2.8.8",
39
+ "source-map": "^0.7.4"
38
40
  },
39
41
  "engines": {
40
42
  "parcel": "^2.0.0"
@@ -1,8 +1,11 @@
1
1
  import { join } from 'path';
2
2
 
3
3
  import Parcel, { createWorkerFarm } from '@parcel/core';
4
- import { MemoryFS } from '@parcel/fs';
4
+ import { MemoryFS, NodeFS } from '@parcel/fs';
5
+ // eslint-disable-next-line import/namespace
6
+ import type { Asset } from '@parcel/types';
5
7
  import { format } from 'prettier';
8
+ import { SourceMapConsumer } from 'source-map';
6
9
 
7
10
  const rootPath = join(__dirname, '..', '..', '..', '..');
8
11
  const fixtureRoot = join(rootPath, 'fixtures/parcel-transformer-test-app');
@@ -15,8 +18,27 @@ afterAll(() => {
15
18
  });
16
19
 
17
20
  const outputFS = new MemoryFS(workerFarm);
21
+ const nodeFS = new NodeFS();
18
22
 
19
- const getParcelInstance = (workingDir: string) => {
23
+ function findTargetSourcePosition(source: string, regex: RegExp): { line: number; column: number } {
24
+ const lines = source.split('\n');
25
+
26
+ for (let i = 0; i < lines.length; i++) {
27
+ const line = lines[i];
28
+ const match = line.match(regex);
29
+
30
+ if (match && match.index !== undefined) {
31
+ return {
32
+ line: i + 1,
33
+ column: match.index,
34
+ };
35
+ }
36
+ }
37
+
38
+ throw new Error(`Could not find target source\n${source}`);
39
+ }
40
+
41
+ const getParcelInstance = (workingDir: string, sourceMap = false) => {
20
42
  return new Parcel({
21
43
  config: join(workingDir, '.parcelrc'),
22
44
  entries: [join(workingDir, 'src', 'index.html')],
@@ -24,6 +46,7 @@ const getParcelInstance = (workingDir: string) => {
24
46
  targets: {
25
47
  default: {
26
48
  distDir: join(workingDir, 'dist'),
49
+ sourceMap: sourceMap,
27
50
  },
28
51
  },
29
52
  workerFarm,
@@ -40,12 +63,13 @@ it('transforms assets with babel plugin', async () => {
40
63
  );
41
64
 
42
65
  const code = await asset?.getCode();
43
- const appCode = code?.slice(
44
- code.indexOf('/* index.jsx generated by @compiled/babel-plugin v0.0.0 */')
45
- );
66
+ const appCode = code?.slice(code.indexOf('var _3'));
46
67
  expect(appCode).toMatchInlineSnapshot(`
47
- "/* index.jsx generated by @compiled/babel-plugin v0.0.0 */ var _2 = "._syaz5scu{color:red}";
68
+ "var _3 = "._bfhkbf54{background-color:green}";
69
+ var _2 = "._syaz5scu{color:red}";
48
70
  var _ = "._1wyb12am{font-size:50px}";
71
+ console.log("File START");
72
+ var styles = null;
49
73
  var App = function() {
50
74
  return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
51
75
  children: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_runtime.CC, {
@@ -53,12 +77,14 @@ it('transforms assets with babel plugin', async () => {
53
77
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_runtime.CS, {
54
78
  children: [
55
79
  _,
56
- _2
80
+ _2,
81
+ _3
57
82
  ]
58
83
  }),
59
84
  /*#__PURE__*/ (0, _jsxRuntime.jsx)("div", {
60
85
  className: (0, _runtime.ax)([
61
- "_1wyb12am _syaz5scu"
86
+ "_1wyb12am _syaz5scu",
87
+ "_bfhkbf54"
62
88
  ]),
63
89
  children: "hello from parcel"
64
90
  })
@@ -66,10 +92,48 @@ it('transforms assets with babel plugin', async () => {
66
92
  })
67
93
  });
68
94
  };
95
+ console.log("File END");
69
96
  "
70
97
  `);
71
98
  }, 50000);
72
99
 
100
+ it('transforms assets with babel plugin and source map is correct', async () => {
101
+ const parcel = getParcelInstance(fixtureRoot, true);
102
+ const { changedAssets, bundleGraph } = await parcel.run();
103
+
104
+ const asset = Array.from(changedAssets.values()).find(
105
+ (asset) => asset.filePath === join(fixtureRoot, 'src/index.jsx')
106
+ );
107
+ expect(asset).toBeDefined();
108
+ const bundle = bundleGraph.getBundlesWithAsset(asset as Asset)[0];
109
+
110
+ const mapFile = await outputFS.readFile(`${bundle.filePath}.map`, 'utf8');
111
+
112
+ const rawSourceMap = JSON.parse(mapFile);
113
+ const consumer = await new SourceMapConsumer(rawSourceMap);
114
+
115
+ const expectedOriginalPosition = findTargetSourcePosition(
116
+ await nodeFS.readFile((asset as Asset).filePath, 'utf8'),
117
+ /File END/
118
+ );
119
+ const expectedGeneratedPosition = findTargetSourcePosition(
120
+ await outputFS.readFile(bundle.filePath, 'utf8'),
121
+ /File END/
122
+ );
123
+
124
+ const actualGeneratedPosition = consumer.generatedPositionFor({
125
+ ...expectedOriginalPosition,
126
+ source: 'fixtures/parcel-transformer-test-app/src/index.jsx',
127
+ });
128
+ const actualOriginalPosition = consumer.originalPositionFor(expectedGeneratedPosition);
129
+
130
+ expect('fixtures/parcel-transformer-test-app/src/index.jsx').toEqual(
131
+ actualOriginalPosition?.source
132
+ );
133
+ expect(actualGeneratedPosition.line).toBe(expectedGeneratedPosition.line);
134
+ expect(actualGeneratedPosition.column).toBe(expectedGeneratedPosition.column - 1);
135
+ }, 50000);
136
+
73
137
  it('transforms assets with custom resolve and statically evaluates imports', async () => {
74
138
  const customResolveFixtureRoot = join(
75
139
  rootPath,
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { join, dirname, isAbsolute } from 'path';
1
+ import { join } from 'path';
2
2
 
3
3
  import { parseAsync, transformFromAstAsync } from '@babel/core';
4
4
  import generate from '@babel/generator';
@@ -10,6 +10,8 @@ import type {
10
10
  import { toBoolean } from '@compiled/utils';
11
11
  import { Transformer } from '@parcel/plugin';
12
12
  import SourceMap from '@parcel/source-map';
13
+ // @ts-expect-error missing type
14
+ import { relativeUrl } from '@parcel/utils';
13
15
 
14
16
  import type { ParcelTransformerOpts } from './types';
15
17
  import { createDefaultResolver } from './utils';
@@ -106,38 +108,21 @@ export default new Transformer<ParcelTransformerOpts>({
106
108
  plugins: config.transformerBabelPlugins ?? undefined,
107
109
  });
108
110
 
109
- return {
110
- type: 'babel',
111
- version: '7.0.0',
112
- program,
113
- };
111
+ if (program) {
112
+ return {
113
+ type: 'babel',
114
+ version: '7.0.0',
115
+ program,
116
+ };
117
+ }
118
+
119
+ return undefined;
114
120
  },
115
121
 
116
122
  async transform({ asset, config, options }) {
117
- const distStyleRules: string[] = [];
118
- let someCode = await asset.getCode();
119
- for (const match of someCode.matchAll(
120
- /(import ['"](?<importSpec>.+\.compiled\.css)['"];)|(require\(['"](?<requireSpec>.+\.compiled\.css)['"]\);)/g
121
- )) {
122
- const specifierPath = match.groups?.importSpec || match.groups?.requireSpec;
123
- if (!specifierPath) continue;
124
- someCode = someCode.replace(match[0], '');
125
- asset.setCode(someCode);
126
-
127
- const cssFilePath = isAbsolute(specifierPath)
128
- ? specifierPath
129
- : join(dirname(asset.filePath), specifierPath);
130
-
131
- const cssContent = (await asset.fs.readFile(cssFilePath)).toString().split('\n');
132
- if (!asset.meta.styleRules) {
133
- asset.meta.styleRules = [];
134
- }
135
- (asset.meta.styleRules as string[]).push(...cssContent);
136
- }
137
-
138
123
  const ast = await asset.getAST();
139
124
 
140
- if (!ast) {
125
+ if (!(ast?.type === 'babel' && ast.program)) {
141
126
  // We will only receive ASTs for assets we're interested in.
142
127
  // Since this is undefined (or in node modules) we aren't interested in it.
143
128
  return [asset];
@@ -149,12 +134,13 @@ export default new Transformer<ParcelTransformerOpts>({
149
134
  const code = asset.isASTDirty() ? undefined : await asset.getCode();
150
135
 
151
136
  const result = await transformFromAstAsync(ast.program, code, {
152
- code: true,
153
- ast: false,
137
+ code: false,
138
+ ast: true,
154
139
  filename: asset.filePath,
155
140
  babelrc: false,
156
141
  configFile: false,
157
- sourceMaps: true,
142
+ sourceMaps: !!asset.env.sourceMap,
143
+ compact: false,
158
144
  parserOpts: {
159
145
  plugins: config.parserBabelPlugins ?? undefined,
160
146
  },
@@ -183,8 +169,6 @@ export default new Transformer<ParcelTransformerOpts>({
183
169
  },
184
170
  });
185
171
 
186
- const output = result?.code || '';
187
-
188
172
  includedFiles.forEach((file) => {
189
173
  // Included files are those which have been statically evaluated into this asset.
190
174
  // This tells parcel that if any of those files change this asset should be transformed
@@ -192,30 +176,58 @@ export default new Transformer<ParcelTransformerOpts>({
192
176
  asset.invalidateOnFileChange(file);
193
177
  });
194
178
 
195
- asset.setCode(output);
196
-
197
179
  if (extract) {
198
180
  // Store styleRules to asset.meta to be used by @compiled/parcel-optimizer
199
181
  const metadata = result?.metadata as BabelFileMetadata;
200
- asset.meta.styleRules = [...(metadata.styleRules ?? []), ...distStyleRules];
182
+ asset.meta.styleRules = [
183
+ ...((asset.meta?.styleRules as string[] | undefined) ?? []),
184
+ ...(metadata.styleRules ?? []),
185
+ ];
186
+ }
187
+
188
+ if (result?.ast) {
189
+ asset.setAST({
190
+ type: 'babel',
191
+ version: '7.0.0',
192
+ program: result.ast,
193
+ });
201
194
  }
202
195
 
203
196
  return [asset];
204
197
  },
205
198
 
206
- async generate({ asset, ast }) {
207
- // TODO: We're using babels standard generator. Internally parcel does some hacks in
208
- // the official Babel transformer to make it faster - using ASTree directly.
209
- // Perhaps we should do the same thing.
210
- const { code, map: babelMap } = generate(ast.program, {
211
- filename: asset.filePath,
212
- sourceMaps: true,
213
- sourceFileName: asset.filePath,
199
+ async generate({ asset, ast, options }) {
200
+ const originalSourceMap = await asset.getMap();
201
+ const sourceFileName: string = relativeUrl(options.projectRoot, asset.filePath);
202
+
203
+ // @ts-expect-error RawMappings should exist here
204
+ const { code, rawMappings } = generate(ast.program, {
205
+ sourceFileName,
206
+ sourceMaps: !!asset.env.sourceMap,
207
+ comments: true,
214
208
  });
215
209
 
210
+ const map = new SourceMap(options.projectRoot);
211
+ if (rawMappings) {
212
+ map.addIndexedMappings(rawMappings);
213
+ }
214
+
215
+ if (originalSourceMap) {
216
+ // The babel AST already contains the correct mappings, but not the source contents.
217
+ // We need to copy over the source contents from the original map.
218
+ // @ts-expect-error getSourcesContentMap exists
219
+ const sourcesContent = originalSourceMap.getSourcesContentMap();
220
+ for (const filePath in sourcesContent) {
221
+ const content = sourcesContent[filePath];
222
+ if (content != null) {
223
+ map.setSourceContent(filePath, content);
224
+ }
225
+ }
226
+ }
227
+
216
228
  return {
217
229
  content: code,
218
- map: babelMap ? new SourceMap().addVLQMap(babelMap) : null,
230
+ map,
219
231
  };
220
232
  },
221
233
  });