Skip to content

Commit

Permalink
feat: fix publishing of manifests (#35)
Browse files Browse the repository at this point in the history
Updates the publish flow a little so we no longer rely on importing JSON
files.

Instead, we use sync FS calls to read the files at runtime. This will be
slower I imagine, but means we can ship one copy of the manifests.
  • Loading branch information
43081j authored Jun 26, 2024
1 parent 550baf3 commit 1918aac
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 31 deletions.
18 changes: 6 additions & 12 deletions manifests/native.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,15 @@
"type": "native",
"moduleName": "hasown",
"nodeVersion": "0.10.0",
"replacement":
"Object.prototype.hasOwnProperty.call(obj, prop) (or in later versions of node, \"Object.hasOwn(obj, prop)\")",
"replacement": "Object.prototype.hasOwnProperty.call(obj, prop) (or in later versions of node, \"Object.hasOwn(obj, prop)\")",
"mdnPath": "Global_Objects/Object/hasOwnProperty",
"category": "native"
},
{
"type": "native",
"moduleName": "has-own-prop",
"nodeVersion": "0.10.0",
"replacement":
"Object.prototype.hasOwnProperty.call(obj, prop) (or in later versions of node, \"Object.hasOwn(obj, prop)\")",
"replacement": "Object.prototype.hasOwnProperty.call(obj, prop) (or in later versions of node, \"Object.hasOwn(obj, prop)\")",
"mdnPath": "Global_Objects/Object/hasOwnProperty",
"category": "native"
},
Expand All @@ -102,35 +100,31 @@
"type": "native",
"moduleName": "node.extend",
"nodeVersion": "4.0.0",
"replacement":
"Object.assign, or if deep clones are needed, use structuredClone",
"replacement": "Object.assign, or if deep clones are needed, use structuredClone",
"mdnPath": "Global_Objects/Object/assign",
"category": "native"
},
{
"type": "native",
"moduleName": "extend-shallow",
"nodeVersion": "4.0.0",
"replacement":
"Object.assign, or if deep clones are needed, use structuredClone",
"replacement": "Object.assign, or if deep clones are needed, use structuredClone",
"mdnPath": "Global_Objects/Object/assign",
"category": "native"
},
{
"type": "native",
"moduleName": "xtend",
"nodeVersion": "4.0.0",
"replacement":
"Object.assign, or if deep clones are needed, use structuredClone",
"replacement": "Object.assign, or if deep clones are needed, use structuredClone",
"mdnPath": "Global_Objects/Object/assign",
"category": "native"
},
{
"type": "native",
"moduleName": "defaults",
"nodeVersion": "4.0.0",
"replacement":
"Object.assign, or if deep clones are needed, use structuredClone",
"replacement": "Object.assign, or if deep clones are needed, use structuredClone",
"mdnPath": "Global_Objects/Object/assign",
"category": "native"
},
Expand Down
18 changes: 18 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
"main": "./dist/commonjs/main.js",
"scripts": {
"clean": "rimraf dist",
"prepare": "tshy && npm run build:copy-manifests",
"prepare": "tshy && npm run build:update-manifest-paths",
"format": "prettier --write \"./src/**/*.ts\" \"./manifests/**/*.json\"",
"build:types": "tsc --noEmit",
"build:copy-manifests": "cp -R manifests dist/manifests",
"build:update-manifest-paths": "node scripts/update-manifests-dist-path.js",
"build": "npm run clean && npm run build:types",
"validate-manifests": "node scripts/validate-manifests.js",
"generate-schema": "node scripts/generate-schema.js"
Expand All @@ -33,6 +33,7 @@
},
"homepage": "https://github.com/es-tooling/module-replacements#readme",
"devDependencies": {
"@types/node": "^20.14.9",
"ajv": "^8.16.0",
"prettier": "^3.2.4",
"rimraf": "^5.0.5",
Expand Down
16 changes: 16 additions & 0 deletions scripts/update-manifests-dist-path.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import {readFile, writeFile} from 'node:fs/promises';
import {fileURLToPath} from 'node:url';
import * as path from 'node:path';

const scriptDir = fileURLToPath(new URL('.', import.meta.url));
const distPath = path.resolve(scriptDir, '../dist');
const flavours = ['esm', 'commonjs']

for (const flavour of flavours) {
const flavourPath = `${distPath}/${flavour}/manifests-dir.js`;
const contents = await readFile(flavourPath, 'utf8');
await writeFile(flavourPath, contents.replaceAll(
'../manifests',
'../../manifests'
));
}
23 changes: 12 additions & 11 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import native from '../manifests/native.json';
import microUtils from '../manifests/micro-utilities.json';
import preferred from '../manifests/preferred.json';
import {readFileSync} from 'node:fs';
import {ManifestModule} from './types.js';
import {manifestsDir} from './manifests-dir.js';

const nativeReplacements = native as ManifestModule;
const microUtilsReplacements = microUtils as ManifestModule;
const preferredReplacements = preferred as ManifestModule;
const nativeReplacements = JSON.parse(
readFileSync(`${manifestsDir}/native.json`, 'utf8')
) as ManifestModule;
const microUtilsReplacements = JSON.parse(
readFileSync(`${manifestsDir}/micro-utilities.json`, 'utf8')
) as ManifestModule;
const preferredReplacements = JSON.parse(
readFileSync(`${manifestsDir}/preferred.json`, 'utf8')
) as ManifestModule;

export * from './types.js';

export {
nativeReplacements,
microUtilsReplacements,
preferredReplacements
};
export {nativeReplacements, microUtilsReplacements, preferredReplacements};

export const all: ManifestModule = {
moduleReplacements: [
Expand Down
4 changes: 4 additions & 0 deletions src/manifests-dir-cjs.cts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import * as path from 'node:path';

const currentDir = __dirname;
export const manifestsDir = path.resolve(currentDir, '../manifests');
6 changes: 6 additions & 0 deletions src/manifests-dir.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import {fileURLToPath} from 'node:url';
import * as path from 'node:path';

// @ts-ignore filthy cjs/esm polyfill hacks so we can have import.meta
const currentDir = fileURLToPath(new URL('.', import.meta.url));
export const manifestsDir = path.resolve(currentDir, '../manifests');
9 changes: 5 additions & 4 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@ export interface NoModuleReplacement extends ModuleReplacementLike {
type: 'none';
}

export type ModuleReplacement = DocumentedModuleReplacement |
NativeModuleReplacement |
SimpleModuleReplacement |
NoModuleReplacement;
export type ModuleReplacement =
| DocumentedModuleReplacement
| NativeModuleReplacement
| SimpleModuleReplacement
| NoModuleReplacement;

export interface ManifestModule {
moduleReplacements: ModuleReplacement[];
Expand Down
3 changes: 1 addition & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
"target": "es2020",
"module": "nodenext",
"moduleResolution": "nodenext",
"resolveJsonModule": true,
"types": [],
"types": ["node"],
"declaration": true,
"isolatedModules": true,
"forceConsistentCasingInFileNames": true,
Expand Down

0 comments on commit 1918aac

Please sign in to comment.