@react-pug/react-pug-core 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.
Files changed (35) hide show
  1. package/README.md +60 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +24 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/language/diagnosticMapping.d.ts +25 -0
  7. package/dist/language/diagnosticMapping.d.ts.map +1 -0
  8. package/dist/language/diagnosticMapping.js +89 -0
  9. package/dist/language/diagnosticMapping.js.map +1 -0
  10. package/dist/language/extractRegions.d.ts +39 -0
  11. package/dist/language/extractRegions.d.ts.map +1 -0
  12. package/dist/language/extractRegions.js +419 -0
  13. package/dist/language/extractRegions.js.map +1 -0
  14. package/dist/language/mapping.d.ts +181 -0
  15. package/dist/language/mapping.d.ts.map +1 -0
  16. package/dist/language/mapping.js +32 -0
  17. package/dist/language/mapping.js.map +1 -0
  18. package/dist/language/positionMapping.d.ts +6 -0
  19. package/dist/language/positionMapping.d.ts.map +1 -0
  20. package/dist/language/positionMapping.js +138 -0
  21. package/dist/language/positionMapping.js.map +1 -0
  22. package/dist/language/pugToTsx.d.ts +39 -0
  23. package/dist/language/pugToTsx.d.ts.map +1 -0
  24. package/dist/language/pugToTsx.js +1484 -0
  25. package/dist/language/pugToTsx.js.map +1 -0
  26. package/dist/language/shadowDocument.d.ts +15 -0
  27. package/dist/language/shadowDocument.d.ts.map +1 -0
  28. package/dist/language/shadowDocument.js +480 -0
  29. package/dist/language/shadowDocument.js.map +1 -0
  30. package/dist/language/sourceTransform.d.ts +88 -0
  31. package/dist/language/sourceTransform.d.ts.map +1 -0
  32. package/dist/language/sourceTransform.js +80 -0
  33. package/dist/language/sourceTransform.js.map +1 -0
  34. package/package.json +22 -0
  35. package/tsconfig.json +12 -0
@@ -0,0 +1,88 @@
1
+ import type { PugDocument, PugRegion } from './mapping';
2
+ import type { ClassAttributeName, ClassMergeMode, CompileMode } from './pugToTsx';
3
+ import { type EncodedSourceMap } from '@jridgewell/gen-mapping';
4
+ export type ClassAttributeOption = 'auto' | ClassAttributeName;
5
+ export type ClassMergeOption = 'auto' | ClassMergeMode;
6
+ export type StartupjsCssxjsOption = boolean | 'auto';
7
+ export interface SourceTransformOptions {
8
+ /**
9
+ * Tagged template function name to match.
10
+ * Defaults to `pug`.
11
+ */
12
+ tagFunction?: string;
13
+ /**
14
+ * Output mode used by pug compiler.
15
+ * - `languageService`: TS-oriented output for editor/type-service usage.
16
+ * - `runtime`: JS/JSX-safe output for build tools.
17
+ */
18
+ compileMode?: CompileMode;
19
+ /**
20
+ * Which attribute receives shorthand classes.
21
+ * - `auto`: defaults to `className`, but may switch to `styleName` when startupjs/cssxjs is detected.
22
+ */
23
+ classAttribute?: ClassAttributeOption;
24
+ /**
25
+ * How shorthand classes merge with an existing explicit attribute value.
26
+ * - `concatenate`: string concatenation
27
+ * - `classnames`: classnames-compatible array composition
28
+ * - `auto`: `classnames` when target attr is `styleName`, otherwise `concatenate`
29
+ */
30
+ classMerge?: ClassMergeOption;
31
+ /**
32
+ * startupjs/cssxjs detection mode used by `auto` class strategy.
33
+ */
34
+ startupjsCssxjs?: StartupjsCssxjsOption;
35
+ /**
36
+ * When true, uppercase dot segments after a component name are treated as component path
37
+ * segments instead of shorthand classes.
38
+ *
39
+ * Example:
40
+ * - `Modal.Header.active` -> component `Modal.Header` + class `.active`
41
+ * - `Modal.icons.Header` -> component `Modal` + classes `.icons.Header`
42
+ *
43
+ * Defaults to true.
44
+ */
45
+ componentPathFromUppercaseClassShorthand?: boolean;
46
+ /**
47
+ * When true, require the configured tag function to be imported in files that use it.
48
+ * Transform-based consumers throw; the language-service path exposes a diagnostic instead.
49
+ */
50
+ requirePugImport?: boolean;
51
+ /**
52
+ * Remove the configured tag-function import from transformed/shadow output once all tag usages
53
+ * have been compiled away. Enabled by default.
54
+ */
55
+ removeTagImport?: boolean;
56
+ }
57
+ export interface SourceTransformResult {
58
+ /**
59
+ * Transformed source text where matched pug tagged templates are replaced by compiled output.
60
+ */
61
+ code: string;
62
+ /**
63
+ * Full transform document with all region metadata.
64
+ */
65
+ document: PugDocument;
66
+ /**
67
+ * Convenience alias for `document.regions`.
68
+ */
69
+ regions: PugRegion[];
70
+ /**
71
+ * Map offset in transformed code back to offset in original source.
72
+ * Returns null when the offset points to a synthetic unmapped span.
73
+ */
74
+ mapGeneratedOffsetToOriginal: (offset: number) => number | null;
75
+ /**
76
+ * Map offset in original source to transformed code offset.
77
+ * Returns null when the offset points to an unmapped span.
78
+ */
79
+ mapOriginalOffsetToGenerated: (offset: number) => number | null;
80
+ }
81
+ export type TransformSourceMap = EncodedSourceMap;
82
+ export declare function transformSourceFile(sourceText: string, fileName: string, options?: SourceTransformOptions): SourceTransformResult;
83
+ /**
84
+ * Build a standard VLQ source map from transformed code back to original source.
85
+ * This is intended to be used as an input source map for downstream compilers.
86
+ */
87
+ export declare function createTransformSourceMap(transformed: Pick<SourceTransformResult, 'code' | 'document' | 'mapGeneratedOffsetToOriginal'>, fileName?: string): TransformSourceMap;
88
+ //# sourceMappingURL=sourceTransform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceTransform.d.ts","sourceRoot":"","sources":["../../src/language/sourceTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElF,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,kBAAkB,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,cAAc,CAAC;AACvD,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B;;;OAGG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC;;;;;OAKG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC;;;;;;;;;OASG;IACH,wCAAwC,CAAC,EAAE,OAAO,CAAC;IAEnD;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,WAAW,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,SAAS,EAAE,CAAC;IAErB;;;OAGG;IACH,4BAA4B,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAEhE;;;OAGG;IACH,4BAA4B,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAElD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CA8CvB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,UAAU,GAAG,8BAA8B,CAAC,EAC9F,QAAQ,GAAE,MAAiC,GAC1C,kBAAkB,CA4CpB"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transformSourceFile = transformSourceFile;
4
+ exports.createTransformSourceMap = createTransformSourceMap;
5
+ const shadowDocument_1 = require("./shadowDocument");
6
+ const positionMapping_1 = require("./positionMapping");
7
+ const diagnosticMapping_1 = require("./diagnosticMapping");
8
+ const gen_mapping_1 = require("@jridgewell/gen-mapping");
9
+ const STARTUPJS_OR_CSSXJS_RE = /['"](?:startupjs|cssxjs)['"]/;
10
+ function transformSourceFile(sourceText, fileName, options = {}) {
11
+ const tagFunction = options.tagFunction ?? 'pug';
12
+ const startupjsCssxjs = options.startupjsCssxjs === true
13
+ || (options.startupjsCssxjs !== false && STARTUPJS_OR_CSSXJS_RE.test(sourceText));
14
+ const classAttribute = (options.classAttribute === 'className'
15
+ || options.classAttribute === 'class'
16
+ || options.classAttribute === 'styleName') ? options.classAttribute : (startupjsCssxjs ? 'styleName' : 'className');
17
+ const classMerge = (options.classMerge === 'concatenate'
18
+ || options.classMerge === 'classnames') ? options.classMerge : (classAttribute === 'styleName' ? 'classnames' : 'concatenate');
19
+ const document = (0, shadowDocument_1.buildShadowDocument)(sourceText, fileName, 1, tagFunction, {
20
+ mode: options.compileMode ?? 'languageService',
21
+ classAttribute,
22
+ classMerge,
23
+ componentPathFromUppercaseClassShorthand: options.componentPathFromUppercaseClassShorthand ?? true,
24
+ requirePugImport: options.requirePugImport ?? false,
25
+ removeTagImport: options.removeTagImport ?? true,
26
+ });
27
+ if (options.requirePugImport && document.usesTagFunction && !document.hasTagImport) {
28
+ throw new Error(`Missing import for tag function "${tagFunction}" in ${fileName}`);
29
+ }
30
+ const transformErrorRegion = document.regions.find(region => region.transformError != null);
31
+ if (transformErrorRegion?.transformError) {
32
+ const error = transformErrorRegion.transformError;
33
+ throw new Error(`${error.message} in ${fileName}:${error.line}:${error.column}`);
34
+ }
35
+ return {
36
+ code: document.shadowText,
37
+ document,
38
+ regions: document.regions,
39
+ mapGeneratedOffsetToOriginal: (offset) => (0, positionMapping_1.shadowToOriginal)(document, offset),
40
+ mapOriginalOffsetToGenerated: (offset) => (0, positionMapping_1.originalToShadow)(document, offset),
41
+ };
42
+ }
43
+ /**
44
+ * Build a standard VLQ source map from transformed code back to original source.
45
+ * This is intended to be used as an input source map for downstream compilers.
46
+ */
47
+ function createTransformSourceMap(transformed, fileName = transformed.document.uri) {
48
+ const sourceName = fileName;
49
+ const map = new gen_mapping_1.GenMapping({ file: fileName });
50
+ (0, gen_mapping_1.setSourceContent)(map, sourceName, transformed.document.originalText);
51
+ let generatedLine = 0;
52
+ let generatedColumn = 0;
53
+ let lastMappedOriginalOffset = null;
54
+ for (let i = 0; i < transformed.code.length; i += 1) {
55
+ const mappedOriginalOffset = transformed.mapGeneratedOffsetToOriginal(i);
56
+ if (mappedOriginalOffset != null) {
57
+ const shouldEmitSegment = (generatedColumn === 0
58
+ || lastMappedOriginalOffset == null
59
+ || mappedOriginalOffset !== lastMappedOriginalOffset + 1);
60
+ if (shouldEmitSegment) {
61
+ const original = (0, diagnosticMapping_1.offsetToLineColumn)(transformed.document.originalText, mappedOriginalOffset);
62
+ (0, gen_mapping_1.addSegment)(map, generatedLine, generatedColumn, sourceName, Math.max(0, original.line - 1), Math.max(0, original.column - 1));
63
+ }
64
+ lastMappedOriginalOffset = mappedOriginalOffset;
65
+ }
66
+ else {
67
+ lastMappedOriginalOffset = null;
68
+ }
69
+ if (transformed.code.charCodeAt(i) === 10) {
70
+ generatedLine += 1;
71
+ generatedColumn = 0;
72
+ lastMappedOriginalOffset = null;
73
+ }
74
+ else {
75
+ generatedColumn += 1;
76
+ }
77
+ }
78
+ return (0, gen_mapping_1.toEncodedMap)(map);
79
+ }
80
+ //# sourceMappingURL=sourceTransform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceTransform.js","sourceRoot":"","sources":["../../src/language/sourceTransform.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@react-pug/react-pug-core",
3
+ "main": "./dist/index.js",
4
+ "version": "0.1.0",
5
+ "types": "./dist/index.d.ts",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "scripts": {
10
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
11
+ "prepublishOnly": "npm run build"
12
+ },
13
+ "dependencies": {
14
+ "@babel/parser": "^7.0.0",
15
+ "@jridgewell/gen-mapping": "^0.3.13",
16
+ "@startupjs/pug-lexer": "^4.1.0-1",
17
+ "@volar/source-map": "^2.4.28",
18
+ "pug-parser": "^6.0.0",
19
+ "pug-strip-comments": "^2.0.0"
20
+ },
21
+ "gitHead": "b4e9f09659dd4c70d0734759ea00710414fd8366"
22
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "noEmit": true
5
+ },
6
+ "include": [
7
+ "src/**/*.ts"
8
+ ],
9
+ "exclude": [
10
+ "dist"
11
+ ]
12
+ }