@kirana-style/parcel-transformer 0.0.0-stage → 0.1.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/README.md CHANGED
@@ -1,3 +1,19 @@
1
- # Temporary Holding Version
1
+ # @kirana-style/parcel-transformer
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Kirana for Parcel (D-070): a transformer that compiles styles in scripts. The stylesheet comes from
4
+ `@kirana-style/postcss`, where a stylesheet says `@kirana;`.
5
+
6
+ ```json
7
+ // .parcelrc
8
+ {
9
+ "extends": "@parcel/config-default",
10
+ "transformers": {
11
+ "*.{js,mjs,jsx,ts,tsx}": ["@kirana-style/parcel-transformer", "..."]
12
+ }
13
+ }
14
+ ```
15
+
16
+ ```json
17
+ // .postcssrc
18
+ { "plugins": { "@kirana-style/postcss": {} } }
19
+ ```
package/package.json CHANGED
@@ -1,6 +1,48 @@
1
1
  {
2
2
  "name": "@kirana-style/parcel-transformer",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Kirana for Parcel: a transformer that compiles styles in scripts, with the stylesheet from @kirana-style/postcss.",
5
+ "license": "MIT",
6
+ "author": "The Kirana authors",
7
+ "homepage": "https://kirana.style",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/kirana-style/kirana.git",
11
+ "directory": "packages/kirana/npm/parcel-transformer"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/kirana-style/kirana/issues"
15
+ },
16
+ "type": "module",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./src/index.d.ts",
20
+ "default": "./src/index.js"
21
+ },
22
+ "./package.json": "./package.json"
23
+ },
24
+ "dependencies": {
25
+ "@kirana-style/compiler": "0.1.0",
26
+ "@kirana-style/core": "0.1.0",
27
+ "@kirana-style/postcss": "0.1.0"
28
+ },
29
+ "peerDependencies": {
30
+ "@parcel/plugin": "^2.16.0"
31
+ },
32
+ "engines": {
33
+ "parcel": "^2.16.0"
34
+ },
35
+ "files": [
36
+ "src",
37
+ "bin",
38
+ "*.d.ts",
39
+ "*.css",
40
+ "README.md",
41
+ "builders.json",
42
+ "schemas",
43
+ "gatsby-node.mjs",
44
+ "rules",
45
+ "recommended.json",
46
+ "strict.json"
47
+ ]
48
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Kirana for Parcel (D-070). Parcel runs transformers in worker processes and offers no step that
3
+ * sees every module, so the work is split as it is for Turbopack (D-065): this transformer rewrites
4
+ * styles in each script into class names, and `@kirana-style/postcss` compiles the whole project where the
5
+ * stylesheet says `@kirana;`. The two sessions agree because a class name is a hash of what it
6
+ * styles (D-037).
7
+ *
8
+ * .parcelrc { "extends": "@parcel/config-default",
9
+ * "transformers": { "*.{js,mjs,jsx,ts,tsx}": ["@kirana-style/parcel-transformer", "..."] } }
10
+ * .postcssrc { "plugins": { "@kirana-style/postcss": {} } }
11
+ */
12
+ import { Driver } from "@kirana-style/compiler";
13
+ import { Transformer } from "@parcel/plugin";
14
+ /** The part of Parcel's mutable asset the transformer uses. */
15
+ export type Asset = {
16
+ filePath: string;
17
+ getCode: () => Promise<string>;
18
+ setCode: (code: string) => void;
19
+ invalidateOnFileChange: (file: string) => void;
20
+ };
21
+ /** The part of Parcel's plugin logger the transformer uses. */
22
+ export type Logger = {
23
+ warn: (diagnostic: {
24
+ message: string;
25
+ }) => void;
26
+ };
27
+ /** The session for a project root, opened once per worker. */
28
+ export declare function driverFor(root: string): Promise<Driver>;
29
+ /** Compiles one script asset in place; errors fail the build, warnings go to Parcel's logger. */
30
+ export declare function transform({ asset, options, logger, }: {
31
+ asset: Asset;
32
+ options: {
33
+ projectRoot: string;
34
+ };
35
+ logger: Logger;
36
+ }): Promise<Asset[]>;
37
+ declare const _default: Transformer<unknown>;
38
+ export default _default;
package/src/index.js ADDED
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Kirana for Parcel (D-070). Parcel runs transformers in worker processes and offers no step that
3
+ * sees every module, so the work is split as it is for Turbopack (D-065): this transformer rewrites
4
+ * styles in each script into class names, and `@kirana-style/postcss` compiles the whole project where the
5
+ * stylesheet says `@kirana;`. The two sessions agree because a class name is a hash of what it
6
+ * styles (D-037).
7
+ *
8
+ * .parcelrc { "extends": "@parcel/config-default",
9
+ * "transformers": { "*.{js,mjs,jsx,ts,tsx}": ["@kirana-style/parcel-transformer", "..."] } }
10
+ * .postcssrc { "plugins": { "@kirana-style/postcss": {} } }
11
+ */
12
+ import { Driver } from "@kirana-style/compiler";
13
+ import { createReporter, shouldCompile } from "@kirana-style/compiler/host";
14
+ import { Transformer } from "@parcel/plugin";
15
+ const drivers = new Map();
16
+ /** The session for a project root, opened once per worker. */
17
+ export function driverFor(root) {
18
+ let driver = drivers.get(root);
19
+ if (!driver) {
20
+ driver = Driver.create({ root });
21
+ drivers.set(root, driver);
22
+ }
23
+ return driver;
24
+ }
25
+ const reporter = createReporter();
26
+ /** Compiles one script asset in place; errors fail the build, warnings go to Parcel's logger. */
27
+ export async function transform({ asset, options, logger, }) {
28
+ const driver = await driverFor(options.projectRoot);
29
+ if (driver.configFile)
30
+ asset.invalidateOnFileChange(driver.configFile);
31
+ const source = await asset.getCode();
32
+ if (!shouldCompile(asset.filePath, source, driver.libraries))
33
+ return [asset];
34
+ const result = driver.transform(asset.filePath, source);
35
+ for (const dependency of result.dependencies)
36
+ asset.invalidateOnFileChange(dependency);
37
+ reporter.module({
38
+ warn: (message) => logger.warn({ message }),
39
+ error: (message) => {
40
+ throw new Error(message);
41
+ },
42
+ }, asset.filePath, source, result.diagnostics);
43
+ if (result.code !== undefined)
44
+ asset.setCode(result.code);
45
+ return [asset];
46
+ }
47
+ export default new Transformer({
48
+ transform: transform,
49
+ });