@compiled/parcel-transformer 0.14.7 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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',
@@ -88,23 +90,6 @@ exports.default = new plugin_1.Transformer({
88
90
  },
89
91
  async transform({ asset, config, options }) {
90
92
  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
93
  const ast = await asset.getAST();
109
94
  if (!ast) {
110
95
  // We will only receive ASTs for assets we're interested in.
@@ -116,20 +101,21 @@ exports.default = new plugin_1.Transformer({
116
101
  const includedFiles = [];
117
102
  const code = asset.isASTDirty() ? undefined : await asset.getCode();
118
103
  const result = await (0, core_1.transformFromAstAsync)(ast.program, code, {
119
- code: true,
120
- ast: false,
104
+ code: false,
105
+ ast: true,
121
106
  filename: asset.filePath,
122
107
  babelrc: false,
123
108
  configFile: false,
124
- sourceMaps: true,
109
+ sourceMaps: !!asset.env.sourceMap,
110
+ compact: false,
125
111
  parserOpts: {
126
- plugins: (_c = config.parserBabelPlugins) !== null && _c !== void 0 ? _c : undefined,
112
+ plugins: (_a = config.parserBabelPlugins) !== null && _a !== void 0 ? _a : undefined,
127
113
  },
128
114
  plugins: [
129
- ...((_d = config.transformerBabelPlugins) !== null && _d !== void 0 ? _d : []),
115
+ ...((_b = config.transformerBabelPlugins) !== null && _b !== void 0 ? _b : []),
130
116
  asset.isSource && [
131
117
  '@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 }),
118
+ 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
119
  ],
134
120
  extract && [
135
121
  '@compiled/babel-plugin-strip-runtime',
@@ -143,33 +129,57 @@ exports.default = new plugin_1.Transformer({
143
129
  name: 'compiled',
144
130
  },
145
131
  });
146
- const output = (result === null || result === void 0 ? void 0 : result.code) || '';
147
132
  includedFiles.forEach((file) => {
148
133
  // Included files are those which have been statically evaluated into this asset.
149
134
  // This tells parcel that if any of those files change this asset should be transformed
150
135
  // again.
151
136
  asset.invalidateOnFileChange(file);
152
137
  });
153
- asset.setCode(output);
154
138
  if (extract) {
155
139
  // Store styleRules to asset.meta to be used by @compiled/parcel-optimizer
156
140
  const metadata = result === null || result === void 0 ? void 0 : result.metadata;
157
- asset.meta.styleRules = [...((_e = metadata.styleRules) !== null && _e !== void 0 ? _e : []), ...distStyleRules];
141
+ asset.meta.styleRules = [
142
+ ...((_d = (_c = asset.meta) === null || _c === void 0 ? void 0 : _c.styleRules) !== null && _d !== void 0 ? _d : []),
143
+ ...((_e = metadata.styleRules) !== null && _e !== void 0 ? _e : []),
144
+ ];
145
+ }
146
+ if (result === null || result === void 0 ? void 0 : result.ast) {
147
+ asset.setAST({
148
+ type: 'babel',
149
+ version: '7.0.0',
150
+ program: result === null || result === void 0 ? void 0 : result.ast,
151
+ });
158
152
  }
159
153
  return [asset];
160
154
  },
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,
155
+ async generate({ asset, ast, options }) {
156
+ const originalSourceMap = await asset.getMap();
157
+ const sourceFileName = (0, utils_2.relativeUrl)(options.projectRoot, asset.filePath);
158
+ // @ts-expect-error RawMappings should exist here
159
+ const { code, rawMappings } = (0, generator_1.default)(ast.program, {
160
+ sourceFileName,
161
+ sourceMaps: !!asset.env.sourceMap,
162
+ comments: true,
169
163
  });
164
+ const map = new source_map_1.default(options.projectRoot);
165
+ if (rawMappings) {
166
+ map.addIndexedMappings(rawMappings);
167
+ }
168
+ if (originalSourceMap) {
169
+ // The babel AST already contains the correct mappings, but not the source contents.
170
+ // We need to copy over the source contents from the original map.
171
+ // @ts-expect-error getSourcesContentMap exists
172
+ const sourcesContent = originalSourceMap.getSourcesContentMap();
173
+ for (const filePath in sourcesContent) {
174
+ const content = sourcesContent[filePath];
175
+ if (content != null) {
176
+ map.setSourceContent(filePath, content);
177
+ }
178
+ }
179
+ }
170
180
  return {
171
181
  content: code,
172
- map: babelMap ? new source_map_1.default().addVLQMap(babelMap) : null,
182
+ map,
173
183
  };
174
184
  },
175
185
  });
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.0",
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';
@@ -114,27 +116,6 @@ export default new Transformer<ParcelTransformerOpts>({
114
116
  },
115
117
 
116
118
  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
119
  const ast = await asset.getAST();
139
120
 
140
121
  if (!ast) {
@@ -149,12 +130,13 @@ export default new Transformer<ParcelTransformerOpts>({
149
130
  const code = asset.isASTDirty() ? undefined : await asset.getCode();
150
131
 
151
132
  const result = await transformFromAstAsync(ast.program, code, {
152
- code: true,
153
- ast: false,
133
+ code: false,
134
+ ast: true,
154
135
  filename: asset.filePath,
155
136
  babelrc: false,
156
137
  configFile: false,
157
- sourceMaps: true,
138
+ sourceMaps: !!asset.env.sourceMap,
139
+ compact: false,
158
140
  parserOpts: {
159
141
  plugins: config.parserBabelPlugins ?? undefined,
160
142
  },
@@ -183,8 +165,6 @@ export default new Transformer<ParcelTransformerOpts>({
183
165
  },
184
166
  });
185
167
 
186
- const output = result?.code || '';
187
-
188
168
  includedFiles.forEach((file) => {
189
169
  // Included files are those which have been statically evaluated into this asset.
190
170
  // This tells parcel that if any of those files change this asset should be transformed
@@ -192,30 +172,58 @@ export default new Transformer<ParcelTransformerOpts>({
192
172
  asset.invalidateOnFileChange(file);
193
173
  });
194
174
 
195
- asset.setCode(output);
196
-
197
175
  if (extract) {
198
176
  // Store styleRules to asset.meta to be used by @compiled/parcel-optimizer
199
177
  const metadata = result?.metadata as BabelFileMetadata;
200
- asset.meta.styleRules = [...(metadata.styleRules ?? []), ...distStyleRules];
178
+ asset.meta.styleRules = [
179
+ ...((asset.meta?.styleRules as string[] | undefined) ?? []),
180
+ ...(metadata.styleRules ?? []),
181
+ ];
182
+ }
183
+
184
+ if (result?.ast) {
185
+ asset.setAST({
186
+ type: 'babel',
187
+ version: '7.0.0',
188
+ program: result?.ast,
189
+ });
201
190
  }
202
191
 
203
192
  return [asset];
204
193
  },
205
194
 
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,
195
+ async generate({ asset, ast, options }) {
196
+ const originalSourceMap = await asset.getMap();
197
+ const sourceFileName: string = relativeUrl(options.projectRoot, asset.filePath);
198
+
199
+ // @ts-expect-error RawMappings should exist here
200
+ const { code, rawMappings } = generate(ast.program, {
201
+ sourceFileName,
202
+ sourceMaps: !!asset.env.sourceMap,
203
+ comments: true,
214
204
  });
215
205
 
206
+ const map = new SourceMap(options.projectRoot);
207
+ if (rawMappings) {
208
+ map.addIndexedMappings(rawMappings);
209
+ }
210
+
211
+ if (originalSourceMap) {
212
+ // The babel AST already contains the correct mappings, but not the source contents.
213
+ // We need to copy over the source contents from the original map.
214
+ // @ts-expect-error getSourcesContentMap exists
215
+ const sourcesContent = originalSourceMap.getSourcesContentMap();
216
+ for (const filePath in sourcesContent) {
217
+ const content = sourcesContent[filePath];
218
+ if (content != null) {
219
+ map.setSourceContent(filePath, content);
220
+ }
221
+ }
222
+ }
223
+
216
224
  return {
217
225
  content: code,
218
- map: babelMap ? new SourceMap().addVLQMap(babelMap) : null,
226
+ map,
219
227
  };
220
228
  },
221
229
  });