happy-css-modules 3.1.0 → 3.1.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.
Files changed (130) hide show
  1. package/dist/cli.d.ts +6 -0
  2. package/dist/cli.js +121 -0
  3. package/dist/cli.js.map +1 -0
  4. package/dist/cli.test.d.ts +1 -0
  5. package/dist/cli.test.js +66 -0
  6. package/dist/cli.test.js.map +1 -0
  7. package/dist/config.d.ts +1 -0
  8. package/dist/config.js +2 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/emitter/dts.d.ts +14 -0
  11. package/dist/emitter/dts.js +128 -0
  12. package/dist/emitter/dts.js.map +1 -0
  13. package/dist/emitter/dts.test.d.ts +1 -0
  14. package/dist/emitter/dts.test.js +205 -0
  15. package/dist/emitter/dts.test.js.map +1 -0
  16. package/dist/emitter/file-system.d.ts +6 -0
  17. package/dist/emitter/file-system.js +26 -0
  18. package/dist/emitter/file-system.js.map +1 -0
  19. package/dist/emitter/file-system.test.d.ts +1 -0
  20. package/dist/emitter/file-system.test.js +34 -0
  21. package/dist/emitter/file-system.test.js.map +1 -0
  22. package/dist/emitter/index.d.ts +34 -0
  23. package/dist/emitter/index.js +49 -0
  24. package/dist/emitter/index.js.map +1 -0
  25. package/dist/emitter/index.test.d.ts +1 -0
  26. package/dist/emitter/index.test.js +68 -0
  27. package/dist/emitter/index.test.js.map +1 -0
  28. package/dist/emitter/source-map.d.ts +8 -0
  29. package/dist/emitter/source-map.js +16 -0
  30. package/dist/emitter/source-map.js.map +1 -0
  31. package/dist/emitter/source-map.test.d.ts +1 -0
  32. package/dist/emitter/source-map.test.js +13 -0
  33. package/dist/emitter/source-map.test.js.map +1 -0
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/integration-test/go-to-definition.test.d.ts +1 -0
  38. package/dist/integration-test/go-to-definition.test.js +334 -0
  39. package/dist/integration-test/go-to-definition.test.js.map +1 -0
  40. package/dist/library/source-map/index.d.ts +8 -0
  41. package/dist/library/source-map/index.js +5 -0
  42. package/dist/library/source-map/index.js.map +1 -0
  43. package/dist/locator/index.d.ts +46 -0
  44. package/dist/locator/index.js +173 -0
  45. package/dist/locator/index.js.map +1 -0
  46. package/dist/locator/index.test.d.ts +1 -0
  47. package/dist/locator/index.test.js +393 -0
  48. package/dist/locator/index.test.js.map +1 -0
  49. package/dist/locator/postcss.d.ts +91 -0
  50. package/dist/locator/postcss.js +241 -0
  51. package/dist/locator/postcss.js.map +1 -0
  52. package/dist/locator/postcss.test.d.ts +1 -0
  53. package/dist/locator/postcss.test.js +256 -0
  54. package/dist/locator/postcss.test.js.map +1 -0
  55. package/dist/logger.d.ts +9 -0
  56. package/dist/logger.js +28 -0
  57. package/dist/logger.js.map +1 -0
  58. package/dist/regression-test/issue-168.test.d.ts +1 -0
  59. package/dist/regression-test/issue-168.test.js +30 -0
  60. package/dist/regression-test/issue-168.test.js.map +1 -0
  61. package/dist/resolver/index.d.ts +22 -0
  62. package/dist/resolver/index.js +44 -0
  63. package/dist/resolver/index.js.map +1 -0
  64. package/dist/resolver/index.test.d.ts +1 -0
  65. package/dist/resolver/index.test.js +16 -0
  66. package/dist/resolver/index.test.js.map +1 -0
  67. package/dist/resolver/node-resolver.d.ts +2 -0
  68. package/dist/resolver/node-resolver.js +6 -0
  69. package/dist/resolver/node-resolver.js.map +1 -0
  70. package/dist/resolver/node-resolver.test.d.ts +1 -0
  71. package/dist/resolver/node-resolver.test.js +25 -0
  72. package/dist/resolver/node-resolver.test.js.map +1 -0
  73. package/dist/resolver/relative-resolver.d.ts +2 -0
  74. package/dist/resolver/relative-resolver.js +5 -0
  75. package/dist/resolver/relative-resolver.js.map +1 -0
  76. package/dist/resolver/relative-resolver.test.d.ts +1 -0
  77. package/dist/resolver/relative-resolver.test.js +12 -0
  78. package/dist/resolver/relative-resolver.test.js.map +1 -0
  79. package/dist/resolver/webpack-resolver.d.ts +24 -0
  80. package/dist/resolver/webpack-resolver.js +91 -0
  81. package/dist/resolver/webpack-resolver.js.map +1 -0
  82. package/dist/resolver/webpack-resolver.test.d.ts +1 -0
  83. package/dist/resolver/webpack-resolver.test.js +89 -0
  84. package/dist/resolver/webpack-resolver.test.js.map +1 -0
  85. package/dist/runner.d.ts +76 -0
  86. package/dist/runner.js +120 -0
  87. package/dist/runner.js.map +1 -0
  88. package/dist/runner.test.d.ts +1 -0
  89. package/dist/runner.test.js +287 -0
  90. package/dist/runner.test.js.map +1 -0
  91. package/dist/test-util/jest/resolver.cjs +31 -0
  92. package/dist/test-util/jest/resolver.cjs.map +1 -0
  93. package/dist/test-util/jest/resolver.d.cts +16 -0
  94. package/dist/test-util/tsserver.d.ts +31 -0
  95. package/dist/test-util/tsserver.js +112 -0
  96. package/dist/test-util/tsserver.js.map +1 -0
  97. package/dist/test-util/util.d.ts +29 -0
  98. package/dist/test-util/util.js +85 -0
  99. package/dist/test-util/util.js.map +1 -0
  100. package/dist/transformer/index.d.ts +30 -0
  101. package/dist/transformer/index.js +25 -0
  102. package/dist/transformer/index.js.map +1 -0
  103. package/dist/transformer/index.test.d.ts +1 -0
  104. package/dist/transformer/index.test.js +66 -0
  105. package/dist/transformer/index.test.js.map +1 -0
  106. package/dist/transformer/less-transformer.d.ts +2 -0
  107. package/dist/transformer/less-transformer.js +45 -0
  108. package/dist/transformer/less-transformer.js.map +1 -0
  109. package/dist/transformer/less-transformer.test.d.ts +1 -0
  110. package/dist/transformer/less-transformer.test.js +134 -0
  111. package/dist/transformer/less-transformer.test.js.map +1 -0
  112. package/dist/transformer/postcss-transformer.d.ts +12 -0
  113. package/dist/transformer/postcss-transformer.js +32 -0
  114. package/dist/transformer/postcss-transformer.js.map +1 -0
  115. package/dist/transformer/postcss-transformer.test.d.ts +1 -0
  116. package/dist/transformer/postcss-transformer.test.js +178 -0
  117. package/dist/transformer/postcss-transformer.test.js.map +1 -0
  118. package/dist/transformer/scss-transformer.d.ts +2 -0
  119. package/dist/transformer/scss-transformer.js +40 -0
  120. package/dist/transformer/scss-transformer.js.map +1 -0
  121. package/dist/transformer/scss-transformer.test.d.ts +1 -0
  122. package/dist/transformer/scss-transformer.test.js +149 -0
  123. package/dist/transformer/scss-transformer.test.js.map +1 -0
  124. package/dist/util.d.ts +21 -0
  125. package/dist/util.js +72 -0
  126. package/dist/util.js.map +1 -0
  127. package/dist/util.test.d.ts +1 -0
  128. package/dist/util.test.js +74 -0
  129. package/dist/util.test.js.map +1 -0
  130. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ import { readFile, rm, stat } from 'fs/promises';
2
+ import { createFixtures, getFixturePath } from '../test-util/util.js';
3
+ import { writeFileIfChanged } from './file-system.js';
4
+ const TEST_FILE_PATH = getFixturePath('/test.txt');
5
+ const TEST_NESTED_FILE_PATH = getFixturePath('/dir/test.txt');
6
+ const OLD_CONTENT = 'old';
7
+ const NEW_CONTENT = 'new';
8
+ beforeEach(async () => {
9
+ createFixtures({});
10
+ await writeFileIfChanged(TEST_FILE_PATH, OLD_CONTENT);
11
+ });
12
+ describe('writeFileIfChanged', () => {
13
+ test('should write file if changed', async () => {
14
+ await writeFileIfChanged(TEST_FILE_PATH, NEW_CONTENT);
15
+ expect(await readFile(TEST_FILE_PATH, 'utf8')).toBe(NEW_CONTENT);
16
+ });
17
+ test('should not write file if not changed', async () => {
18
+ const oldStat = await stat(TEST_FILE_PATH);
19
+ await writeFileIfChanged(TEST_FILE_PATH, OLD_CONTENT);
20
+ const newStat = await stat(TEST_FILE_PATH);
21
+ expect(oldStat.mtimeMs).toBe(newStat.mtimeMs);
22
+ });
23
+ test("should create new file if it doesn't exist", async () => {
24
+ await rm(TEST_FILE_PATH);
25
+ await writeFileIfChanged(TEST_FILE_PATH, NEW_CONTENT);
26
+ expect(await readFile(TEST_FILE_PATH, 'utf8')).toBe(NEW_CONTENT);
27
+ });
28
+ test('should write file in nested directories', async () => {
29
+ await writeFileIfChanged(TEST_NESTED_FILE_PATH, NEW_CONTENT);
30
+ expect(await readFile(TEST_NESTED_FILE_PATH, 'utf8')).toBe(NEW_CONTENT);
31
+ await writeFileIfChanged(TEST_NESTED_FILE_PATH, NEW_CONTENT);
32
+ });
33
+ });
34
+ //# sourceMappingURL=file-system.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.test.js","sourceRoot":"","sources":["../../src/emitter/file-system.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,cAAc,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;AACnD,MAAM,qBAAqB,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;AAC9D,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG,KAAK,CAAC;AAE1B,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,cAAc,CAAC,EAAE,CAAC,CAAC;IACnB,MAAM,kBAAkB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,kBAAkB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,kBAAkB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,EAAE,CAAC,cAAc,CAAC,CAAC;QACzB,MAAM,kBAAkB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,kBAAkB,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxE,MAAM,kBAAkB,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type Token } from '../locator/index.js';
2
+ import { type LocalsConvention } from '../runner.js';
3
+ export declare function getRelativePath(fromFilePath: string, toFilePath: string): string;
4
+ export declare function isSubDirectoryFile(fromDirectory: string, toFilePath: string): boolean;
5
+ export type DtsFormatOptions = {
6
+ /**
7
+ * Style of exported class names.
8
+ * @default undefined
9
+ */
10
+ localsConvention?: LocalsConvention;
11
+ /**
12
+ * Generate `.d.css.ts` instead of `.css.d.ts`.
13
+ * @default false
14
+ */
15
+ arbitraryExtensions?: boolean | undefined;
16
+ };
17
+ /** The options for emitter. */
18
+ export type EmitterOptions = {
19
+ /** The path to the source file (i.e. `/dir/foo.css`). It is absolute. */
20
+ filePath: string;
21
+ /** The tokens exported by the source file. */
22
+ tokens: Token[];
23
+ /** Whether to output declaration map (i.e. `/dir/foo.css.d.ts.map`) or not. */
24
+ emitDeclarationMap: boolean | undefined;
25
+ /** The options for formatting the type definition. */
26
+ dtsFormatOptions: DtsFormatOptions | undefined;
27
+ /** Whether the file is from an external library or not. */
28
+ isExternalFile: (filePath: string) => boolean;
29
+ };
30
+ export declare function emitGeneratedFiles({ filePath, tokens, emitDeclarationMap, dtsFormatOptions, isExternalFile, }: EmitterOptions): Promise<void>;
31
+ /**
32
+ * Returns true if .d.ts (and .d.ts.map) files are generated for the given file.
33
+ */
34
+ export declare function isGeneratedFilesExist(filePath: string, emitDeclarationMap: boolean | undefined, arbitraryExtensions: boolean): Promise<boolean>;
@@ -0,0 +1,49 @@
1
+ import { dirname, isAbsolute, relative } from 'path';
2
+ import { DEFAULT_ARBITRARY_EXTENSIONS } from '../config.js';
3
+ import { exists } from '../util.js';
4
+ import { generateDtsContentWithSourceMap, getDtsFilePath } from './dts.js';
5
+ import { writeFileIfChanged } from './file-system.js';
6
+ import { generateSourceMappingURLComment, getSourceMapFilePath } from './source-map.js';
7
+ export function getRelativePath(fromFilePath, toFilePath) {
8
+ const resolved = relative(dirname(fromFilePath), toFilePath);
9
+ if (resolved.startsWith('..')) {
10
+ return resolved;
11
+ }
12
+ else {
13
+ return `./${resolved}`;
14
+ }
15
+ }
16
+ export function isSubDirectoryFile(fromDirectory, toFilePath) {
17
+ return isAbsolute(toFilePath) && toFilePath.startsWith(fromDirectory);
18
+ }
19
+ export async function emitGeneratedFiles({ filePath, tokens, emitDeclarationMap, dtsFormatOptions, isExternalFile, }) {
20
+ const arbitraryExtensions = dtsFormatOptions?.arbitraryExtensions ?? DEFAULT_ARBITRARY_EXTENSIONS;
21
+ const dtsFilePath = getDtsFilePath(filePath, arbitraryExtensions);
22
+ const sourceMapFilePath = getSourceMapFilePath(filePath, arbitraryExtensions);
23
+ const { dtsContent, sourceMap } = generateDtsContentWithSourceMap(filePath, dtsFilePath, sourceMapFilePath, tokens, dtsFormatOptions, isExternalFile);
24
+ if (emitDeclarationMap) {
25
+ const sourceMappingURLComment = generateSourceMappingURLComment(dtsFilePath, sourceMapFilePath);
26
+ await writeFileIfChanged(dtsFilePath, dtsContent + sourceMappingURLComment);
27
+ // NOTE: tsserver does not support inline declaration maps. Therefore, sourcemap files must be output.
28
+ // blocked by: https://github.com/microsoft/TypeScript/issues/38966
29
+ await writeFileIfChanged(sourceMapFilePath, sourceMap.toString());
30
+ }
31
+ else {
32
+ await writeFileIfChanged(dtsFilePath, dtsContent);
33
+ }
34
+ }
35
+ /**
36
+ * Returns true if .d.ts (and .d.ts.map) files are generated for the given file.
37
+ */
38
+ export async function isGeneratedFilesExist(filePath, emitDeclarationMap, arbitraryExtensions) {
39
+ const dtsFilePath = getDtsFilePath(filePath, arbitraryExtensions);
40
+ const sourceMapFilePath = getSourceMapFilePath(filePath, arbitraryExtensions);
41
+ if (emitDeclarationMap && !(await exists(sourceMapFilePath))) {
42
+ return false;
43
+ }
44
+ if (!(await exists(dtsFilePath))) {
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/emitter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrD,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAG5D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,+BAA+B,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAExF,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,UAAkB;IACtE,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7D,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,KAAK,QAAQ,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,aAAqB,EAAE,UAAkB;IAC1E,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AACxE,CAAC;AA6BD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,GACC;IACf,MAAM,mBAAmB,GAAG,gBAAgB,EAAE,mBAAmB,IAAI,4BAA4B,CAAC;IAClG,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC9E,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,+BAA+B,CAC/D,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,gBAAgB,EAChB,cAAc,CACf,CAAC;IAEF,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,uBAAuB,GAAG,+BAA+B,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAChG,MAAM,kBAAkB,CAAC,WAAW,EAAE,UAAU,GAAG,uBAAuB,CAAC,CAAC;QAC5E,sGAAsG;QACtG,mEAAmE;QACnE,MAAM,kBAAkB,CAAC,iBAAiB,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,MAAM,kBAAkB,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,kBAAuC,EACvC,mBAA4B;IAE5B,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAClE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IAC9E,IAAI,kBAAkB,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,68 @@
1
+ import { readFile, stat } from 'fs/promises';
2
+ import { jest } from '@jest/globals';
3
+ import { createFixtures, exists, fakeToken, getFixturePath, waitForAsyncTask } from '../test-util/util.js';
4
+ import { emitGeneratedFiles, getRelativePath, isSubDirectoryFile } from './index.js';
5
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
6
+ const consoleLogSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
7
+ beforeEach(() => {
8
+ consoleLogSpy.mockClear();
9
+ });
10
+ test('getRelativePath', () => {
11
+ expect(getRelativePath('/test/1.css.d.ts', '/test/1.css')).toBe('./1.css');
12
+ expect(getRelativePath('/test/1.css.d.ts', '/test/dir/1.css')).toBe('./dir/1.css');
13
+ expect(getRelativePath('/test/1.css.d.ts', '/1.css')).toBe('../1.css');
14
+ });
15
+ test('isSubDirectoryFile', () => {
16
+ expect(isSubDirectoryFile('/test', '/test/src/1.css')).toBe(true);
17
+ expect(isSubDirectoryFile('/test', '/test/dist/1.css')).toBe(true);
18
+ expect(isSubDirectoryFile('/test', '/1.css')).toBe(false);
19
+ });
20
+ describe('emitGeneratedFiles', () => {
21
+ const defaultArgs = {
22
+ filePath: getFixturePath('/test/1.css'),
23
+ tokens: [fakeToken({ name: 'foo', originalLocation: { start: { line: 1, column: 1 } } })],
24
+ emitDeclarationMap: true,
25
+ dtsFormatOptions: undefined,
26
+ cwd: getFixturePath('/test'),
27
+ isExternalFile: () => false,
28
+ };
29
+ beforeEach(() => {
30
+ createFixtures({
31
+ '/test': {}, // empty directory
32
+ });
33
+ });
34
+ test('generates .d.ts and .d.ts.map', async () => {
35
+ await emitGeneratedFiles({ ...defaultArgs });
36
+ expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBeTruthy();
37
+ // A link to the source map is embedded.
38
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toEqual(expect.stringContaining('//# sourceMappingURL=./1.css.d.ts.map'));
39
+ expect(await exists(getFixturePath('/test/1.css.d.ts.map'))).toBeTruthy();
40
+ });
41
+ test('generates only .d.ts and .d.ts.map if emitDeclarationMap is false', async () => {
42
+ await emitGeneratedFiles({ ...defaultArgs, emitDeclarationMap: false });
43
+ expect(await exists(getFixturePath('/test/1.css.d.ts'))).toBeTruthy();
44
+ // A link to the source map is not embedded.
45
+ expect(await readFile(getFixturePath('/test/1.css.d.ts'), 'utf8')).toEqual(expect.not.stringContaining('//# sourceMappingURL=1.css.d.ts.map'));
46
+ expect(await exists(getFixturePath('/test/1.css.d.ts.map'))).toBeFalsy();
47
+ });
48
+ test('skips writing to disk if the generated files are the same', async () => {
49
+ const tokens1 = [fakeToken({ name: 'foo', originalLocation: { start: { line: 1, column: 1 } } })];
50
+ await emitGeneratedFiles({ ...defaultArgs, tokens: tokens1 });
51
+ const mtimeForDts1 = (await stat(getFixturePath('/test/1.css.d.ts'))).mtime;
52
+ const mtimeForSourceMap1 = (await stat(getFixturePath('/test/1.css.d.ts.map'))).mtime;
53
+ await waitForAsyncTask(1); // so that mtime changes.
54
+ await emitGeneratedFiles({ ...defaultArgs, tokens: tokens1 });
55
+ const mtimeForDts2 = (await stat(getFixturePath('/test/1.css.d.ts'))).mtime;
56
+ const mtimeForSourceMap2 = (await stat(getFixturePath('/test/1.css.d.ts.map'))).mtime;
57
+ expect(mtimeForDts1).toEqual(mtimeForDts2); // skipped
58
+ expect(mtimeForSourceMap1).toEqual(mtimeForSourceMap2); // skipped
59
+ await waitForAsyncTask(1); // so that mtime changes.
60
+ const tokens2 = [fakeToken({ name: 'bar', originalLocation: { start: { line: 1, column: 1 } } })];
61
+ await emitGeneratedFiles({ ...defaultArgs, tokens: tokens2 });
62
+ const mtimeForDts3 = (await stat(getFixturePath('/test/1.css.d.ts'))).mtime;
63
+ const mtimeForSourceMap3 = (await stat(getFixturePath('/test/1.css.d.ts.map'))).mtime;
64
+ expect(mtimeForDts1).not.toEqual(mtimeForDts3); // not skipped
65
+ expect(mtimeForSourceMap1).not.toEqual(mtimeForSourceMap3); // not skipped
66
+ });
67
+ });
68
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/emitter/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Get .d.ts.map file path.
3
+ * @param filePath The path to the source file (i.e. `foo.css`). It is absolute.
4
+ * @param arbitraryExtensions Generate `.d.css.ts` instead of `.css.d.ts`.
5
+ * @returns The path to the .d.ts.map file. It is absolute.
6
+ */
7
+ export declare function getSourceMapFilePath(filePath: string, arbitraryExtensions: boolean): string;
8
+ export declare function generateSourceMappingURLComment(dtsFilePath: string, sourceMapFilePath: string): string;
@@ -0,0 +1,16 @@
1
+ import { EOL } from 'os';
2
+ import { getDtsFilePath } from './dts.js';
3
+ import { getRelativePath } from './index.js';
4
+ /**
5
+ * Get .d.ts.map file path.
6
+ * @param filePath The path to the source file (i.e. `foo.css`). It is absolute.
7
+ * @param arbitraryExtensions Generate `.d.css.ts` instead of `.css.d.ts`.
8
+ * @returns The path to the .d.ts.map file. It is absolute.
9
+ */
10
+ export function getSourceMapFilePath(filePath, arbitraryExtensions) {
11
+ return `${getDtsFilePath(filePath, arbitraryExtensions)}.map`;
12
+ }
13
+ export function generateSourceMappingURLComment(dtsFilePath, sourceMapFilePath) {
14
+ return `//# sourceMappingURL=${getRelativePath(dtsFilePath, sourceMapFilePath)}${EOL}`;
15
+ }
16
+ //# sourceMappingURL=source-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-map.js","sourceRoot":"","sources":["../../src/emitter/source-map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,mBAA4B;IACjF,OAAO,GAAG,cAAc,CAAC,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,WAAmB,EAAE,iBAAyB;IAC5F,OAAO,wBAAwB,eAAe,CAAC,WAAW,EAAE,iBAAiB,CAAC,GAAG,GAAG,EAAE,CAAC;AACzF,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ import { EOL } from 'os';
2
+ import { getSourceMapFilePath, generateSourceMappingURLComment } from './source-map.js';
3
+ test('getSourceMapFilePath', () => {
4
+ expect(getSourceMapFilePath('/app/src/dir/1.css', false)).toBe('/app/src/dir/1.css.d.ts.map');
5
+ expect(getSourceMapFilePath('/app/src/dir/1.scss', false)).toBe('/app/src/dir/1.scss.d.ts.map');
6
+ expect(getSourceMapFilePath('/app/src/dir/1.css', true)).toBe('/app/src/dir/1.d.css.ts.map');
7
+ expect(getSourceMapFilePath('/app/src/dir/1.scss', true)).toBe('/app/src/dir/1.d.scss.ts.map');
8
+ });
9
+ test('generateSourceMappingURLComment', () => {
10
+ expect(generateSourceMappingURLComment('/app/src/dir/1.css.d.ts', '/app/src/dir/1.css.d.ts.map')).toBe(`//# sourceMappingURL=./1.css.d.ts.map${EOL}`);
11
+ expect(generateSourceMappingURLComment('/app/src/dir1/1.css.d.ts', '/app/src/dir2/1.css.d.ts.map')).toBe(`//# sourceMappingURL=../dir2/1.css.d.ts.map${EOL}`);
12
+ });
13
+ //# sourceMappingURL=source-map.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-map.test.js","sourceRoot":"","sources":["../../src/emitter/source-map.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,MAAM,iBAAiB,CAAC;AAExF,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;IAChC,MAAM,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC9F,MAAM,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAChG,MAAM,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7F,MAAM,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;AACjG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC3C,MAAM,CAAC,+BAA+B,CAAC,yBAAyB,EAAE,6BAA6B,CAAC,CAAC,CAAC,IAAI,CACpG,wCAAwC,GAAG,EAAE,CAC9C,CAAC;IACF,MAAM,CAAC,+BAA+B,CAAC,0BAA0B,EAAE,8BAA8B,CAAC,CAAC,CAAC,IAAI,CACtG,8CAA8C,GAAG,EAAE,CACpD,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { parseArgv } from './cli.js';
2
+ export { run, type LocalsConvention } from './runner.js';
3
+ export { type Transformer, type TransformerOptions, type TransformResult, createDefaultTransformer, } from './transformer/index.js';
4
+ export { type Resolver, type ResolverOptions, createDefaultResolver } from './resolver/index.js';
5
+ export { Locator, type LocatorOptions, type LoadResult, type Token, type Location } from './locator/index.js';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { parseArgv } from './cli.js';
2
+ export { run } from './runner.js';
3
+ export { createDefaultTransformer, } from './transformer/index.js';
4
+ export { createDefaultResolver } from './resolver/index.js';
5
+ export { Locator } from './locator/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,GAAG,EAAyB,MAAM,aAAa,CAAC;AACzD,OAAO,EAIL,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAuC,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,OAAO,EAAmE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,334 @@
1
+ import dedent from 'dedent';
2
+ import { run } from '../runner.js';
3
+ import { createTSServer } from '../test-util/tsserver.js';
4
+ import { createFixtures, getFixturePath } from '../test-util/util.js';
5
+ const server = createTSServer();
6
+ const defaultOptions = {
7
+ pattern: 'test/**/*.{css,scss}',
8
+ logLevel: 'silent',
9
+ declarationMap: true,
10
+ cwd: getFixturePath('/'),
11
+ cache: false,
12
+ };
13
+ afterAll(async () => {
14
+ await server.exit();
15
+ });
16
+ test('basic', async () => {
17
+ createFixtures({
18
+ '/test/1.css': dedent `
19
+ .basic {}
20
+ .cascading {}
21
+ .cascading {}
22
+ .pseudo_class_1 {}
23
+ .pseudo_class_2:hover {}
24
+ :not(.pseudo_class_3) {}
25
+ .multiple_selector_1.multiple_selector_2 {}
26
+ .combinator_1 + .combinator_2 {}
27
+ @supports (display: flex) {
28
+ @media screen and (min-width: 900px) {
29
+ .at_rule {}
30
+ }
31
+ }
32
+ .selector_list_1, .selector_list_2 {}
33
+ :local .local_class_name_1 {}
34
+ :local {
35
+ .local_class_name_2 {}
36
+ .local_class_name_3 {}
37
+ }
38
+ :local(.local_class_name_4) {}
39
+ `,
40
+ });
41
+ await run({ ...defaultOptions });
42
+ const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.css`), [
43
+ 'basic',
44
+ 'cascading',
45
+ 'pseudo_class_1',
46
+ 'pseudo_class_2',
47
+ 'pseudo_class_3',
48
+ 'multiple_selector_1',
49
+ 'multiple_selector_2',
50
+ 'combinator_1',
51
+ 'combinator_2',
52
+ 'at_rule',
53
+ 'selector_list_1',
54
+ 'selector_list_2',
55
+ 'local_class_name_1',
56
+ 'local_class_name_2',
57
+ 'local_class_name_3',
58
+ 'local_class_name_4',
59
+ ]);
60
+ // FIXME: Fix an issue where the text at definition destination was incorrect.
61
+ expect(results).toMatchInlineSnapshot(`
62
+ [
63
+ {
64
+ "definitions": [
65
+ { file: "<fixtures>/test/1.css", text: ".basic ", start: { line: 1, offset: 1 }, end: { line: 1, offset: 8 } },
66
+ ],
67
+ "identifier": "basic",
68
+ },
69
+ {
70
+ "definitions": [
71
+ { file: "<fixtures>/test/1.css", text: ".cascading ", start: { line: 2, offset: 1 }, end: { line: 2, offset: 12 } },
72
+ { file: "<fixtures>/test/1.css", text: ".cascading ", start: { line: 3, offset: 1 }, end: { line: 3, offset: 12 } },
73
+ ],
74
+ "identifier": "cascading",
75
+ },
76
+ {
77
+ "definitions": [
78
+ { file: "<fixtures>/test/1.css", text: ".pseudo_class_1 ", start: { line: 4, offset: 1 }, end: { line: 4, offset: 17 } },
79
+ ],
80
+ "identifier": "pseudo_class_1",
81
+ },
82
+ {
83
+ "definitions": [
84
+ { file: "<fixtures>/test/1.css", text: ".pseudo_class_2:", start: { line: 5, offset: 1 }, end: { line: 5, offset: 17 } },
85
+ ],
86
+ "identifier": "pseudo_class_2",
87
+ },
88
+ {
89
+ "definitions": [
90
+ { file: "<fixtures>/test/1.css", text: ".pseudo_class_3)", start: { line: 6, offset: 6 }, end: { line: 6, offset: 22 } },
91
+ ],
92
+ "identifier": "pseudo_class_3",
93
+ },
94
+ {
95
+ "definitions": [
96
+ {
97
+ file: "<fixtures>/test/1.css",
98
+ text: ".multiple_selector_1.",
99
+ start: { line: 7, offset: 1 },
100
+ end: { line: 7, offset: 22 },
101
+ },
102
+ ],
103
+ "identifier": "multiple_selector_1",
104
+ },
105
+ {
106
+ "definitions": [
107
+ {
108
+ file: "<fixtures>/test/1.css",
109
+ text: ".multiple_selector_2 ",
110
+ start: { line: 7, offset: 21 },
111
+ end: { line: 7, offset: 42 },
112
+ },
113
+ ],
114
+ "identifier": "multiple_selector_2",
115
+ },
116
+ {
117
+ "definitions": [
118
+ { file: "<fixtures>/test/1.css", text: ".combinator_1 ", start: { line: 8, offset: 1 }, end: { line: 8, offset: 15 } },
119
+ ],
120
+ "identifier": "combinator_1",
121
+ },
122
+ {
123
+ "definitions": [
124
+ { file: "<fixtures>/test/1.css", text: ".combinator_2 ", start: { line: 8, offset: 17 }, end: { line: 8, offset: 31 } },
125
+ ],
126
+ "identifier": "combinator_2",
127
+ },
128
+ {
129
+ "definitions": [
130
+ { file: "<fixtures>/test/1.css", text: ".at_rule ", start: { line: 11, offset: 5 }, end: { line: 11, offset: 14 } },
131
+ ],
132
+ "identifier": "at_rule",
133
+ },
134
+ {
135
+ "definitions": [
136
+ {
137
+ file: "<fixtures>/test/1.css",
138
+ text: ".selector_list_1,",
139
+ start: { line: 14, offset: 1 },
140
+ end: { line: 14, offset: 18 },
141
+ },
142
+ ],
143
+ "identifier": "selector_list_1",
144
+ },
145
+ {
146
+ "definitions": [
147
+ {
148
+ file: "<fixtures>/test/1.css",
149
+ text: ".selector_list_2 ",
150
+ start: { line: 14, offset: 19 },
151
+ end: { line: 14, offset: 36 },
152
+ },
153
+ ],
154
+ "identifier": "selector_list_2",
155
+ },
156
+ {
157
+ "definitions": [
158
+ {
159
+ file: "<fixtures>/test/1.css",
160
+ text: ".local_class_name_1 ",
161
+ start: { line: 15, offset: 8 },
162
+ end: { line: 15, offset: 28 },
163
+ },
164
+ ],
165
+ "identifier": "local_class_name_1",
166
+ },
167
+ {
168
+ "definitions": [
169
+ {
170
+ file: "<fixtures>/test/1.css",
171
+ text: ".local_class_name_2 ",
172
+ start: { line: 17, offset: 3 },
173
+ end: { line: 17, offset: 23 },
174
+ },
175
+ ],
176
+ "identifier": "local_class_name_2",
177
+ },
178
+ {
179
+ "definitions": [
180
+ {
181
+ file: "<fixtures>/test/1.css",
182
+ text: ".local_class_name_3 ",
183
+ start: { line: 18, offset: 3 },
184
+ end: { line: 18, offset: 23 },
185
+ },
186
+ ],
187
+ "identifier": "local_class_name_3",
188
+ },
189
+ {
190
+ "definitions": [
191
+ {
192
+ file: "<fixtures>/test/1.css",
193
+ text: ".local_class_name_4)",
194
+ start: { line: 20, offset: 8 },
195
+ end: { line: 20, offset: 28 },
196
+ },
197
+ ],
198
+ "identifier": "local_class_name_4",
199
+ },
200
+ ]
201
+ `);
202
+ const moduleDefinitions = await server.getModuleDefinitions(getFixturePath('/test/1.css'));
203
+ expect(moduleDefinitions).toMatchInlineSnapshot(`
204
+ [
205
+ { file: "<fixtures>/test/1.css", text: "", start: { line: 1, offset: 1 }, end: { line: 1, offset: 1 } },
206
+ ]
207
+ `);
208
+ });
209
+ test('imported tokens', async () => {
210
+ createFixtures({
211
+ '/test/1.css': dedent `
212
+ @import './2.css';
213
+ .a {}
214
+ .b {}
215
+ .b {}
216
+ `,
217
+ '/test/2.css': dedent `
218
+ @import './3.css';
219
+ .c {}
220
+ `,
221
+ '/test/3.css': dedent `
222
+ .d {}
223
+ `,
224
+ });
225
+ await run({ ...defaultOptions });
226
+ const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.css`), ['a', 'b', 'c', 'd']);
227
+ expect(results).toMatchInlineSnapshot(`
228
+ [
229
+ {
230
+ "definitions": [
231
+ { file: "<fixtures>/test/1.css", text: ".a ", start: { line: 2, offset: 1 }, end: { line: 2, offset: 4 } },
232
+ ],
233
+ "identifier": "a",
234
+ },
235
+ {
236
+ "definitions": [
237
+ { file: "<fixtures>/test/1.css", text: ".b ", start: { line: 3, offset: 1 }, end: { line: 3, offset: 4 } },
238
+ { file: "<fixtures>/test/1.css", text: ".b ", start: { line: 4, offset: 1 }, end: { line: 4, offset: 4 } },
239
+ ],
240
+ "identifier": "b",
241
+ },
242
+ {
243
+ "definitions": [
244
+ { file: "<fixtures>/test/2.css", text: ".c ", start: { line: 2, offset: 1 }, end: { line: 2, offset: 4 } },
245
+ ],
246
+ "identifier": "c",
247
+ },
248
+ {
249
+ "definitions": [
250
+ { file: "<fixtures>/test/3.css", text: ".d ", start: { line: 1, offset: 1 }, end: { line: 1, offset: 4 } },
251
+ ],
252
+ "identifier": "d",
253
+ },
254
+ ]
255
+ `);
256
+ });
257
+ test('with transformer', async () => {
258
+ createFixtures({
259
+ '/test/1.scss': dedent `
260
+ @use './2.scss' as two; // sass feature test (@use)
261
+ @import './3.scss'; // css feature test (@import)
262
+ .basic { dummy: ''; }
263
+ .nesting {
264
+ dummy: '';
265
+ // sass feature test (nesting)
266
+ .nesting_1 { dummy: ''; }
267
+ &_2 { dummy: ''; }
268
+ }
269
+ `,
270
+ '/test/2.scss': dedent `
271
+ .b_1 { dummy: ''; }
272
+ @mixin b_2 { dummy: ''; }
273
+ `,
274
+ '/test/3.scss': dedent `
275
+ .c { dummy: ''; }
276
+ `,
277
+ });
278
+ await run({ ...defaultOptions });
279
+ const results = await server.getMultipleIdentifierDefinitions(getFixturePath(`/test/1.scss`), [
280
+ 'basic',
281
+ 'nesting',
282
+ 'nesting_1',
283
+ 'nesting_2',
284
+ 'b_1',
285
+ 'b_2',
286
+ 'c',
287
+ ]);
288
+ expect(results).toMatchInlineSnapshot(`
289
+ [
290
+ {
291
+ "definitions": [
292
+ { file: "<fixtures>/test/1.scss", text: ".basic ", start: { line: 3, offset: 1 }, end: { line: 3, offset: 8 } },
293
+ ],
294
+ "identifier": "basic",
295
+ },
296
+ {
297
+ "definitions": [
298
+ { file: "<fixtures>/test/1.scss", text: ".nesting ", start: { line: 4, offset: 1 }, end: { line: 4, offset: 10 } },
299
+ { file: "<fixtures>/test/1.scss", text: ".nesting_", start: { line: 7, offset: 3 }, end: { line: 7, offset: 12 } },
300
+ ],
301
+ "identifier": "nesting",
302
+ },
303
+ {
304
+ "definitions": [
305
+ { file: "<fixtures>/test/1.scss", text: ".nesting_1 ", start: { line: 7, offset: 3 }, end: { line: 7, offset: 14 } },
306
+ ],
307
+ "identifier": "nesting_1",
308
+ },
309
+ {
310
+ "definitions": [
311
+ { file: "<fixtures>/test/1.scss", text: "&_2 { dummy", start: { line: 8, offset: 3 }, end: { line: 8, offset: 14 } },
312
+ ],
313
+ "identifier": "nesting_2",
314
+ },
315
+ {
316
+ "definitions": [
317
+ { file: "<fixtures>/test/2.scss", text: ".b_1 ", start: { line: 1, offset: 1 }, end: { line: 1, offset: 6 } },
318
+ ],
319
+ "identifier": "b_1",
320
+ },
321
+ {
322
+ "definitions": [],
323
+ "identifier": "b_2",
324
+ },
325
+ {
326
+ "definitions": [
327
+ { file: "<fixtures>/test/3.scss", text: ".c ", start: { line: 1, offset: 1 }, end: { line: 1, offset: 4 } },
328
+ ],
329
+ "identifier": "c",
330
+ },
331
+ ]
332
+ `);
333
+ });
334
+ //# sourceMappingURL=go-to-definition.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-to-definition.test.js","sourceRoot":"","sources":["../../src/integration-test/go-to-definition.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { SourceNode as OriginalSourceNode, type CodeWithSourceMap } from 'source-map';
2
+ type Chunk = string | StrictlyTypedSourceNode | Chunk[];
3
+ interface StrictlyTypedSourceNode extends OriginalSourceNode {
4
+ new (line: number | null, column: number | null, source: string | null): StrictlyTypedSourceNode;
5
+ new (line: number | null, column: number | null, source: string | null, chunk?: Chunk, name?: string): StrictlyTypedSourceNode;
6
+ }
7
+ declare const SourceNode: StrictlyTypedSourceNode;
8
+ export { SourceNode, type CodeWithSourceMap };
@@ -0,0 +1,5 @@
1
+ import { SourceNode as OriginalSourceNode } from 'source-map';
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const SourceNode = OriginalSourceNode;
4
+ export { SourceNode };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/library/source-map/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,kBAAkB,EAA0B,MAAM,YAAY,CAAC;AAsBtF,8DAA8D;AAC9D,MAAM,UAAU,GAA4B,kBAAyB,CAAC;AAEtE,OAAO,EAAE,UAAU,EAA0B,CAAC"}