Skip to content

Commit 1d0ef1d

Browse files
committed
Change to use export map
1 parent 41b4be0 commit 1d0ef1d

File tree

10 files changed

+711
-674
lines changed

10 files changed

+711
-674
lines changed

lib/all.js

Lines changed: 587 additions & 586 deletions
Large diffs are not rendered by default.

lib/common.js

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,41 @@
22
* @typedef {import('./index.js').Grammar} Grammar
33
*/
44

5-
import sourceC from '../lang/source.c.js'
6-
import sourceCpp from '../lang/source.c++.js'
7-
import sourceCPlatform from '../lang/source.c.platform.js'
8-
import sourceCs from '../lang/source.cs.js'
9-
import sourceCss from '../lang/source.css.js'
10-
import sourceCssLess from '../lang/source.css.less.js'
11-
import sourceCssScss from '../lang/source.css.scss.js'
12-
import sourceDiff from '../lang/source.diff.js'
13-
import sourceGo from '../lang/source.go.js'
14-
import sourceGraphql from '../lang/source.graphql.js'
15-
import sourceIni from '../lang/source.ini.js'
16-
import sourceJava from '../lang/source.java.js'
17-
import sourceJs from '../lang/source.js.js'
18-
import sourceJson from '../lang/source.json.js'
19-
import sourceKotlin from '../lang/source.kotlin.js'
20-
import sourceLua from '../lang/source.lua.js'
21-
import sourceMakefile from '../lang/source.makefile.js'
22-
import sourceObjc from '../lang/source.objc.js'
23-
import sourceObjcPlatform from '../lang/source.objc.platform.js'
24-
import sourcePerl from '../lang/source.perl.js'
25-
import sourcePython from '../lang/source.python.js'
26-
import sourceR from '../lang/source.r.js'
27-
import sourceRuby from '../lang/source.ruby.js'
28-
import sourceRust from '../lang/source.rust.js'
29-
import sourceShell from '../lang/source.shell.js'
30-
import sourceSql from '../lang/source.sql.js'
31-
import sourceSwift from '../lang/source.swift.js'
32-
import sourceTs from '../lang/source.ts.js'
33-
import sourceVbnet from '../lang/source.vbnet.js'
34-
import sourceYaml from '../lang/source.yaml.js'
35-
import textHtmlBasic from '../lang/text.html.basic.js'
36-
import textHtmlPhp from '../lang/text.html.php.js'
37-
import textMd from '../lang/text.md.js'
38-
import textXml from '../lang/text.xml.js'
39-
import textXmlSvg from '../lang/text.xml.svg.js'
5+
import sourceC from '@wooorm/starry-night/source.c'
6+
import sourceCpp from '@wooorm/starry-night/source.c++'
7+
import sourceCPlatform from '@wooorm/starry-night/source.c.platform'
8+
import sourceCs from '@wooorm/starry-night/source.cs'
9+
import sourceCss from '@wooorm/starry-night/source.css'
10+
import sourceCssLess from '@wooorm/starry-night/source.css.less'
11+
import sourceCssScss from '@wooorm/starry-night/source.css.scss'
12+
import sourceDiff from '@wooorm/starry-night/source.diff'
13+
import sourceGo from '@wooorm/starry-night/source.go'
14+
import sourceGraphql from '@wooorm/starry-night/source.graphql'
15+
import sourceIni from '@wooorm/starry-night/source.ini'
16+
import sourceJava from '@wooorm/starry-night/source.java'
17+
import sourceJs from '@wooorm/starry-night/source.js'
18+
import sourceJson from '@wooorm/starry-night/source.json'
19+
import sourceKotlin from '@wooorm/starry-night/source.kotlin'
20+
import sourceLua from '@wooorm/starry-night/source.lua'
21+
import sourceMakefile from '@wooorm/starry-night/source.makefile'
22+
import sourceObjc from '@wooorm/starry-night/source.objc'
23+
import sourceObjcPlatform from '@wooorm/starry-night/source.objc.platform'
24+
import sourcePerl from '@wooorm/starry-night/source.perl'
25+
import sourcePython from '@wooorm/starry-night/source.python'
26+
import sourceR from '@wooorm/starry-night/source.r'
27+
import sourceRuby from '@wooorm/starry-night/source.ruby'
28+
import sourceRust from '@wooorm/starry-night/source.rust'
29+
import sourceShell from '@wooorm/starry-night/source.shell'
30+
import sourceSql from '@wooorm/starry-night/source.sql'
31+
import sourceSwift from '@wooorm/starry-night/source.swift'
32+
import sourceTs from '@wooorm/starry-night/source.ts'
33+
import sourceVbnet from '@wooorm/starry-night/source.vbnet'
34+
import sourceYaml from '@wooorm/starry-night/source.yaml'
35+
import textHtmlBasic from '@wooorm/starry-night/text.html.basic'
36+
import textHtmlPhp from '@wooorm/starry-night/text.html.php'
37+
import textMd from '@wooorm/starry-night/text.md'
38+
import textXml from '@wooorm/starry-night/text.xml'
39+
import textXmlSvg from '@wooorm/starry-night/text.xml.svg'
4040

4141
/** @type {ReadonlyArray<Grammar>} */
4242
export const grammars = [
@@ -53,6 +53,7 @@ export const grammars = [
5353
sourceIni,
5454
sourceJava,
5555
sourceJs,
56+
// @ts-expect-error: TS is wrong, `.json` does not mean JSON.
5657
sourceJson,
5758
sourceKotlin,
5859
sourceLua,
File renamed without changes.
File renamed without changes.

lib/index.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@
9797

9898
import vscodeOniguruma from 'vscode-oniguruma'
9999
import vscodeTextmate from 'vscode-textmate'
100-
import {getOniguruma} from './get-oniguruma.js'
101100
import {parse} from './parse.js'
102101
import {theme} from './theme.js'
102+
import {getOniguruma} from '#get-oniguruma'
103103

104104
/**
105105
* Create a `StarryNight` that can highlight things with the given
@@ -210,7 +210,7 @@ export async function createStarryNight(grammars, options) {
210210
* @example
211211
* ```js
212212
* import {createStarryNight} from '@wooorm/starry-night'
213-
* import sourceCss from '@wooorm/starry-night/lang/source.css.js'
213+
* import sourceCss from '@wooorm/starry-night/source.css'
214214
*
215215
* const starryNight = await createStarryNight([sourceCss])
216216
*
@@ -272,8 +272,8 @@ export async function createStarryNight(grammars, options) {
272272
* @example
273273
* ```js
274274
* import {createStarryNight} from '@wooorm/starry-night'
275-
* import textXml from '@wooorm/starry-night/lang/text.xml.js'
276-
* import textXmlSvg from '@wooorm/starry-night/lang/text.xml.svg.js'
275+
* import textXml from '@wooorm/starry-night/text.xml'
276+
* import textXmlSvg from '@wooorm/starry-night/text.xml.svg'
277277
*
278278
* const svg = await createStarryNight([textXmlSvg])
279279
* console.log(svg.missingScopes()) //=> ['text.xml']
@@ -314,8 +314,8 @@ export async function createStarryNight(grammars, options) {
314314
* @example
315315
* ````js
316316
* import {createStarryNight} from '@wooorm/starry-night'
317-
* import sourceCss from '@wooorm/starry-night/lang/source.css.js'
318-
* import textMd from '@wooorm/starry-night/lang/text.md.js'
317+
* import sourceCss from '@wooorm/starry-night/source.css'
318+
* import textMd from '@wooorm/starry-night/text.md'
319319
* import {toHtml} from 'hast-util-to-html'
320320
*
321321
* const markdown = '```css\nem { color: red }\n```'

package.json

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,16 @@
3232
],
3333
"type": "module",
3434
"main": "index.js",
35-
"browser": {
36-
"./lib/get-oniguruma.js": "./lib/get-oniguruma.fetch.js"
35+
"exports": {
36+
".": "./index.js",
37+
"./*": "./lang/*.js",
38+
"./style/*": "./style/*.css"
3739
},
38-
"react-native": {
39-
"./lib/get-oniguruma.js": "./lib/get-oniguruma.fetch.js"
40+
"imports": {
41+
"#get-oniguruma": {
42+
"node": "./lib/get-oniguruma.fs.js",
43+
"default": "./lib/get-oniguruma.default.js"
44+
}
4045
},
4146
"types": "index.d.ts",
4247
"files": [
@@ -145,6 +150,7 @@
145150
"prettier": true,
146151
"rules": {
147152
"max-depth": "off",
153+
"n/file-extension-in-import": "off",
148154
"no-bitwise": "off",
149155
"no-template-curly-in-string": "off",
150156
"unicorn/prefer-at": "off",

readme.md

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ To get the CSS in browsers, do (see [CSS][] for more info):
161161

162162
```html
163163
<!-- This supports light and dark mode automatically. -->
164-
<link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@2/style/both.css">
164+
<link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@2/style/both">
165165
```
166166

167167
## Use
@@ -204,9 +204,19 @@ Yields:
204204
## API
205205

206206
This package exports the identifiers [`all`][api-all],
207-
[`common`][api-common], and [`createStarryNight`][api-create-starry-night].
207+
[`common`][api-common], and [`createStarryNight`][api-create-starry-night] from
208+
the main module.
208209
There is no default export.
209210

211+
It also includes grammars directly in its export map.
212+
**Do not** use the `lang/` folder or the `.js` extension.
213+
For CSS files, do use `style/` but don’t use `.css`:
214+
215+
```js
216+
import mdx from '@wooorm/starry-night/source.mdx' // Grammar.
217+
import tritanopiaDark from '@wooorm/starry-night/style/tritanopia-dark' // CSS.
218+
```
219+
210220
### `all`
211221

212222
List of all grammars ([`Array<Grammar>`][api-grammar])
@@ -303,7 +313,7 @@ Node representing highlighted code ([`Root`][hast-root]).
303313

304314
```js
305315
import {createStarryNight} from '@wooorm/starry-night'
306-
import sourceCss from '@wooorm/starry-night/lang/source.css.js'
316+
import sourceCss from '@wooorm/starry-night/source.css'
307317

308318
const starryNight = await createStarryNight([sourceCss])
309319

@@ -342,8 +352,8 @@ List of grammar scopes, such as `'text.md'` (`Array<string>`).
342352

343353
```js
344354
import {createStarryNight} from '@wooorm/starry-night'
345-
import textXml from '@wooorm/starry-night/lang/text.xml.js'
346-
import textXmlSvg from '@wooorm/starry-night/lang/text.xml.svg.js'
355+
import textXml from '@wooorm/starry-night/text.xml'
356+
import textXmlSvg from '@wooorm/starry-night/text.xml.svg'
347357

348358
const svg = await createStarryNight([textXmlSvg])
349359
console.log(svg.missingScopes()) //=> ['text.xml']
@@ -369,8 +379,8 @@ Promise resolving to nothing (`Promise<undefined>`).
369379

370380
````js
371381
import {createStarryNight} from '@wooorm/starry-night'
372-
import sourceCss from '@wooorm/starry-night/lang/source.css.js'
373-
import textMd from '@wooorm/starry-night/lang/text.md.js'
382+
import sourceCss from '@wooorm/starry-night/source.css'
383+
import textMd from '@wooorm/starry-night/text.md'
374384
import {toHtml} from 'hast-util-to-html'
375385

376386
const markdown = '```css\nem { color: red }\n```'
@@ -564,7 +574,7 @@ for (const node of nodes) {
564574
<!doctype html>
565575
<meta charset=utf8>
566576
<title>Hello</title>
567-
<link rel=stylesheet href=https://esm.sh/@wooorm/starry-night@2/style/both.css>
577+
<link rel=stylesheet href=https://esm.sh/@wooorm/starry-night@2/style/both>
568578
<body>
569579
<h1>Hello</h1>
570580
<p>…world!</p>
@@ -997,21 +1007,21 @@ The shipped themes are as follows:
9971007

9981008
| name | Includes light scheme | Includes dark scheme |
9991009
| - | - | - |
1000-
| [`core.css`](style/core.css) | | |
1001-
| [`light.css`](style/light.css) || |
1002-
| [`dark.css`](style/dark.css) | ||
1003-
| [`both.css`](style/both.css) |||
1004-
| [`colorblind-light.css`](style/colorblind-light.css) || |
1005-
| [`colorblind-dark.css`](style/colorblind-dark.css) | ||
1006-
| [`colorblind.css`](style/colorblind.css) |||
1007-
| [`dimmed-dark.css`](style/dimmed-dark.css) | ||
1008-
| [`dimmed.css`](style/dimmed.css) |||
1009-
| [`high-contrast-light.css`](style/high-contrast-light.css) || |
1010-
| [`high-contrast-dark.css`](style/high-contrast-dark.css) | ||
1011-
| [`high-contrast.css`](style/high-contrast.css) |||
1012-
| [`tritanopia-light.css`](style/tritanopia-light.css) || |
1013-
| [`tritanopia-dark.css`](style/tritanopia-dark.css) | ||
1014-
| [`tritanopia.css`](style/tritanopia.css) |||
1010+
| [`@wooorm/starry-night/style/core`](style/core.css) | | |
1011+
| [`@wooorm/starry-night/style/light`](style/light.css) || |
1012+
| [`@wooorm/starry-night/style/dark`](style/dark.css) | ||
1013+
| [`@wooorm/starry-night/style/both`](style/both.css) |||
1014+
| [`@wooorm/starry-night/style/colorblind-light`](style/colorblind-light.css) || |
1015+
| [`@wooorm/starry-night/style/colorblind-dark`](style/colorblind-dark.css) | ||
1016+
| [`@wooorm/starry-night/style/colorblind`](style/colorblind.css) |||
1017+
| [`@wooorm/starry-night/style/dimmed-dark`](style/dimmed-dark.css) | ||
1018+
| [`@wooorm/starry-night/style/dimmed`](style/dimmed.css) |||
1019+
| [`@wooorm/starry-night/style/high-contrast-light`](style/high-contrast-light.css) || |
1020+
| [`@wooorm/starry-night/style/high-contrast-dark`](style/high-contrast-dark.css) | ||
1021+
| [`@wooorm/starry-night/style/high-contrast`](style/high-contrast.css) |||
1022+
| [`@wooorm/starry-night/style/tritanopia-light`](style/tritanopia-light.css) || |
1023+
| [`@wooorm/starry-night/style/tritanopia-dark`](style/tritanopia-dark.css) | ||
1024+
| [`@wooorm/starry-night/style/tritanopia`](style/tritanopia.css) |||
10151025

10161026
## Languages
10171027

script/build.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -549,13 +549,26 @@ await Promise.all(
549549
' */',
550550
'',
551551
...list.map(function (d) {
552-
return 'import ' + scopeToId(d) + ' from "../lang/' + d + '.js"'
552+
return (
553+
'import ' +
554+
scopeToId(d) +
555+
' from "@wooorm/starry-night/' +
556+
d +
557+
'"'
558+
)
553559
}),
554560
'',
555561
'/** @type {ReadonlyArray<Grammar>} */',
556562
'export const grammars = [',
557-
...list.map(function (d) {
558-
return ' ' + scopeToId(d) + ','
563+
...list.flatMap(function (d) {
564+
const useLine = ' ' + scopeToId(d) + ','
565+
566+
return d === 'source.json'
567+
? [
568+
' // @ts-expect-error: TS is wrong, `.json` does not mean JSON.',
569+
useLine
570+
]
571+
: useLine
559572
}),
560573
']',
561574
''

script/preview.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ ${generate(
3131
)}
3232
<p>…add the CSS:</p>
3333
${generate(
34-
`<link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@3/style/both.css">`,
34+
`<link rel="stylesheet" href="https://esm.sh/@wooorm/starry-night@3/style/both">`,
3535
'text.html.basic'
3636
)}
3737
<p>…then to use <code>starry-night</code>:</p>

test.js

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1+
/**
2+
* @typedef {import('@wooorm/starry-night').Grammar} Grammar
3+
*/
4+
15
import assert from 'node:assert/strict'
26
import test from 'node:test'
37
import {toHtml} from 'hast-util-to-html'
4-
import sourceAssembly from './lang/source.assembly.js'
5-
import sourceCss from './lang/source.css.js'
6-
import textPhp from './lang/text.html.php.js'
7-
import textMd from './lang/text.md.js'
8-
import textXml from './lang/text.xml.js'
9-
import textXmlSvg from './lang/text.xml.svg.js'
10-
import {common, createStarryNight} from './index.js'
8+
import sourceAssembly from '@wooorm/starry-night/source.assembly'
9+
import sourceCss from '@wooorm/starry-night/source.css'
10+
import textPhp from '@wooorm/starry-night/text.html.php'
11+
import textMd from '@wooorm/starry-night/text.md'
12+
import textXml from '@wooorm/starry-night/text.xml'
13+
import textXmlSvg from '@wooorm/starry-night/text.xml.svg'
14+
import {common, createStarryNight} from '@wooorm/starry-night'
1115

1216
test('@wooorm/starry-night', async function (t) {
1317
await t.test('should expose the public api', async function () {
14-
assert.deepEqual(Object.keys(await import('./index.js')).sort(), [
18+
assert.deepEqual(Object.keys(await import('@wooorm/starry-night')).sort(), [
1519
'all',
1620
'common',
1721
'createStarryNight'
@@ -157,7 +161,7 @@ test('.flagToScope(flag)', async function (t) {
157161
await t.test(
158162
'should support language names with dots (`.`)',
159163
async function () {
160-
const {default: asn} = await import('./lang/source.asn.js')
164+
const {default: asn} = await import('@wooorm/starry-night/source.asn')
161165
const starryAsn = await createStarryNight([asn])
162166

163167
assert.equal(starryAsn.flagToScope('asn.1'), 'source.asn')
@@ -167,7 +171,7 @@ test('.flagToScope(flag)', async function (t) {
167171
await t.test(
168172
'should support language names with number signs (`#`)',
169173
async function () {
170-
const {default: cs} = await import('./lang/source.cs.js')
174+
const {default: cs} = await import('@wooorm/starry-night/source.cs')
171175
const starryCs = await createStarryNight([cs])
172176

173177
assert.equal(starryCs.flagToScope('c#'), 'source.cs')
@@ -177,7 +181,7 @@ test('.flagToScope(flag)', async function (t) {
177181
await t.test(
178182
'should support language names with plusses (`+`)',
179183
async function () {
180-
const {default: cpp} = await import('./lang/source.c++.js')
184+
const {default: cpp} = await import('@wooorm/starry-night/source.c++')
181185
const starryCpp = await createStarryNight([cpp])
182186

183187
assert.equal(starryCpp.flagToScope('c++'), 'source.c++')
@@ -187,7 +191,7 @@ test('.flagToScope(flag)', async function (t) {
187191
await t.test(
188192
'should support language names with asterisks (`*`)',
189193
async function () {
190-
const {default: fStar} = await import('./lang/source.fstar.js')
194+
const {default: fStar} = await import('@wooorm/starry-night/source.fstar')
191195
const starryFStar = await createStarryNight([fStar])
192196

193197
assert.equal(starryFStar.flagToScope('f*'), 'source.fstar')
@@ -197,7 +201,7 @@ test('.flagToScope(flag)', async function (t) {
197201
await t.test(
198202
"should support language names with apostrophes (`'`)",
199203
async function () {
200-
const {default: capnp} = await import('./lang/source.capnp.js')
204+
const {default: capnp} = await import('@wooorm/starry-night/source.capnp')
201205
const starryCapnp = await createStarryNight([capnp])
202206

203207
assert.equal(starryCapnp.flagToScope("cap'n-proto"), 'source.capnp')
@@ -207,7 +211,7 @@ test('.flagToScope(flag)', async function (t) {
207211
await t.test(
208212
'should support language names with parens (`(`, `)`)',
209213
async function () {
210-
const {default: dot} = await import('./lang/source.dot.js')
214+
const {default: dot} = await import('@wooorm/starry-night/source.dot')
211215
const starryDot = await createStarryNight([dot])
212216

213217
assert.equal(starryDot.flagToScope('graphviz-(dot)'), 'source.dot')
@@ -217,8 +221,10 @@ test('.flagToScope(flag)', async function (t) {
217221
await t.test(
218222
'should support language names with slashes (`/`)',
219223
async function () {
220-
const {default: json} = await import('./lang/source.json.js')
221-
const starryJson = await createStarryNight([json])
224+
const {default: json} = await import('@wooorm/starry-night/source.json')
225+
// @ts-expect-error: TS is wrong, it doesn’t understand that `.json` is not an extension.
226+
const grammar = /** @type {Grammar} */ (json)
227+
const starryJson = await createStarryNight([grammar])
222228

223229
assert.equal(starryJson.flagToScope('max/msp'), 'source.json')
224230
}

0 commit comments

Comments
 (0)