{"_id":"@amoklab/bookmark-parser","_rev":"3-c03a4999daefcebe9569236c1a7b5ebc","name":"@amoklab/bookmark-parser","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@amoklab/bookmark-parser","version":"0.0.1","keywords":[],"author":"leangseu","license":"MIT","_id":"@amoklab/bookmark-parser@0.0.1","maintainers":[{"name":"lseu","email":"kimleangseu@gmail.com"}],"dist":{"shasum":"035478d6a3810f7cc707be6e69434f60626896b2","tarball":"https://registry.npmjs.org/@amoklab/bookmark-parser/-/bookmark-parser-0.0.1.tgz","fileCount":3,"integrity":"sha512-/2OIIUTUwRVOAFe1FD3yb4pdm+K5Zd8nmJV7wE528cnj9ZjrJzHFB81aVbhvbJJ0Y9Xc2HXcNf4z0XRe5D60uQ==","signatures":[{"sig":"MEYCIQCQ1B1kKoIDJrkq1YvBQrGPoHgKZc8i/zS/QkQPgme9ygIhALJ9mknJ39Sd9odiX2+fmkrdvljjgZLKxeTCJ0jeErQo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8058},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.mjs"}},"scripts":{"dev":"tsup --watch --sourcemap --dts","lint":"eslint 'src/**/*.ts' 'test/**/*.ts' 'tsup.config.ts'","test":"vitest run","build":"tsup","format":"prettier --write 'src/**/*.{ts,tsx}' 'src/index.ts' 'test/**/*.ts' 'tsup.config.ts'","build:tsc":"tsc -p tsconfig.json"},"_npmUser":{"name":"lseu","email":"kimleangseu@gmail.com"},"repository":{"url":"https://github.com/AmokLab/bookmark-parser.git","type":"git"},"description":"Bookmark parser","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.4.1","vitest":"^4.1.8","prettier":"^3.8.4","typescript":"~6.0.3","@types/node":"^25.9.2","@typescript-eslint/parser":"^8.61.0","@typescript-eslint/eslint-plugin":"^8.61.0","prettier-plugin-organize-imports":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/bookmark-parser_0.0.1_1781238645517_0.23326965811017475","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@amoklab/bookmark-parser","version":"0.0.2","keywords":[],"author":"leangseu","license":"MIT","_id":"@amoklab/bookmark-parser@0.0.2","maintainers":[{"name":"lseu","email":"kimleangseu@gmail.com"}],"dist":{"shasum":"6fe404fb05ac3160845f245d2228aaffe5c9e30c","tarball":"https://registry.npmjs.org/@amoklab/bookmark-parser/-/bookmark-parser-0.0.2.tgz","fileCount":4,"integrity":"sha512-jDx3jfwBa2P+bbl7o82eYqA4MZ+j4CtVA0jzR1dAQiZA/MmuJndK//KTGwqZHxOognFl8dXatrMj3UH5KDymEA==","signatures":[{"sig":"MEUCIADNztGg3AQjbi9Fijg32jBLu3q6fH7YNO9iOMF1w9/WAiEA81fgqDzsfXyguh7fTz+fB2qGf/4ioYo/aUlmK1vERgs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12916},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","default":"./dist/index.mjs","require":"./dist/index.mjs"}},"scripts":{"dev":"tsup --watch --sourcemap --dts","lint":"eslint 'src/**/*.ts' 'test/**/*.ts' 'tsup.config.ts'","test":"vitest run","build":"tsup","format":"prettier --write 'src/**/*.{ts,tsx}' 'src/index.ts' 'test/**/*.ts' 'tsup.config.ts'"},"_npmUser":{"name":"lseu","email":"kimleangseu@gmail.com"},"repository":{"url":"https://github.com/AmokLab/bookmark-parser.git","type":"git"},"description":"Bookmark parser","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.4.1","vitest":"^4.1.8","prettier":"^3.8.4","typescript":"~6.0.3","@types/node":"^25.9.2","@typescript-eslint/parser":"^8.61.0","@typescript-eslint/eslint-plugin":"^8.61.0","prettier-plugin-organize-imports":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/bookmark-parser_0.0.2_1781294135617_0.4198037865086779","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@amoklab/bookmark-parser","version":"0.0.3","description":"Bookmark parser","repository":{"type":"git","url":"git+https://github.com/AmokLab/bookmark-parser.git"},"exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","require":"./dist/index.mjs","default":"./dist/index.mjs"}},"sideEffects":false,"devDependencies":{"@types/node":"^25.9.2","@typescript-eslint/eslint-plugin":"^8.61.0","@typescript-eslint/parser":"^8.61.0","eslint":"^10.4.1","prettier":"^3.8.4","prettier-plugin-organize-imports":"^4.3.0","tsup":"^8.5.1","typescript":"~6.0.3","vitest":"^4.1.8"},"keywords":[],"author":{"name":"leangseu"},"license":"MIT","publishConfig":{"access":"public"},"scripts":{"dev":"tsup --watch --sourcemap --dts","build":"tsup","test":"vitest run","lint":"eslint 'src/**/*.ts' 'test/**/*.ts' 'tsup.config.ts'","format":"prettier --write 'src/**/*.{ts,tsx}' 'src/index.ts' 'test/**/*.ts' 'tsup.config.ts'"},"_id":"@amoklab/bookmark-parser@0.0.3","bugs":{"url":"https://github.com/AmokLab/bookmark-parser/issues"},"homepage":"https://github.com/AmokLab/bookmark-parser#readme","_integrity":"sha512-oeX4j65XkuLyD3ZP0+Un++w8/t+MprAwjosbOqGRQy501uLhNVFHtUfQPj3/e9dOw2kAHEzoJfNqestVojMxgQ==","_resolved":"/tmp/d4eb6ddee78b4caacc8edaca9e0290f6/amoklab-bookmark-parser-0.0.3.tgz","_from":"file:amoklab-bookmark-parser-0.0.3.tgz","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-oeX4j65XkuLyD3ZP0+Un++w8/t+MprAwjosbOqGRQy501uLhNVFHtUfQPj3/e9dOw2kAHEzoJfNqestVojMxgQ==","shasum":"903fb973987be0096792a2275cd4a34f35f2411f","tarball":"https://registry.npmjs.org/@amoklab/bookmark-parser/-/bookmark-parser-0.0.3.tgz","fileCount":5,"unpackedSize":14086,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICsOk/gloMpBQwaV4LJARlPlvBwQ2Wy916jrmVwHW3exAiBUNkyGnJCTzJosq5aLYdV4LHVfDLMXYLJyoCkC5RTAfg=="}]},"_npmUser":{"name":"lseu","email":"kimleangseu@gmail.com"},"directories":{},"maintainers":[{"name":"lseu","email":"kimleangseu@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bookmark-parser_0.0.3_1781536823420_0.7410508789616088"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-12T04:30:45.282Z","modified":"2026-06-15T15:20:23.704Z","0.0.1":"2026-06-12T04:30:45.666Z","0.0.2":"2026-06-12T19:55:35.750Z","0.0.3":"2026-06-15T15:20:23.558Z"},"author":{"name":"leangseu"},"license":"MIT","keywords":[],"repository":{"type":"git","url":"git+https://github.com/AmokLab/bookmark-parser.git"},"description":"Bookmark parser","maintainers":[{"name":"lseu","email":"kimleangseu@gmail.com"}],"readme":"# bookmark-parser\n\nZero dependency bookmark parser exports into a shared bookmark node array.\n\n## Install\n\n```bash\npnpm add @amoklab/bookmark-parser\n```\n\n## API\n\nThe package exports:\n\n- `htmlBookmarkParser(text, options?)`\n- `jsonBookmarkParser(text, options?)`\n- `flattenBookmark(nodes, options?)`\n- `BookmarkEntry`\n- `BookmarkFolder`\n- `BookmarkNode`\n- `ParserOptions`\n\n## Data model\n\nAll parsers return the same node shape:\n\n- `BookmarkFolder` for folders\n- `BookmarkEntry` for links\n- `BookmarkNode` for either one\n\nFolders keep their nested `children`. Both folders and bookmarks can keep a `prevNode` chain for tree navigation.\nThe parsers return only the export's bookmark children, not a synthetic root node.\n\n## `jsonBookmarkParser`\n\nParses the Firefox JSON export format.\n\n```ts\nimport { jsonBookmarkParser } from '@amoklab/bookmark-parser';\n\nconst bookmarks = jsonBookmarkParser(firefoxJsonText);\nconst flattened = jsonBookmarkParser(firefoxJsonText, {\n  flatten: true,\n});\n```\n\nThe parser expects a Firefox bookmarks JSON export and returns the top-level bookmark nodes.\n\n## `htmlBookmarkParser`\n\nParses Netscape bookmark HTML exports produced by both Chrome and Firefox.\n\n```ts\nimport { htmlBookmarkParser } from '@amoklab/bookmark-parser';\n\nconst bookmarks = htmlBookmarkParser(bookmarksHtmlText);\nconst flattened = htmlBookmarkParser(bookmarksHtmlText, {\n  flatten: true,\n});\n```\n\n### Options\n\n`ParserOptions` is accepted by the parsers:\n\n```ts\nexport interface ParserOptions {\n  flatten?: boolean;\n  setPrevNode?: (node: BookmarkNode) => any;\n}\n```\n\n- `flatten`: when `true`, parsers return a flattened bookmark array\n- `setPrevNode`: optional hook that transforms the `prevNode` object used during parsing flattening\n\n`flattenBookmark(nodes, options?)` accepts the `setPrevNode` hook only and still returns a flat preorder list.\n","readmeFilename":"README.md","homepage":"https://github.com/AmokLab/bookmark-parser#readme","bugs":{"url":"https://github.com/AmokLab/bookmark-parser/issues"}}